2017-08-09 62 views
1

Outlookのグローバルアドレス一覧を使用してユーザーの電子メールアドレスを検索しようとしています。ここで私がそれを行うために使用するVBAコードです。グローバルアドレス一覧の参照でオートメーションエラーが発生しました

'Snip 
    If firstName <> "" Then 
     Dim o, AddressList, AddressEntry 
     Dim AddressName, Address, Address2 As String 
     Set o = CreateObject("Outlook.Application") 
     Set AddressList = o.Session.AddressLists("Global Address List") 
     AddressName = firstName 
     For Each AddressEntry In AddressList.AddressEntries 
      If AddressEntry.Name = AddressName Then 
       Address = AddressEntry.GetExchangeUser.PrimarySmtpAddress 
       Exit For 
      End If 
     Next AddressEntry 
    End If 
    'Snip 

変数 "firstName"の形式は、姓、名です。これは一見、私はそれを使用しようとする時間の半分だけ動作します。たとえば、自分の名前を毎回完全にうまく動作させるとしたら、私が同僚の名前を入れると、Outlookから「OutlookはMicrosoft Exchange Server * .comからデータを取得しようとしています。 "その後、私は自動化エラーが発生します。私は動作しない名前と同じ名前のものは共通して見つけられませんでした。どんな助けも非常に高く評価されるでしょう。

EDIT:私が思った別のメモは、エラーウィンドウでデバッグを押すと、「次のAddressEntry」行が強調表示されます。

+0

は 'firstName'は人物の名または人物のリストの最初の名前であるはずですか?通常、それは一人の "与えられた"または "キリスト教の"名前を指します。 _Namingものは難しいです。 – FreeMan

+0

おそらく 'AddressList.AddressEntries.Count'またはこれに類するものがあります。あなた自身のこと以上にアクセスできるように、あなたの数をチェックしてください。また、 'Address2'は' String'で、 'AddressName'と' Address'は 'Variant'です。 – FreeMan

+0

@FreeMan混乱して申し訳ありませんが、secondListという別の変数があり、両方の変数が異なるフル(Doe、Janeなど)の名前を保持するように、アドレスリストを2回検索します。私は自分よりも他の名前を試していて、ある人は仕事をしています。私は例として自分自身を使用しました。私はまた、アドレス名と住所を文字列に変更しようとしましたが、違いはありませんでした。 Address2はコードの次の部分で使用されます。 – wgray

答えて

1

GALのすべての項目をループしないでください - 一部のGALには何万もの項目が含まれているため、ループすることができます。

Application.Session.CreateRecipient(返品Recipientオブジェクト)を呼び出し、Recipient.Resolveに電話し、次にを使用します。

UPDATE
名前があいまいな場合、あなたはRecipient.Resolveからエラーを取り戻すだろう - マッチのリストを取得し、いずれかを選択する方法はありません - Outlookオブジェクトモデルは、あなたがそれから回復することはできません。あなたは欲しい。 Redemptionをオプションとして使用する場合は、RDOAddressBookを使用できます。 ResolveNameExメソッド - (名前があいまいでない場合、1つのエントリの)一致のリストを返します。 RDIAddressListを使用することもできます。 ResolveName/ResolveNameEx特定のコンテナのみ(例:GAL)を解決するには

Set o = CreateObject("Outlook.Application") 
... 
set Session = CreateObject("Redemption.RDOSession") 
Session.MAPIOBJECT = o.Session.MAPIOBJECT 
set AdrrEntries = Session.AddressBook.ResolveNameEx("John") 
MsgBox AdrrEntries.Count & " names were returned by ResolveNameEx:" 
for each AE in AdrrEntries 
    MsgBox AE.Name 
next 
+0

これははるかに良い、ありがとうございます。 – wgray

+0

これについての別の質問... GALの2人のユーザーが同じ名前を持つ場合、「受信者を解決できません」というエラーが表示されます。最初のユーザーを選択する方法はありますか?私はErr.Numberを使用してエラーを再開した後にそれをキャッチし、私の古い方法を使用して検索したが、毎回異なるエラー番号を与える... – wgray

+0

それは常に私はちょうど使用するように負のエラー番号を与えるようだerr.number <0 – wgray

関連する問題