2016-02-05 41 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

這是正確的。 –