3

Excelに名前と名前のリストがあり、そのリストを利用して、VisualBasicを使用してOutlookで電子メールアドレスを検索したいと思います。

私は次のVBコードを使用しています:

    Private Sub GetAddresses()
    Dim o, AddressList, AddressEntry
    Dim c As Range, r As Range, AddressName As String
    Set o = CreateObject("Outlook.Application")
    Set AddressList = o.Session.AddressLists("Global Address List")
    Set r = Range("a1:a3")
    For Each c In r
        AddressName = Trim(c.Value) & ", " & Trim(c.Offset(0, 1).Value)
        For Each AddressEntry In AddressList.AddressEntries
            If AddressEntry.Name = AddressName Then
                c.Offset(0, 2).Value = AddressEntry.Address
                Exit For
            End If
        Next AddressEntry
    Next c
    End Sub

実際にメールアドレスを取得するまでは、コードは正常に機能しているようです。名前と一致した後、アドレスの代わりに次を返します。誰かが私が間違っていることを知っていますか?

/O=Compnay/OU=Company/cn=Recipients/cn=shs

よろしくお願いします。

4

2 に答える 2

6

これらはドメインユーザーであると想定しています。exchangeUser オブジェクトから SMTP アドレスを取得します。これを示すためにコードを更新しました。

Private Sub GetAddresses()
    Dim o, AddressList, AddressEntry
    Dim c As Range, r As Range, AddressName As String
    'added variable for exchange user object
    Dim exchangeUser As Outlook.exchangeUser

    Set o = CreateObject("Outlook.Application")
    Set AddressList = o.Session.AddressLists("Global Address List")
    Set r = Range("a1:a3")
    For Each c In r
        AddressName = Trim(c.Value) ' & ", " & Trim(c.Offset(0, 1).Value)
        For Each AddressEntry In AddressList.AddressEntries
            If AddressEntry.Name = AddressName Then
            'set the exchange user object
            Set exchangeUser = AddressEntry.GetExchangeUser
            'get the smtp addresss
            c.Offset(0, 2).Value = exchangeUser.PrimarySmtpAddress
            'release
            Set exchangeUser = Nothing
                Exit For
            End If
        Next AddressEntry
    Next c
End Sub
于 2012-12-11T17:37:47.057 に答える
0

痛い!何万ものエントリが含まれる可能性があるアドレス一覧のすべての項目をループする必要があるのはなぜでしょうか。Aplication.Sesssion.CreateRecipient を使用してから、Recipient.Resolve を呼び出します。成功した場合は、Recipient.AddressEntry から AddressEntry オブジェクトを取得できます。
名前が GAL に対してのみ解決されることを確認する必要がある場合 (ちなみに、GAL 名をハードコーディングしないでください。ロケールによって異なります)、Redemptionとその AddreessList.ResolveName メソッドを使用できます。 RDOSession.AddressBook.GAL.ResolveNameを呼び出す

于 2013-02-24T00:00:19.413 に答える