2014-11-20 12 views
6

Stavo lavorando da alcuni tutorial on MSDN per imparare a fare alcuni macro per Outlook. Ho questa subroutine che si blocca con un errore Type mismatch. Passando attraverso la gestione degli errori dopo Stop e Resume, questo torna a Next e termina la query.Elenco di distribuzione di Outlook riagganciare sulla query degli elementi di contatto

Guardando attraverso il set di risultati in Immediato, manca un elemento che è in realtà una mailing list di distribuzione invece di un normale contatto. Ho spostato la mailing list dai miei contatti per il test e l'errore non si è verificato.

Ho in programma di avere anche altre mailing list, dato che questo è per lavoro. C'è una soluzione alternativa come un modo per sfuggire ad essa, oltre a salvarli da qualche altra parte?

Ecco il codice:

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

Suppongo che l'elemento 'Mailing List' non sia un' Contatto' e quindi 'Per ogni contatto in ContattiFolder.Items' non riuscirà a causa del non essere in grado di eseguire il cast di' Contatti'. Un'alternativa sarebbe utilizzare un ciclo 'FOR' piuttosto che' FOR EACH'. Quindi dovresti essere in grado di scorrere gli 'item' e testare il tipo di elemento che hai e lanciare di conseguenza prima di accedere alle sue proprietà. – DeanOC

+0

Non sembra funzionare, o non saprei scriverlo con un ciclo 'FOR' (newbie bare-bones qui) ma se sei in grado di testare sul tuo computer con una mailing list presente nei contatti e postare il codice di lavoro, sarò felice di accettare la tua risposta. – Phrancis

risposta

3

Al fine di distinguere tra liste e contatti, è possibile modificare il codice per il seguente:

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 

nota, ho cambiato la proprietà che sto accedendo da CompanyName a FullName per i miei test, come ho didn' t avere CompanyName per tutti i miei contatti.

+0

Molto buono, ha funzionato perfettamente. Molte grazie! – Phrancis

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

al momento della definizione Contact as ContactItem si sta dicendo VBA esattamente che tipo di cosa che dovrebbe trovare in Items. Funziona alla grande, solo se tutti gli elementi nella cartella Contatti sono in realtà ContactItems.

In altre parole, si stanno specificando tutti gli elementi in una borsa, ma in particolare ognuno di essi è un Apple - ma quando si incontra un Irange, VBA genera un errore.

Quello che in genere fare in questa situazione è invece di dire che voglio passare attraverso tutte le mele in un sacchetto, voglio passare attraverso ogni oggetto in un sacchetto, in modo da qualcosa come:

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 

Nota che ho cambiato il tuo nome in mContact perché è probabile che Contact sia una parola chiave in VBA ed è talvolta meglio non occuparsene.

Questo sopra causerà ancora errori perché qualsiasi mContact che non ha un attributo .CompanyName.

cosa si può fare è la seguente:

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 

Ciò controllare se l'oggetto che si sta scorrendo (il frutto dalla borsa) è in realtà una "mela" prima, e se no, dice tu che tipo di frutto è.

Problemi correlati