2017-08-09 58 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中檢索數據「然後我得到一個自動化錯誤。我找不到那些不起作用的名稱和那些相同的名稱之間的共同之處。任何幫助將非常感激。

編輯:我只是想到的另一個說明是,當我打錯誤窗口上的調試它突出顯示「下一個AddressEntry」行。

+0

是'firstName'應該是某人的第一個名字還是人名列表中的第一個名字?通常,它指的是一個人的「給定」或「基督徒」的名字。 _命名事物很難_ – FreeMan

+0

有可能是一個'AddressList.AddressEntries.Count'或類似的東西 - 檢查你的計數,以確保你獲得的不僅僅是你自己。另外,Address2是String,AddressName和Address是Variant。 – FreeMan

+0

@FreeMan對於混淆感到抱歉,我有另一個名爲secondName的變量,它第二次搜索地址列表,所以兩個變量都保持不同的完整名稱(例如Doe,Jane)。我也嘗試了其他的名字,而不是我自己的,還有一些做了工作我只是以自己爲例。我也嘗試將地址名稱和地址更改爲字符串,但這沒有什麼區別。地址2用於代碼的下一部分。 – wgray

回答

1

不要遍歷GAL中的所有項目 - 某些GAL包含數以萬計的條目,並且您將無法遍歷它們。

致電Application.Session.CreateRecipient(返回Recipient對象),請致電Recipient.Resolve,然後使用Recipient.AddressEntry.GetExchangeUser

UPDATE
如果名稱不明確,你會從Recipient.Resolve找回錯誤 - Outlook對象模型不會讓你從恢復 - 有沒有辦法讓比賽的名單,並選擇一個你要。如果使用Redemption是一個選項,您可以使用的是RDOAddressBookResolveNameEx方法 - 它返回匹配列表(如果名稱不含糊,則爲一個條目)。您也可以使用RDIAddressList。如果你不想解決一個特定容器(例如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