我正在从一些tutorial on MSDN开始学习为Outlook制作一些宏。我有这个子例程挂起Type mismatch
错误。在Stop
和Resume
之后逐步执行错误处理后,它会返回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
答案 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。