-1

Эта ссылка:https://msdn.microsoft.com/en-us/vba/outlook-vba/articles/syncobjects-item-method-outlook лишена объяснений. В чем смысл SyncObjects.Элемент (1), например? Могу ли я иметь практический пример? SyncObjects.Пункт (1) соответствует первой папке в моей папке (адрес электронной почты) или первой папке в абсолюте на outlook?

2 ответа2

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
0

Я нашел ответ, я проверял с

Дим, как строка

попробуй = Outlook.GetNamespace("MAPI").SyncObjects.Элемент (1) в режиме отладки
try равен at: "Tutti gli account"

попробуй = Outlook.GetNamespace("MAPI").SyncObjects.Пункт (2)

равняется по адресу: "Cartelle Applicazioni"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .