此链接: https://msdn.microsoft.com/en-us/vba/outlook-vba/articles/syncobjects-item-method-outlook 没有解释。例如,SyncObjects.Item(1) 是什么意思?我可以举一个实际的例子吗?SyncObjects.Item(1) 对应于我的文件夹(电子邮件地址)中的第一个文件夹还是 Outlook 中绝对路径中的第一个文件夹?
答案1
你正在发现集合类。一个这样的类是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.Item(1) 对应的是“我的文件夹”(电子邮件地址)中的第一个文件夹还是 Outlook 中绝对文件夹中的第一个文件夹?
这应该无关紧要:集合的整个目的是封装一组对象并允许迭代它们。实现无法保证哪个特定对象是第一个、第二个、第三个或最后一个:您可以使用各个项目的属性(例如Name
)来找出SyncObject
您正在查看的特定对象,而不是它在集合中的索引。
Dim current As SyncObject
For Each current In Application.GetNameSpace("MAPI").SyncObjects
Debug.Print current.Name
Next