2017-04-14 4 views
1

J'essaye d'obtenir des détails pour des utilisateurs dans une liste de distribution (contenant ~ 200 personnes). Lorsque je crée un nouvel e-mail, ajoutez ce DL comme seul destinataire et exécutez la macro ci-dessous, il renvoie ~ 15 premiers résultats, puis le message "Outlook tente d'extraire des données du serveur Microsoft Exchange" s'affiche. un certain temps je reçois l'erreur "L'opération a échoué".Outlook - détails de membre de liste de distribution

Si je continue l'exécution du code, les valeurs ~ 15 suivantes sont renvoyées et ce problème réapparaît. Coutures comme il y a une limite anti-spam Exchange.

Sub GetDetails(olMail As MailItem) 

    Dim i As Integer, j As Integer 
    For i = 1 To olMail.Recipients.Count ' count = 1 
     If olMail.Recipients.Item(i).AddressEntry.GetExchangeUser Is Nothing Then 
      For j = 1 To olMail.Recipients.Item(i).AddressEntry.Members.Count ' count ~= 200 
       Debug.Print olMail.Recipients.Item(i).AddressEntry.Members.Item(j).GetExchangeUser.FirstName 
      Next j 
     End If 
    Next i 
End Sub 

Mais si j'Allonger la liste de distribution (en utilisant l'icône « + ») et exécuter du code légèrement modifié, les résultats pour tous les utilisateurs sont retournés sans problème (en prenant quelques secondes seulement).

Sub GetDetails(olMail As MailItem) 

    Dim i As Integer 
    For i = 1 To olMail.Recipients.Count ' count ~= 200 
     If Not olMail.Recipients.Item(i).AddressEntry.GetExchangeUser Is Nothing Then 
      Debug.Print olMail.Recipients.Item(i).AddressEntry.GetExchangeUser.FirstName 
     End If 
    Next i 
End Sub 

Des idées?

+0

est-il quelqu'un sur la liste de distribution qui n'est pas un ExchangeUser? Votre deuxième extrait compte pour cela, mais il semble que le premier ne le fasse pas (il gère le 'Recipients.Item (1)' mais * pas * les destinataires individuels). (Ceci est juste une photo dans le noir, et je n'ai pas d'autres idées) –

+0

Tous les utilisateurs sont des visiteurs d'échange. Le problème est que je ne sais pas comment les parcourir à travers les destinataires individuels. –

+0

une pensée serait d'ajouter un appel à la fonction WinAPI Sleep pendant 100 ou 200 ms. l'erreur que vous obtenez ressemble à une sorte de conflit/délai d'attente que vous pourriez éviter avec une très petite pause à chaque itération. –

Répondre

1

Vous devez libérer des objets COM Outlook instantanément dans le code. Cela est particulièrement important si votre complément tente d'énumérer plus de 256 éléments Outlook dans une collection stockée sur un serveur Microsoft Exchange. Si vous ne libérez pas ces objets en temps opportun, vous pouvez atteindre la limite imposée par Exchange sur le nombre maximal d'éléments ouverts à la fois. Lorsque vous avez terminé, définissez simplement une variable sur Nothing pour libérer la référence à l'objet.

+0

Problème survient après quelques itérations (~ 10). Libérer des objets 'Dim o Set o = olMail.Recipients.Item (i) .AddressEntry.Members.Item (j) Debug.Print o.GetExchangeUser.FirstName Set o = Nothing' ne vous aide pas. –

+1

Je vois beaucoup de points dans la seule ligne de code. Donc, je suggère de briser la chaîne des appels de propriété et de méthodes et de les déclarer sur une ligne séparée (chaque propriété ou méthode sur une seule ligne de code). Ainsi, vous serez en mesure de les libérer en temps opportun. –

+0

Il peut s'agir de l'objet 'Members' qui doit être libéré, pas de l'objet' Item' ... –

0

code mis à jour (travail) en fonction des commentaires de Eugene:

Sub GetDetails(olMail As MailItem) 
    Dim oRecipients As Recipients 
    Dim oRecipient As Recipient 
    Dim oMembers As AddressEntries 
    Dim oMember As AddressEntry 
    Dim i As Integer, j As Integer, dRecCnt As Integer, dMemCnt As Integer 

    Set oRecipients = olMail.Recipients 

    dRecCnt = oRecipients.Count 
    For i = 1 To dRecCnt 
     Set oRecipient = oRecipients.Item(i) 

     If oRecipient.AddressEntry.GetExchangeUser Is Nothing Then 
      Set oMembers = oRecipient.AddressEntry.Members 

      dMemCnt = oMembers.Count 
      For j = 1 To dMemCnt 
       Set oMember = oMembers.Item(j) 

       Debug.Print c & ": " & oMember.GetExchangeUser.FirstName 

       Set oMember = Nothing 
      Next j 

      Set oMembers = Nothing 
     End If 

     Set oRecipient = Nothing 
    Next i 

    Set oRecipients = Nothing 
End Sub