2014-11-20 69 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 

這將檢查您是通過(從袋子水果)迭代對象是否實際上是一個「蘋果」第一,如果沒有,告訴你是什​​麼類型的水果。