2014-11-20 4 views
6

Ich arbeitete von einigen tutorial on MSDN um zu lernen, einige Makros für Outlook zu machen. Ich habe dieses Unterprogramm, das mit einem Type mismatch Fehler aufgelegt wird. Beim Durchlaufen der Fehlerbehandlung nach Stop und Resume geht es zurück zu Next und beendet die Abfrage.Outlook-Verteilerliste auf Kontaktelemente abfragen

Beim Durchsehen der Ergebnismenge in Immediate fehlt ein Element, das eigentlich eine Verteilerliste anstelle eines normalen Kontakts ist. Ich habe die Mailingliste zum Testen aus meinen Kontakten entfernt und der Fehler ist nicht aufgetreten.

Ich plane auch andere Mailing-Listen, wie dies für die Arbeit ist. Gibt es einen Workaround wie einen Weg, um es zu umgehen, außer sie nur woanders zu speichern? Hier

ist der Code:

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

Ich nehme an, dass das 'Mailing List' Element kein' Kontakt' ist und daher '' Für jeden Kontakt in ContactsFolder.Items' fehlschlägt, weil es nicht möglich ist, nach 'Contact' zu casten. Eine Alternative wäre, eine "FOR" -Schleife anstelle von "FOR EACH" zu verwenden. Dann sollten Sie in der Lage sein, durch die 'Items' zu iterieren und zu testen, welche Art von Item Sie haben und dementsprechend zu werfen, bevor Sie auf seine Eigenschaften zugreifen. – DeanOC

+0

Scheint nicht zu funktionieren, das oder ich würde nicht wissen, wie man es mit einer 'FOR'-Schleife schreibt (nackter Neuling hier), aber wenn du in der Lage bist, auf deinem Rechner mit einer Mailingliste in Kontakten zu testen und posten Sie den Arbeitscode, ich werde Ihre Antwort gerne annehmen. – Phrancis

Antwort

3

Um zwischen Listen und Kontakte zu unterscheiden, können Sie Ihren Code wie folgt ändern:

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 

Hinweis, Ich habe die Eigenschaft Ich bin von Company Zugriff für meine Tests als Fullname I ‚didn t haben CompanyName für alle meine Kontakte.

+0

Sehr gut, hat perfekt funktioniert. Danke vielmals! – Phrancis

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

Wenn Sie Contact as ContactItem definiert Sie sagen VBA genau welche Art von Sache, die es in Items finden sollte. Das funktioniert nur, wenn alle Elemente in dem ContactsFolder tatsächlich ContactItems sind. In anderen Worten, Sie gehen spezifisch durch alle Elemente in einer Tüte, machen aber jede einzelne zu einem Apple - aber wenn Sie auf einen Irange stoßen, gibt VBA einen Fehler aus.

Was ich in dieser Situation im Allgemeinen zu tun ist, anstatt zu sagen, dass ich in einer Tasche durch alle Äpfel gehen, ich will in einer Tasche durch jeden Artikel gehen, so etwas wie:

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 

Beachten Sie, dass ich Ihren Namen in mContact geändert habe, weil es wahrscheinlich ist Contact ist ein Schlüsselwort in VBA und es ist manchmal besser, nicht damit umzugehen.

Dies führt immer noch zu Fehlern, weil jeder mContact, der kein .CompanyName Attribut hat.

Was können Sie tun, ist die folgende:

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 

Dies wird für überprüfen, ob das Objekt, das Sie Iterieren durch (die Frucht aus der Tasche) ist eigentlich ein „Apfel“ zuerst, und wenn nicht, zu sagen Sie, welche Art von Frucht es ist.