Zapętlanie za pomocą Scripting.Dictionary za pomocą numeru indeksu / elementu

Podobny doten przypadek, gdy używasz aScripting.Dictionary obiekt w VBA, wynik poniższego kodu jest nieoczekiwany.

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

Korzystając z indeksu opartego na zerach, uzyskuje się ten sam wynik:

For i = 0 To d.Count - 1
    s = d.Item(i)
    Debug.Print s
Next i

Obserwując obiekt, widzę, że ma on dwa elementy, kluczem dla nowo dodanego jest1, jak dodano zi. Jeśli zwiększę tę pętlę do większej liczby, liczba elementów w słowniku zostanie zwiększona, raz dla każdej pętli.

Przetestowałem to w Office / VBA 2003, 2010 i 2013. Wszystkie wykazują to samo zachowanie i oczekuję, że inne wersje (2007) również będą.

Mogę to obejść za pomocą innych metod zapętlania, ale to mnie zaskoczyło, gdy próbowałem przechowywać obiekty i otrzymywałemobiekt oczekiwany błąd nas = d.Item(i) linia.

Dla przypomnienia, wiem, że mogę robić takie rzeczy:

For Each v In d.Keys
    Set o = d.item(v)
Next v

Ale jestem bardziej ciekawy, dlaczego nie wydaje mi się, aby przeglądać elementy według numeru.

questionAnswers(3)

yourAnswerToTheQuestion