Dim A
Set A = CreateObject("Scripting.Dictionary")
b = A.Count '要素をカウントする
では、解説していきます。
Dictionaryの要素数を「Count」で取得する
「Dictionary」の要素数を「Count」で取得してみます。
「Count」で要素数を取得
「Count」で要素数を取得するVBAコードは、こんな感じです。
Sub TEST1()
'辞書を登録
Dim A
Set A = CreateObject("Scripting.Dictionary")
'値を登録する
A.Add "A", "10"
A.Add "B", "20"
A.Add "C", "30"
A.Add "D", "40"
A.Add "E", "50"
'要素をカウントする
Debug.Print A.Count
End Sub
では、実行してみます。
「Count」で要素数を取得
結果は、「5」個となりました。
登録した数は、「5」個なので、正しく取得できています。
要素数分だけループして値を取得する
要素数を取得できれば、要素数分だけループして値を取得することができます。
要素は「0」番目から始まる
要素は「0」番目から始まるので、取得する際に注意です。
要素は「0」番目から始まる
では、要素をループして、要素分の値を取得してみます。
Forを使って「0」から「Count-1」までループする
Forを使って「Count-1」だけループして、「キー」と「アイテム」を取得します。
「キー」と「アイテム」を配列に入力して、値を取得します。
Sub TEST2()
'辞書を登録
Dim A
Set A = CreateObject("Scripting.Dictionary")
'値を登録する
A.Add "A", "10"
A.Add "B", "20"
A.Add "C", "30"
A.Add "D", "40"
A.Add "E", "50"
'キーとアイテムを配列に入力
Dim B, C
B = A.keys
C = A.items
'要素分だけループする
For i = 0 To A.Count - 1
'値を出力
Debug.Print B(i) & " " & C(i)
Next
End Sub
では、実行してみます。
「0」から「Count-1」をループする
「Count-1」だけループして、「キー」と「アイテム」を取得できました。
キーで検索してアイテムの値を取得する
キーで検索してアイテムの値を取得することもできます。
「A.(キー)」で「アイテム」が取得できます。
Sub TEST3()
'辞書を登録
Dim A
Set A = CreateObject("Scripting.Dictionary")
'値を登録する
A.Add "A", "10"
A.Add "B", "20"
A.Add "C", "30"
A.Add "D", "40"
A.Add "E", "50"
'キーを配列に入力
Dim b
b = A.keys
'要素分だけループ
For i = 0 To A.Count - 1
'値を出力
Debug.Print b(i) & " " & A(b(i))
Next
End Sub
では、実行してみます。
キーで検索してアイテムの値を取得
キーで検索してアイテムの値を取得して、「キー」と「アイテム」を取得できました。
アイテムを検索してループしても、速度は変わらないので、好きな方を使うといいです。
「.keys()(i)」と「.items()(i)」でも取得できるけど遅い
ちなみに、「.keys()(i)」と「.items()(i)」でも取得できます。
ただ、この方法は遅いので、使わない方がいいです。
「.keys()(i)」と「.items()(i)」で取得する
「.keys()(i)」と「.items()(i)」で取得するVBAコードです。
Sub TEST4()
'辞書を登録
Dim A
Set A = CreateObject("Scripting.Dictionary")
'値を登録する
A.Add "A", "10"
A.Add "B", "20"
A.Add "C", "30"
A.Add "D", "40"
A.Add "E", "50"
'要素数分だけループ
For i = 0 To A.Count - 1
'値を出力
Debug.Print A.keys()(i) & " " & A.items()(i)
Next
End Sub
Sub TEST5()
t = Timer
'辞書を登録
Dim A
Set A = CreateObject("Scripting.Dictionary")
'値を登録する
For i = 1 To 10001
A.Add i, 0
Next
Dim b
ReDim b(10000, 1)
'要素分だけループ
For i = 0 To A.Count - 1
'配列に入力
b(i, 0) = A.keys()(i)
b(i, 1) = A.items()(i)
Next
Debug.Print Timer - t & " 秒"
End Sub
かかった時間は、「4.203125 秒」となりました。
10001個で、4秒かかっています。
かなり遅いです。
配列に入力して取得する方法で計測
次は、配列に入力して取得する方法で計測してみます。
Sub TEST6()
t = Timer
'辞書を登録
Dim A
Set A = CreateObject("Scripting.Dictionary")
'値を登録する
For i = 1 To 10001
A.Add i, 0
Next
Dim b
ReDim b(10000, 1)
'要素を配列に入力
Dim C, D
C = A.keys
D = A.items
'要素分だけループ
For i = 0 To A.Count - 1
'別の配列に入力
b(i, 0) = C(i)
b(i, 1) = D(i)
Next
Debug.Print Timer - t & " 秒"
End Sub