この問題と同様に、VBA でオブジェクトを使用するScripting.Dictionary
場合、以下のコードの結果は予期しないものになります。
Option Explicit
Sub test()
Dim d As Variant
Dim i As Integer
Dim s As String
Set d = CreateObject("Scripting.Dictionary")
d.Add "a", "a"
Debug.Print d.Count ' Prints '1' as expected
For i = 1 To d.Count
s = d.Item(i)
Debug.Print s ' Prints ' ' (null) instead of 'a'
Next i
Debug.Print d.Count ' Prints '2' instead of '1'
End Sub
ゼロから始まるインデックスを使用すると、同じ結果が得られます。
For i = 0 To d.Count - 1
s = d.Item(i)
Debug.Print s
Next i
オブジェクトを見ると、実際には 2 つのアイテムがあることがわかります。新しく追加されたキーは1
、 から追加されたようにi
です。このループをより大きな数に増やすと、ディクショナリ内の項目の数がループごとに 1 回ずつ増えます。
Office/VBA 2003、2010、および 2013 でこれをテストしました。すべて同じ動作を示し、他のバージョン (2007) も同様であると予想します。
他のループ メソッドを使用してこれを回避できますが、オブジェクトを格納しようとしているときに不意を突かれ、その行でオブジェクトの予期されたエラーs = d.Item(i)
が発生しました。
記録のために、私は次のようなことができることを知っています:
For Each v In d.Keys
Set o = d.item(v)
Next v
しかし、なぜアイテムを番号で反復できないように見えるのか、もっと興味があります。