Você está descobrindo classes de coleções . Uma dessas classes é a classe VBA.Collection
; no Excel, você provavelmente encontrou a classe de coleção Workbooks
ou a coleção Worksheets
ou UserForms
ou Controls
; SyncObjects
é apenas outra coleção desse tipo.
Todas as classes de coleções têm algo em comum. Eles são classes, o que significa que eles representam objetos - mas eles também contêm itens . Algumas coleções contêm apenas um tipo de objeto (por exemplo, Worksheets
contém apenas Worksheet
objects), outras contêm qualquer tipo de objeto.
Por convenção, todas as coleções são baseadas em 1, então o primeiro item da coleção estará no índice 1.
Todas as coleções podem ser enumeradas - isto é, iteradas usando um loop For Each...Next
. Eles podem fazer isso porque todos eles expõem um membro [_NewEnum]
oculto que possui atributos ocultos especiais.
For Each foo In myCollection
Debug.Print foo.Bar
Next
Todas as coleções também podem ser indexadas - isto é, seus itens individuais podem ser acessados por índice ou por algum tipo de chave / nome. Isso permite iterar uma coleção usando um For...Next
loop - e é aí que a propriedade Item
entra em ação:
For i = 1 To myCollection.Count
Debug.Print myCollection.Item(i).Bar
Next
A propriedade Item
, por convenção, também é a classe de coleção ' membro padrão (algumas classes de coleção podem ter diferentes membros padrão, por exemplo ADODB.Recordset.Fields
) - tem um atributo oculto especial torna possível implicitamente chamar esse membro, então você pode omiti-lo:
For i = 1 To myCollection.Count
Debug.Print myCollection(i).Bar
Next
... e o resultado é exatamente o mesmo que se Item
fosse explicitamente explicitado.
Note collections want to be iterated with a
For Each...Next
loop. Accessing collection items by index is always going to be slower than leveraging the hidden[_NewEnum]
member. And the difference is remarkable.
Para classes de coleção, invocar implicitamente este membro padrão é conveniente - no entanto outras classes (não-coleção) também podem ter membros padrão, e implicitamente invocá-los é uma fonte comum de erros, porque o código não está fazendo o que diz , e / ou dizendo o que faz .
What am I saying with Item(1), Item(2), Item(3), etc.?
O que .Item(1)
está dizendo é "me dê o primeiro item da coleção". No caso de SyncObjects
, cada item é um objeto SyncObject
, para que você recupere esse item com a palavra-chave Set
:
Set firstItem = syncList.Item(1)
SyncObjects.Item(1) corresponds at the first folder in the my folder (email address) or the first folder in absolute on outlook?
Isso deve ser irrelevante: o ponto inteiro de uma coleção é encapsular um grupo de objetos e permitir que eles sejam iterados. Qual objeto específico é o primeiro, o segundo, o terceiro ou o último, não é garantido pela implementação: você usaria as propriedades dos itens individuais (por exemplo, Name
) para descobrir o que você está vendo, SyncObject
específico, não seu índice em uma coleção.
Dim current As SyncObject
For Each current In Application.GetNameSpace("MAPI").SyncObjects
Debug.Print current.Name
Next