2017-04-14 17 views
1

配布リスト(〜200人を含む)のユーザーの詳細を取得しようとしています。Outlook - 配布リストのメンバーの詳細

新しい電子メールを作成するときに、このDLを唯一の受信者として追加し、以下のマクロを実行すると、〜15の最初の結果が返され、 "OutlookはMicrosoft Exchangeサーバーからデータを取得しようとしています"私は "操作が失敗しました"というエラーが表示されることがあります。

コード実行を続行すると、次の15個の値が返され、この問題が再び表示されます。 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 

しかし、私は(「+」アイコンを使用して)配布リストを展開して、わずかに変更されたコードを実行した場合、すべてのユーザの結果は問題なく(ほんの数秒を取る)で返されます。

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 

+0

はExchangeUserないディストリビューションのリスト上の誰もがあるのでしょうか?あなたの2番目のスニペットはそれを説明しますが、最初のスニペットはそうではありません(それは 'Recipients.Item(1)'を扱いますが、個々の受信者ではありません)。 (これは暗闇の中のただのショットです、私は他のアイデアを持っていません) –

+0

すべては交換ユーザーです。問題は、個々の受取人を介してどのように反復するのか分かりません。 –

+0

WinAPIスリープ関数への呼び出しを100または200ミリ秒間追加することも考えられます。あなたが遭遇しているエラーは、各反復で非常に小さな休止を避けて避けるかもしれない競合/タイムアウトのように見えます。 –

答えて

1

コード内で即座にOutlook COMオブジェクトを解放する必要があります。これは、アドインがMicrosoft Exchange Serverに格納されているコレクションに256を超えるOutlookアイテムを列挙しようとする場合に特に重要です。これらのオブジェクトを適時に解放しないと、一度に開いたアイテムの最大数にExchangeが課す制限に達することができます。完了したら、変数をNothingに設定して、オブジェクトへの参照を解放します。ユージンのフィードバックに基づいて

+0

少数の反復(〜10)後に問題が発生します。 = Nothing' が解決しない= olMail.Recipients.Item O セットO '薄暗いオブジェクトの解放(I).AddressEntry.Members.Item(J) のDebug.Print o.GetExchangeUser.FirstName 設定0。 –

+1

コードの1行で多くのドットが見えます。だから、私はプロパティとメソッド呼び出しのチェーンを壊し、別々の行(それぞれのプロパティやメソッドを1行のコードで宣言)することをお勧めします。あなたはタイムリーにそれらをリリースすることができます。 –

+0

'Item'オブジェクトではなく、解放する必要がある' Members'オブジェクトかもしれません... –

0

更新(作業)コード:

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 
関連する問題