【问题标题】:Outlook distribution list hanging up on contact items queryOutlook 通讯组列表挂断联系人项目查询
【发布时间】:2020-06-23 16:10:26
【问题描述】:

我在 tutorial on MSDN 工作,学习为 Outlook 制作一些宏。我有这个因Type mismatch 错误而挂起的子程序。在StopResume 之后单步执行错误处理时,它会返回到Next 并完成查询。

查看 Immediate 中的结果集,缺少一项实际上是分发邮件列表而不是普通联系人。我将邮件列表从我的联系人中移出进行测试,并且没有发生错误。

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

代码如下:

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

【问题讨论】:

  • 我猜Mailing List 项目不是Contact,因此For Each Contact In ContactsFolder.Items 将由于无法转换为Contact 而失败。一种替代方法是使用FOR 循环而不是FOR EACH。然后您应该能够遍历Items 并测试您拥有的项目类型并在访问其属性之前进行相应的转换。
  • 似乎不起作用,否则我不知道如何使用FOR 循环编写它(这里是新手),但如果你能够在你的机器上进行测试如果联系人中有邮件列表并发布工作代码,我很乐意接受您的回答。

标签: vba outlook


【解决方案1】:
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 会引发错误。

在这种情况下,我通常会做的不是说我要遍历一个袋子中的所有苹果,而是要遍历一个袋子中的每个 item,例如:

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 中的关键字,有时最好不要处理它。

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

您可以执行以下操作:

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

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

【讨论】:

    【解决方案2】:

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

    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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-17
      相关资源
      最近更新 更多