Эта ссылка:https://msdn.microsoft.com/en-us/vba/outlook-vba/articles/syncobjects-item-method-outlook лишена объяснений. В чем смысл SyncObjects.Элемент (1), например? Могу ли я иметь практический пример? SyncObjects.Пункт (1) соответствует первой папке в моей папке (адрес электронной почты) или первой папке в абсолюте на outlook?
2 ответа
Вы открываете коллекционные классы. Одним из таких классов является класс VBA.Collection
; в Excel вы, вероятно, сталкивались с классом коллекции Workbooks
коллекцией Worksheets
, пользовательскими UserForms
или элементами Controls
; SyncObjects
- просто еще одна такая коллекция.
Все классы коллекции имеют что-то общее. Это классы, что означает, что они представляют объекты, но они также содержат элементы. Некоторые коллекции содержат только один тип объектов (например, Worksheets
Worksheet
содержат только объекты рабочих листов ), другие содержат объекты любого типа.
По соглашению все коллекции основаны на 1, поэтому первый элемент в коллекции будет иметь индекс 1.
Все коллекции могут быть перечислены, то есть повторены с использованием For Each...Next
цикл Они могут сделать это, потому что все они предоставляют скрытый [_NewEnum]
который имеет специальные скрытые атрибуты.
For Each foo In myCollection
Debug.Print foo.Bar
Next
Все коллекции также могут быть проиндексированы, то есть их отдельные элементы могут быть доступны по индексу или по некоторому ключу / имени. Это позволяет перебирать коллекцию, используя For...Next
цикл - и вот тут начинается свойство Item
:
For i = 1 To myCollection.Count
Debug.Print myCollection.Item(i).Bar
Next
Свойство Item
, по соглашению, также является членом класса коллекции по умолчанию (некоторые классы коллекции могут иметь различные члены по умолчанию, например ADODB.Recordset.Fields
) - у него есть специальный скрытый атрибут, который позволяет неявно вызывать этот член, поэтому вы можете его опустить:
For i = 1 To myCollection.Count
Debug.Print myCollection(i).Bar
Next
... и результат точно такой же, как если бы Item
был четко прописан.
Примечание коллекция хочет итерироваться с
For Each...Next
цикл Доступ к элементам коллекции по индексу всегда будет медленнее, чем использование скрытого[_NewEnum]
. И разница замечательная .
Для классов коллекции удобно неявно вызывать этот элемент по умолчанию - однако другие (не коллекции) классы также могут иметь члены по умолчанию, и неявное их вызов является распространенным источником ошибок, потому что код не выполняет то, что говорит, и / или сказать, что он делает.
Что я говорю с пунктом (1), пунктом (2), пунктом (3) и т.д.?
.Item(1)
гласит:"дай мне первый предмет в коллекции". В случае SyncObjects
каждый элемент является объектом SyncObject
, поэтому вы должны получить этот элемент с помощью ключевого слова Set
:
Set firstItem = syncList.Item(1)
SyncObjects.Пункт (1) соответствует первой папке в моей папке (адрес электронной почты) или первой папке в абсолюте на outlook?
Это не должно иметь значения: весь смысл коллекции заключается в инкапсуляции группы объектов и возможности их повторения. Какой конкретный объект является первым, вторым, третьим или последним, не гарантируется реализацией: вы бы использовали свойства отдельных элементов (например, Name
), чтобы узнать, какой конкретный SyncObject
вы просматриваете, а не его индекс в Коллекция.
Dim current As SyncObject
For Each current In Application.GetNameSpace("MAPI").SyncObjects
Debug.Print current.Name
Next