2016-02-05 38 views
6

我有一个函数,它接受一个名称并在Outlook中解析它以返回所选名称的别名。当地址簿中的选定名称有多个条目时,这将失败。例如“史密斯,鲍勃”&“史密斯,鲍勃X”。如果我试图解决的名称是“Smith,Bob X”,则代码可以正常工作,但普通的“Smith,Bob”会失败。解析Outlook收件人时选择多个条目的第一个条目

我认为当找到多个条目时,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 

回答

1

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

Outlook对象模型但是不公开此功能。如果使用Redemption(任何语言)是一个选项,它会公开RDOAddressBook .ResolveNameEx和RDOAddressList .ResolveNameEx,它会返回匹配列表。

set Session = CreateObject("Redemption.RDOSession") 
    Session.MAPIOBJECT = Application.Session.MAPIOBJECT 
    set AdrrEntries = Session.AddressBook.ResolveNameEx("john") 
    Debug.Print AdrrEntries.Count & " names were retruned by ResolveNameEx:" 
    Debug.Print "------------" 
    for each AE in AdrrEntries 
    Debug.Print AE.Name 
    next 
    Debug.Print "------------" 
+0

我正在使用工作计算机,所以下载任何东西都不会是我的选择。所以我想这不是我能用VBA实现的事情吗? – StevenWalker

+0

这是正确的。 –