2017-04-14 2 views
1

메일 그룹 (~ 200 명 포함)의 사용자에 대한 세부 정보를 얻으려고합니다.Outlook - 메일 그룹 구성원 세부 정보

새 전자 메일을 만들 때이 DL을 유일한받는 사람으로 추가하고 아래 매크로를 실행하면 ~ 15 개의 첫 번째 결과가 반환되고 "Outlook이 Microsoft Exchange 서버에서 데이터를 가져 오려고합니다"라는 메시지가 나타납니다. "Operation was failed"오류가 발생합니다.

코드 실행을 계속하면 다음 15 개의 값이 반환되고이 문제가 다시 나타납니다. 일부 스팸 방지 스팸 방지와 같은 이음새가 있습니다. 내가합니다 ('+'아이콘을 사용) 메일 그룹을 확장하여 약간 수정 된 코드를 실행하면

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없는 배포판 목록에 사람이있다? 두 번째 스 니펫은이를 설명하지만 첫 번째 스 니펫은 그렇지 않습니다 (이는 'Recipients.Item (1)'이지만 개별 수신자 아님). (이것은 어둠 속의 단지 발사이고 다른 아이디어는 없습니다) –

+0

모두 교환 사용자입니다. 문제는 개별 수신자를 통해 반복하는 방법을 모르겠다는 것입니다. –

+0

한 가지 생각은 100 또는 200ms 동안 WinAPI 절전 기능 호출을 추가하는 것입니다. 당신이 겪고있는 오류는 각 반복마다 아주 작은 일시 정지로 피할 수있는 충돌/시간 초과 정렬과 같은 것처럼 보입니다. –

답변

1

코드에서 즉시 Outlook COM 개체를 릴리스해야합니다. 추가 기능이 Microsoft Exchange Server에 저장된 컬렉션에 256 개 이상의 Outlook 항목을 열거하려고 할 때 특히 중요합니다. 이러한 개체를시기 적절하게 해제하지 않으면 Exchange에서 한 번에 열 수있는 최대 항목 수에 도달 할 수 있습니다. 작업이 끝나면 변수를 Nothing으로 설정하여 개체에 대한 참조를 해제하면됩니다. 유진의 피드백을 기반으로

+0

몇 번의 반복 (~ 10) 후에 문제가 발생합니다. = Nothing' 도움이되지 않는다 = olMail.Recipients.Item 오 설정 O '희미한 객체를 해제 (I) .AddressEntry.Members.Item (J) 을 Debug.Print o.GetExchangeUser.FirstName 설정 오. –

+1

한 줄의 코드에서 많은 점들이 보입니다. 따라서 속성 및 메서드 호출 체인을 끊고 별도의 줄 (각 ​​줄 또는 코드의 각 속성 또는 메서드)에 선언 할 것을 제안합니다. 따라서 적시에 석방 할 수 있습니다. –

+0

'Item' 객체가 아니라'Release'가 필요한'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 
관련 문제