派遣事務員の迷走

派遣事務員コロ子。会社の犬。顔出しNG。常に迷走している。

VBA Dictionaryオブジェクトのアイテムが複数欲しい(Dictionaryオブジェクト配列編)

こんにちは。
派犬事務員のコロ子です。

前回「Dictionaryオブジェクトのアイテムが複数欲しい!」という記事を書いたら「Dictionaryオブジェクトを配列にすればよい」と教わった。

前回はクラスで変数を作る方法でしのいだ
koroko.hatenablog.com


Dictionaryオブジェクトを配列??にするのですか!!!
む、むずい。
頭の中ぐるぐる混乱。

社名をキーにして、各商品の金額をアイテムに入れて合計を集計したい。
Dictionaryオブジェクトを3個作って列ごとに集計するイメージでいいのでしょうか?

f:id:SNegishi:20210330223631p:plain

Infomentさんのブログを見ながら作成してみた。
infoment.hatenablog.com

Enum 列名
    社名 = 1
    商品A
    商品B
    商品C
End Enum

Sub test1()

Dim dic(列名.商品A To 列名.商品C) As Dictionary
Dim c As Long

For c = 列名.商品A To 列名.商品C

    Set dic(c) = New Dictionary
    
    Dim r As Long
    For r = 2 To Cells(Rows.Count, 1).End(xlUp).Row
    
        Dim dickey As String
        dickey = Cells(r, 列名.社名)

        dic(c)(dickey) = dic(c)(dickey) + Cells(r, c)

    Next r
    
Next c

'確認
For c = 列名.商品A To 列名.商品C

    Dim buf As Variant
    For Each buf In dic(c).Keys
    
        Debug.Print Cells(1, c), buf, dic(c)(buf)
    
    Next buf

Next c

End Sub

せっかく配列なので、Infomentさんのブログをまねして、元のシートも配列に入れてみよう。

Enum 列名
    社名 = 1
    商品A
    商品B
    商品C
End Enum

Sub TEST2()
Dim arr As Variant
arr = UsedRange.Resize(UsedRange.Rows.Count - 1, UsedRange.Columns.Count).Offset(1, 0)

Dim dic(列名.商品A To 列名.商品C) As Dictionary

Dim c As Long
For c = 列名.商品A To 列名.商品C

    Set dic(c) = New Dictionary
    
    Dim r As Long
    For r = 1 To UBound(arr)
    
        dic(c)(arr(r, 列名.社名)) = dic(c)(arr(r, 列名.社名)) + arr(r, c)

    Next r
    
Next c

'確認
For c = 列名.商品A To 列名.商品C

    Dim buf As Variant
    For Each buf In dic(c).Keys
    
        Debug.Print Cells(1, c), buf, dic(c)(buf)
    
    Next buf

Next c

End Sub

元のシートも配列にするとさらにぐるぐる度が上がる~。
自力では絶対考えつかないなー。
Infomentさん、ExcelVBAerさん、どうもありがとうございました!


【次回】アイテムを配列にする方法↓
koroko.hatenablog.com