エクセル関数のSUMIFSをVBAを使って高速処理したいです。
”抽出”シートと”集計”シートがあります。
”抽出”シートは下図のようになっています。
項目は「カテゴリ」、「部品」、「保管場所」、「推定在庫」、「実在庫」となっています。
処理結果は下図にようにしたいです。
「カテゴリ」は複数あります。違うカテゴリに同じ部品が入っている場合があります。
「カテゴリ」は5つくらいです。
「部品」は10万くらいあります。
SUMIFSを使うとかなり時間が掛かります。
「計」欄は数式(SUM)を残したいです。
以前教えていただいたコードは配列(Dictionary)を使うものでした。
在庫の種類が1種類であれば、可能なのですが、2種類になると分からなくなってしまいました。
コードを教えて下さい。
以前のコード
「集計」シートに縦軸に部品、横軸にカテゴリ、中の数字が足し算した結果が表示されています。
Public Sub サンプル() Dim dic As Object, dicE As Object Dim vA As Variant, vK As Variant, v As Variant Dim i As Long, j As Long, k As Long Dim LINE As Integer Set dic = CreateObject("Scripting.Dictionary") Set dicE = CreateObject("Scripting.Dictionary") With Worksheets("抽出") With .Range("A1", .Cells(Rows.Count, "A").End(xlUp)) vA = .Resize(, 4).Value End With End With For i = 2 To UBound(vA) If (Not dic.Exists(vA(i, 2))) Then dic.Add vA(i, 2), CreateObject("Scripting.Dictionary") End If dic(vA(i, 2))(vA(i, 1)) = dic(vA(i, 2))(vA(i, 1)) + vA(i, 4) dicE(vA(i, 1)) = Empty Next ReDim vA(1 To dic.Count + 5, 1 To dicE.Count + 1) v = mySort(dicE.Keys) For i = 0 To UBound(v) j = i + 2 vA(1, j) = v(i) dicE(v(i)) = j If (j > 2) Then vA(3, j) = vA(3, j - 1) vA(4, j) = vA(4, j - 1) End If Next i = 6 For Each vK In mySort(dic.Keys) vA(i, 1) = vK For Each v In dic(vK).Keys vA(i, dicE(v)) = dic(vK)(v) Next i = i + 1 Next Application.ScreenUpdating = False With Worksheets("集計") .Cells.Delete With .Range("A1").Resize(UBound(vA), UBound(vA, 2)) .Value = vA End With .Activate End With Range("A1") = "カテゴリ" Range("B1") = "部品" Application.ScreenUpdating = True Set dic = Nothing Set dicE = Nothing MsgBox "終了しました" End Sub Private Function mySort(ByVal vA As Variant) As Variant Dim v As Variant Dim i As Long, j As Long For i = LBound(vA) To UBound(vA) - 1 For j = i + 1 To UBound(vA) If (vA(i) > vA(j)) Then v = vA(i) vA(i) = vA(j) vA(j) = v End If Next Next mySort = vA End Function
回答1件
あなたの回答
tips
プレビュー