全局地址列表查找中的自动化错误



>我正在尝试使用 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

变量"名字"的格式为姓氏,名字。这似乎只在我尝试使用它的一半时间有效。例如,如果我把自己的名字放进去,它每次都可以正常工作,但是如果我输入同事的名字,我会从Outlook得到一个小弹出气泡,说"outlook正在尝试从Microsoft交换服务器*.com检索数据",然后我得到一个自动化错误。在不起作用的名称和不起作用的名称之间,我找不到任何共同点。任何帮助将不胜感激。

编辑:我刚刚想到的另一个注意事项是,当我在错误窗口中点击调试时,它会突出显示"下一个地址条目"行。

不要遍历 GAL 中的所有项目 - 某些 GAL 包含数万个条目,您将无法遍历它们。

调用Application.Session.CreateRecipient(返回Recipient对象(,调用Recipient.Resolve,然后使用Recipient.AddressEntry.GetExchangeUser

更新
如果名称不明确,您将从Recipient.Resolve中返回错误 - Outlook 对象模型不允许您从中恢复 - 无法获取匹配项列表并选择所需的匹配项。如果使用Redemption(我是它的作者(是一个选项,你可以使用RDOAddressBook。ResolveNameEx方法 - 它返回匹配项列表(如果名称不明确,则返回一个条目(。您也可以使用 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

最新更新