Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


5978 / 13646 ツリー ←次へ | 前へ→

【47899】集計の方法で教えて下さい。 質問(煮詰まった) 07/3/26(月) 9:34 質問[未読]
【47900】Re:集計の方法で教えて下さい。 ウッシ 07/3/26(月) 10:36 回答[未読]
【47901】Re:集計の方法で教えて下さい。 質問(煮詰まった) 07/3/26(月) 12:07 お礼[未読]

【47899】集計の方法で教えて下さい。
質問  質問(煮詰まった)  - 07/3/26(月) 9:34 -

引用なし
パスワード
   集計の方法で教えて下さい。

元々のシートが以下のものがあります。
また、更新先のシートも事前に準備したものを利用して
そのセルに各項目を貼り付けしています。

★元
名前    伝票NO  区分1 金額 
あああああ 1111  2   200
いいいいい 2222  △   300
ううううう 3333  △   400
えええええ 1111  △   500
おおおおお 2222  2   600
かかかかか 3333  △   700
ききききき 1111  △   800
くくくくく 2222  △   900
けけけけけ 3333  △   1000


★結果

伝票NO  区分  金額  区分2金額
1111  2   1500  200
2222  2   1800  600
3333  △   2100  0

1.同一伝票NOの場合は金額を加算する。
2.同一伝票NOで区分が△と2の場合は2を優先する。
3.加算した伝票NOの場合で、区分2のものがある場合は
その金額を別のセルに出力する


1.2.の2点は、伝票NO−区分1でソートして伝票NOの
加算でうまくいきましたが
ここは,Dictionaryのコマンドで処理できました。


3.加算した伝票NOの場合で、区分2のものがある場合は
その金額を別のセルに出力するの方法が判らずに


どう処理するべきか悩んでいます。
うまい方法があれば教えて下さいお願いします。

ちなみに取り込み件数は1000件程度あります。

【47900】Re:集計の方法で教えて下さい。
回答  ウッシ  - 07/3/26(月) 10:36 -

引用なし
パスワード
   こんにちは

Sheet1からSheet2として

Sub test()
  Dim v, vv
  Dim i  As Long
  Dim j  As Long
  Dim cntR As Long
  Dim mDic As Object
  Dim s  As String
  Dim c  As Long
  
  With Worksheets("Sheet1")
    v = .Range("A1").CurrentRegion.Value
    cntR = UBound(v, 1)
  End With
  If cntR = 1 Then Exit Sub
  Set mDic = CreateObject("Scripting.Dictionary")
  For i = 2 To cntR
    c = 0: s = ""
    If mDic.Exists(v(i, 2)) Then
      If Val(v(i, 3)) = 2 Then
        If mDic(v(i, 2))(1) <> "2" Then s = "2"
        c = v(i, 4)
      ElseIf mDic(v(i, 2))(1) <> "2" Then
        s = v(i, 3)
      Else
        s = "2"
      End If
      mDic(v(i, 2)) = Array(v(i, 2), s, _
        mDic(v(i, 2))(2) + v(i, 4), mDic(v(i, 2))(3) + c)
    Else
      If Val(v(i, 3)) = 2 Then
        s = "2"
        c = v(i, 4)
      Else
        s = v(i, 3)
      End If
      mDic(v(i, 2)) = Array(v(i, 2), s, v(i, 4), c)
    End If
  Next
  Erase v
  With Worksheets("Sheet2").Range("A1").Resize(mDic.Count + 1, 4)
    .ClearContents
    .Rows(1).Value = Array("伝票NO", "区分", "金額", "区分2金額")
    v = .Value
    i = 2
    For Each vv In mDic.keys
      For j = 0 To 3
        v(i, j + 1) = mDic(vv)(j)
      Next
      i = i + 1
    Next
    .Value = v
  End With
  Set mDic = Nothing: Erase v
End Sub

いまいちのような気がしますけど。

【47901】Re:集計の方法で教えて下さい。
お礼  質問(煮詰まった)  - 07/3/26(月) 12:07 -

引用なし
パスワード
   助かりました。
試して見ます。

5978 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free