2014-11-20 75 views
6

我正在从一些tutorial on MSDN开始学习为Outlook制作一些宏。我有这个挂起Type mismatch错误的子程序。在StopResume之后逐步完成错误处理后,它将返回Next并完成查询。Outlook联系人项目查询挂起的Outlook分配列表

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

我的计划还有其他邮件列表,因为这是为了工作。是否有一种解决方法,像某种方式来逃避它,除了将它们保存在其他地方?

下面是代码:

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 
+0

我猜'邮件列表项不是'联系人',因此'对于ContactsFolder.Items中的每个联系人'将失败,因为不能转换为'Contact'。另一种选择是使用“FOR”循环而不是“FOR EACH”。然后,你应该能够遍历'Items'并且测试你拥有什么类型的物品并且在访问它的属性之前进行相应的投射。 – DeanOC 2014-11-20 22:57:12

+0

似乎没有工作,或者我不知道如何用'FOR'循环(这里是裸机新手)编写它,但是如果您能够使用联系人列表中的邮件列表在您的机器上测试并发布工作代码,我会很乐意接受你的答案。 – Phrancis 2014-11-20 23:04:33

回答

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 

注意,我改变了我从公司名称到访问全名我的测试,我没有”属性我的所有联系人都有公司名称。

+0

非常好,工作完美。非常感谢! – Phrancis 2014-11-21 18:16:29

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 

这将检查您是通过(从袋子水果)迭代对象是否实际上是一个“苹果”第一,如果没有,告诉你是什​​么类型的水果。