Circulando por um Scripting.Dictionary usando o número do índice / item

Igual aesse problema, ao usar umScripting.Dictionary objeto no VBA, o resultado do código abaixo é inesperado.

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

Usando um índice baseado em zero, o mesmo resultado é alcançado:

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

Observando o objeto, eu posso realmente ver que ele tem dois itens, a chave para o recém-adicionado é1, como adicionado dei. Se eu aumentar esse loop para um número maior, o número de itens no dicionário será aumentado, uma vez para cada loop.

Eu testei isso no Office / VBA 2003, 2010 e 2013. Todos exibem o mesmo comportamento, e espero que outras versões (2007) também.

Eu posso contornar isso com outros métodos de loop, mas isso me pegou desprevenido quando eu estava tentando armazenar objetos e estava recebendo umerro esperado do objeto nos = d.Item(i) linha.

Para o registro, eu sei que posso fazer coisas assim:

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

Mas eu estou mais curioso sobre porque eu não consigo interagir com os itens por número.

questionAnswers(4)

yourAnswerToTheQuestion