解析Outlook收件人时选择多个条目的第一个条目

Ste*_*ker 6 excel vba excel-vba outlook-vba

我有一个函数,它接受一个名称并在Outlook中解析它以返回所选名称的别名.如果通讯录中的所选名称有多个条目,则会失败.例如"Smith,Bob"和"Smith,Bob X".如果我试图解析的名称是"Smith,Bob X",则代码工作正常,但简单的"Smith,Bob"失败.

我假设当找到多个条目时,Outlook会打开"检查名称"对话框(当我手动解析名称时会出现这种情况).

当我的代码找到多个条目时,如何选择第一个条目?

Function GETTPX(ByVal UserName As String) As String
Dim objOL As Object
Dim oRecip As Outlook.Recipient
Dim oEU As Outlook.ExchangeUser
Dim oEDL As Outlook.ExchangeDistributionList

Set objOL = CreateObject("Outlook.Application")

Set oRecip = objOL.Session.CreateRecipient(UserName)
oRecip.Resolve
If oRecip.Resolved Then
    Set oEU = oRecip.AddressEntry.GetExchangeUser
End If
GETTPX = oEU.Alias

Set oRecip = Nothing
Set objOL = Nothing

End Function
Run Code Online (Sandbox Code Playgroud)

Dmi*_*nko 1

在扩展 MAPI 级别(仅限 C++ 或 Delphi),您可以PR_ANR对特定搜索容器(例如 GAL)的内容表创建限制。这就是 Outlook 在解析您在“收件人”编辑框中键入的名称时所做的事情 - 它会遍历搜索路径中的所有容器并应用限制PR_ANR。如果找到多个匹配项,则会显示一个包含列表的对话框。如果存在单个匹配项,则返回该匹配项并停止搜索,否则继续搜索搜索路径中的下一个容器。

然而,Outlook 对象模型不公开此功能。如果使用Redemption(我是它的作者 - 任何语言)是一种选择,它会公开RDOAddressBookResolveNameExRDOAddressListResolveNameEx,它返回匹配列表。

  set Session = CreateObject("Redemption.RDOSession")
  Session.MAPIOBJECT = Application.Session.MAPIOBJECT
  set AdrrEntries = Session.AddressBook.ResolveNameEx("john")
  Debug.Print AdrrEntries.Count & " names were returned by ResolveNameEx:"
  Debug.Print "------------"
  for each AE in AdrrEntries
    Debug.Print AE.Name
  next
  Debug.Print "------------"
Run Code Online (Sandbox Code Playgroud)