こんにちは。
派犬事務員のコロ子です。
「Dictionaryオブジェクトのアイテムが複数欲しい!」場合、アイテムを配列にする方法が分かった。
1回目(クラス編)
koroko.hatenablog.com
2回目(Dictionaryオブジェクト配列編)
koroko.hatenablog.com
アイテムを配列にする
Dictionaryオブジェクトのアイテムに配列をいれてみたところ、早速つまずいた。
アイテムに配列をセットして、配列の0番目を書き換えたい。
Sub Sample()
Dim dic As Dictionary
Set dic = New Dictionary
dic.Add "test", Array(10, 20, 30)
dic("test")(0) = 100
Debug.Print dic("test")(0)
Debug.Print dic("test")(1)
Debug.Print dic("test")(2)
End Subイミディエイトウインドウ
10 20 30
dic("test")(0)に100を入れたはずなのに、なぜか10のまま・・・。
どうやらアイテムに入れた配列を書き換えるには、一度外に出して編集して、再度格納する必要があるらしい。
Dim dic As Dictionary
Set dic = New Dictionary
dic.Add "test", Array(10, 20, 30)
dic("test") = Array(100, 200, 300)
Debug.Print dic("test")(0)
Debug.Print dic("test")(1)
Debug.Print dic("test")(2)イミディエイトウインドウ
100 200 300
おお!できた!
しかし、こんなの絶対に分からないよー。どこが間違っているか分からなくて相当悩んだ。(もちろん自力解決できずにノンプロ研で教えてもらった)
理由は「参照してる時は配列のコピーが取得されていて、更新ができないのだと思われる」とのこと。この辺は理解できないので「アイテムの配列はまるごと入れ替える」と覚えよう。
やり方が分かったので、前回の表で集計してみよう。

この表で会社ごとに各商品の金額を合計する。
キー:社名
アイテム(0):商品A
アイテム(1):商品B
アイテム(2):商品C
Enum 項目名
en社名 = 1
en商品A
en商品B
en商品C
End Enum
Sub TEST()
Dim arr() As Long
Dim dic As Dictionary
Set dic = New Dictionary
Dim i As Long
For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
Dim dickey As String
dickey = Cells(i, en社名).Value
If dic.Exists(dickey) Then
Dim sampleA As Long
Dim sampleB As Long
Dim sampleC As Long
'アイテムが配列の場合は一度外に出して計算し、再度格納する
sampleA = dic(dickey)(0) + Cells(i, en商品A)
sampleB = dic(dickey)(1) + Cells(i, en商品B)
sampleC = dic(dickey)(2) + Cells(i, en商品C)
dic(dickey) = Array(sampleA, sampleB, sampleC)
Else
dic.Add dickey, Array(Cells(i, en商品A), Cells(i, en商品B), Cells(i, en商品C))
End If
Next i
'確認
Dim buf As Variant
For Each buf In dic.Keys
Debug.Print dic(buf)(0), dic(buf)(1), dic(buf)(2)
Next
End Subもしかしたら、この方法が一番すっきりして分かりやすいかも!
Infomentさん、ExcelVBAerさん、Tanaka_Hiroakiさん、みなさんどうもありがとうございました!