Similar a this issue, cuando se utiliza un objeto Scripting.Dictionary
en VBA, el resultado del código siguiente es inesperado.Looping a través de un Scripting.Dictionary utilizando el índice/número de artículo
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
El uso de un índice basado en cero, el mismo resultado se logra:
For i = 0 To d.Count - 1
s = d.Item(i)
Debug.Print s
Next i
Observando el objeto, realmente puedo ver que tiene dos elementos, la clave para el recién añadido es 1
, como se agregó desde i
. Si aumento este ciclo a un número más alto, entonces la cantidad de elementos en el diccionario aumenta, una vez para cada ciclo.
He probado esto en Office/VBA 2003, 2010 y 2013. Todos exhiben el mismo comportamiento, y espero que otras versiones (2007) también lo hagan.
puedo trabajar alrededor de este bucle con otros métodos, pero esto me tomó por sorpresa cuando estaba tratando de almacenar objetos y estaba recibiendo un error esperado objeto en la línea s = d.Item(i)
.
Para el registro, sé que puedo hacer cosas como esta:
For Each v In d.Keys
Set o = d.item(v)
Next v
pero estoy más curioso acerca de por qué me parece que no puede iterar a través de los artículos por número.
@assylias Veo eso en la documentación '.Item (Key)' pero también veo '.Key (Key)', aunque no estoy seguro de cómo usar el método 'Key' ... ¿Hay una forma de iterar por número de artículo? – Gaffi