Excel VBA从Outlook地址列表获取筛选的集合

Excel VBA从Outlook地址列表获取筛选的集合,excel,outlook,vba,Excel,Outlook,Vba,问题: 在我看来,它似乎没有内置的过滤器功能,例如(DatTableObject.Select)(filter criteria),我正在寻找一种方法来做到这一点 我正在访问的全球地址列表有大约一百万个条目,我需要在其中搜索多达1000次 我使用exchange用户名查找用户的电子邮件,使用以下代码: Set olApp = CreateObject("Outlook.Application") Set myNamespace = olApp.GetNamespace("

问题: 在我看来,它似乎没有内置的过滤器功能,例如(DatTableObject.Select)(filter criteria),我正在寻找一种方法来做到这一点

我正在访问的全球地址列表有大约一百万个条目,我需要在其中搜索多达1000次

我使用exchange用户名查找用户的电子邮件,使用以下代码:

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