2014-11-20 15 views
6

Pracowałem od jakiegoś tutorial on MSDN, aby nauczyć się tworzyć niektóre makra dla programu Outlook. Mam ten podprogram, który zawiesza się z błędem Type mismatch. Po przejściu przez obsługę błędów po Stop i Resume wraca do Next i kończy kwerendę.Lista dystrybucyjna programu Outlook zawieszona na zapytaniu o elementy kontaktowe

Przeglądając zestaw wyników w Natychmiast, brakuje jednego elementu, który w rzeczywistości jest listą dystrybucyjną zamiast zwykłego kontaktu. Przesunąłem listę mailingową z moich kontaktów do testowania, a błąd się nie wydarzył.

Planuję mieć również inne listy adresowe, ponieważ jest to praca. Czy istnieje sposób na obejście czegoś innego, niż tylko ocalenie ich gdzie indziej?

Oto kod:

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

Zgaduję, że pozycja "Mailing List" nie jest "Kontaktem", a zatem "Dla każdego kontaktu w Kontaktach. Folder. Elementy" zawiodą z powodu braku możliwości przesyłania do "Kontaktu". Alternatywą byłoby użycie pętli "FOR" zamiast "FOR EACH". Wtedy powinieneś być w stanie iterować przez "Przedmioty" i testować, jaki typ przedmiotu posiadasz i rzutować odpowiednio przed uzyskaniem dostępu do jego właściwości. – DeanOC

+0

Wydaje się nie działać, to lub nie wiedziałbym, jak napisać to za pomocą pętli "FOR" (tutaj newbie kości), ale jeśli jesteś w stanie przetestować na swoim komputerze z listą mailingową obecną w kontaktach i opublikuj działający kod, chętnie zaakceptuję twoją odpowiedź. – Phrancis

Odpowiedz

3

W celu dokonania rozróżnienia między listami i Łączności, możesz zmienić swój kod do następujących:

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 

Uwaga, zmieniłem właściwość Jestem z dostępem od NazwaFirmy do fullname dla moich testów jak ja nie zrobił” t Posiadać CompanyName dla wszystkich moich kontaktów.

+0

Bardzo dobrze, działało idealnie. Wielkie dzięki! – Phrancis

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

Gdy zdefiniowane Contact as ContactItem mówisz VBA dokładnie co typu rzeczy powinny znaleźć się w Items. Działa to świetnie, tylko jeśli wszystkie elementy w folderze ContactsFolder są faktycznie ContactItems.

Innymi słowy, przechodzisz przez wszystkie przedmioty w torbie, ale konkretnie czynisz z nich Apple - ale kiedy spotkasz Irange, VBA zgłasza błąd.

Co ogólnie zrobić w tej sytuacji jest to, zamiast mówić, że chcę przejść przez wszystkie jabłka w torebce, chcę przejść przez każdy pozycji w torbie, więc coś takiego:

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 

Zauważ, że zmieniłem twoje nazwisko na mContact, ponieważ jest prawdopodobne, że Contact jest słowem kluczowym w VBA i czasami lepiej nie zajmować się tym.

Powyższe będzie nadal powodować błędy, ponieważ każdy mContact, który nie ma atrybutu .CompanyName.

Co można zrobić, jest następujący:

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 

Pozwoli to sprawdzić, czy obiekt jesteś iteracja (owocu z worka) jest rzeczywiście „jabłko” pierwszy, a jeśli nie, powiedz jaki masz typ owocu.

Powiązane problemy