挂起联系人项目查询的Outlook通讯组列表

时间:2014-11-20 22:50:05

标签: vba outlook-vba

我正在从一些tutorial on MSDN开始学习为Outlook制作一些宏。我有这个子例程挂起Type mismatch错误。在StopResume之后逐步执行错误处理后,它会返回Next并完成查询。

查看立即中的结果集,缺少一个项目,实际上是分发邮件列表而不是正常联系人。我将邮件列表从我的联系人中移出进行测试,但错误没有发生。

我也计划有其他邮件列表,因为这是为了工作。除了将它们保存在其他地方之外,是否有某种方法可以逃避它?

以下是代码:

Sub ContactName()

    On Error GoTo ErrHandler

    Dim ContactsFolder As Folder
    Set ContactsFolder = Session.GetDefaultFolder(olFolderContacts)
    MsgBox ("Contacts found: " & ContactsFolder.Items.Count)

    Dim Contact As ContactItem
    For Each Contact In ContactsFolder.Items
        Debug.Print Contact.CompanyName
    Next
    Exit Sub

ErrHandler:
    Debug.Print Err.Description
    Stop
    Resume

End Sub

2 个答案:

答案 0 :(得分:4)

Dim Contact As ContactItem
For Each Contact In ContactsFolder.Items
    Debug.Print Contact.CompanyName
Next

当你定义Contact as ContactItem时,你正在告诉VBA 它应该在Items中找到什么类型的东西。只有当ContactsFolder中的所有项目都是ContactItems时,这才有用。

换句话说,你是专门经历一个包中的所有项目,但具体地说每个项目都是Apple - 但是当你遇到Irange时,VBA会抛出错误。

在这种情况下我通常做的不是说我想要把所有的苹果放在一个袋子里,我想要在包里找到每个项目,所以像这样:

Dim mContact 'by not dimensioning it you basically allow mContact to become whatever type each item is 
For Each mContact In ContactsFolder.Items
    Debug.Print mContact.CompanyName
Next

请注意,我将您的名称更改为mContact,因为可能Contact是VBA中的关键字,有时候最好不要处理此问题。

上面的内容仍然会导致错误,因为任何mContact都没有.CompanyName属性。

您可以做的是:

Dim mContact 
For Each mContact In ContactsFolder.Items
    if mContact.Class = olContact then
        Debug.Print mContact.CompanyName
    Else
        Debug.Print "Not a Contact! Actually a :" & typename(mContact)
    End if
Next

这将检查您正在迭代的对象(袋中的水果)是否实际上是“苹果”,如果没有,请告诉您它是什么类型的水果。

答案 1 :(得分:3)

为了区分列表和联系人,您可以将代码更改为以下内容:

Sub ContactName()

On Error GoTo ErrHandler

Dim ContactsFolder As Folder
Set ContactsFolder = Session.GetDefaultFolder(olFolderContacts)
MsgBox ("Contacts found: " & ContactsFolder.Items.Count)

Dim Contact As ContactItem
Dim distList As DistListItem
Dim i As Integer

For i = 1 To ContactsFolder.Items.Count

    If TypeOf ContactsFolder.Items(i) Is DistListItem Then
      Set distList = ContactsFolder.Items(i)
      Debug.Print distList.DLName
    ElseIf TypeOf ContactsFolder.Items(i) Is ContactItem Then
      Set contact = ContactsFolder.Items(i)
      Debug.Print contact.FullName
    Else
      Debug.Print "Item is something else"
    End If

Next i
Exit Sub

ErrHandler:
    Debug.Print Err.Description
    Stop
    Resume

End Sub

注意,我将我正在从CompanyName访问的属性更改为FullName用于我的测试,因为我的所有联系人都没有CompanyName。