Excel VBA从Outlook地址列表获取筛选的集合
问题: 在我看来,它似乎没有内置的过滤器功能,例如(DatTableObject.Select)(filter criteria),我正在寻找一种方法来做到这一点 我正在访问的全球地址列表有大约一百万个条目,我需要在其中搜索多达1000次 我使用exchange用户名查找用户的电子邮件,使用以下代码:Excel VBA从Outlook地址列表获取筛选的集合,excel,outlook,vba,Excel,Outlook,Vba,问题: 在我看来,它似乎没有内置的过滤器功能,例如(DatTableObject.Select)(filter criteria),我正在寻找一种方法来做到这一点 我正在访问的全球地址列表有大约一百万个条目,我需要在其中搜索多达1000次 我使用exchange用户名查找用户的电子邮件,使用以下代码: Set olApp = CreateObject("Outlook.Application") Set myNamespace = olApp.GetNamespace("
Set olApp = CreateObject("Outlook.Application")
Set myNamespace = olApp.GetNamespace("MAPI")
Set aList = myNamespace.AddressLists.Item("Global Address List")
Set aEntry = aList.AddressEntries("" + ExchangeName + "")
Set exUser = aEntry.GetExchangeUser
但它只检索到一个AddressEntry,这是一个问题,当我有几个交换名相同的人时,这种情况经常发生
问题:当我在Outlook中搜索全局地址列表时,我将所有内容按字母顺序快速排序,并显示以我键入的字符串开头的所有匹配项。如何在VBA中获得类似的集合?该
AddressEntries
对象是AddressEntry
对象的集合。直接索引到
AddressEntries
集合时,根据提供的index
参数返回单个AddressEntries
对象。index
参数可以是索引号,也可以是项的默认属性
由于AddressEntry
项的默认属性是.Name
属性,因此返回的是集合中与.Name
属性匹配的第一个项
如果要返回集合中与
.Name
属性匹配的所有AddressEntry
对象,则需要在集合中循环
现在,在.Net中,您可以使用For…Next
对集合进行迭代,我相信您也可以在VBA中这样做,但我无法立即回忆起来。
e、 g:
如果由于某种原因无法工作,您可以使用GetFirst
和GetNext
方法迭代集合。e、 g:
至于按字母顺序排序,请查看
至于构建功能,在哪里 …将显示以我键入的字符串开头的所有匹配项 我不确定您希望如何“显示”匹配项,或者希望在何处键入字符串。但一般的想法是创建一个接受输入参数的函数(例如,
“MatchName”作为字符串
)然后执行类似上面的循环,找到该字符串上所有匹配的属性,然后返回一个数组,或者可以用来“显示”信息的东西
如果您想使其动态化,以便列表“在键入时”更新您可以从KeyPress
事件运行更新过程。为了不在键入单词时运行整个集合,您可能需要存储数组,然后在键入每个额外字母后,您可以迭代该数组并删除不匹配项(缩小结果范围)。在此之前,您可能需要进行某种检查,以查看字母是否已删除(例如,检查文本框中字符串的长度),这将告诉您的程序重新运行对AddressEntries
集合的检查(扩大结果)
无论如何,这是一种通用方法。有些东西告诉我,Outlook地址列表应该可以使用windows search进行查询。但我不确定这是否正确,或者我必须承认,您是否可以使用VBA的windows search查询。不过,如果您想看一下,基本文档位于。您需要一个COM句柄r代表地址列表。
Set olApp = CreateObject("Outlook.Application")
Set myNamespace = olApp.GetNamespace("MAPI")
Set aList = myNamespace.AddressLists.Item("Global Address List")
Set aEntries = aList.AddressEntries
For each aEntry in aEntries
if aEntry.Name="" + ExchangeName + "" Then
'Do something with aEntry object
End If
Next
Set olApp = CreateObject("Outlook.Application")
Set myNamespace = olApp.GetNamespace("MAPI")
Set aList = myNamespace.AddressLists.Item("Global Address List")
Set aEntries = aList.AddressEntries
Set aEntry = aEntries.GetFirst
Do While Not aEntry is Nothing
if aEntry.Name="" + ExchangeName + "" Then
'Do something with aEntry object
End If
Set aEntry = aEntries.GetNext
Loop