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

时间:2017-08-09 14:47:06

标签: vba outlook

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

变量&#34; firstName&#34;格式为姓氏,名字。这似乎只有一半的时间我尝试使用它。例如,如果我把自己的名字放在其中,每次工作都很好,但是如果我输入我的同事的名字,我会从Outlook中得到一个小小的弹出泡泡说&#34; outlook正试图从中检索数据Microsoft Exchange服务器* .com&#34;然后我得到一个自动化错误。我找不到那些不起作用的名字和那些名字相同的名字之间的任何共同点。非常感谢任何帮助。

编辑:我刚才想到的另一个注意事项是,当我在错误窗口点击调试时,会突出显示&#34; Next AddressEntry&#34;线。

1 个答案:

答案 0 :(得分:1)

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

致电Application.Session.CreateRecipient(返回Recipient个对象),致电Recipient.Resolve,然后使用Recipient.AddressEntry.GetExchangeUser

<强>更新
如果名称不明确,您将从Recipient.Resolve返回错误 - Outlook对象模型不允许您从中恢复 - 无法获取匹配列表并选择所需的匹配项。如果使用Redemption是一个选项,则可以使用is RDOAddressBookResolveNameEx方法 - 它返回匹配列表(如果名称不明确,则返回一个条目)。如果您只想解决某个特定容器(例如GAL),也可以使用RDIAddressListResolveName / ResolveNameEx

 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