我在Access 2016中创建了一个表单,用户可以在其中键入个人姓名并向该个人发送电子邮件。
我目前正在测试一些将返回电子邮件地址的代码,它在名称唯一的情况下工作(即只有一个人拥有该名称),但是我们有超过70,000名员工,其中一些人拥有相同的名称名。
这是我当前的代码,适用于唯一名称:
Sub GetEmail()
Set out_App = New Outlook.Application
Set out_NS = out_App.GetNamespace("MAPI")
Set out_Recip = out_NS.CreateRecipient("Gavin Thomson")
out_Recip.Resolve
Set out_Addr = out_Recip.addressEntry
Set out_ExUser = out_Addr.GetExchangeUser
MsgBox out_ExUser.primarysmtpaddress
End Sub
当我将值更改为存在多次的名称时,我收到错误说"操作失败。"在Set out_ExUser = out_Addr.GetExchangeUser
。
任何帮助将不胜感激!
答案 0 :(得分:1)
不幸的是,只有VBA才能实现这一点。
在扩展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 "------------"