4

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

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

我正在使用交换用户名查找人们的电子邮件,使用以下代码:

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,当我有几个具有相同 Exchange 名称的人时,这是一个问题 - 经常发生。

问题:当我在 Outlook 中搜索全局地址列表时,所有内容都按字母顺序排序并且速度很快,所有匹配项都以我输入的字符串开头。如何在 VBA 中获得类似的集合?

4

1 回答 1

0

AddressEntries对象是对象的集合AddressEntry
当您按原样直接索引到AddressEntries集合中时,您会根据提供的参数返回单个对象。 该参数可以是索引号,也可以是项目的默认属性。AddressEntryIndexIndex

由于AddressEntry项目的默认属性是.Name属性,因此返回集合中与该.Name属性匹配的第一个项目。


如果要返回AddressEntry集合中与属性匹配的所有对象,.Name则需要遍历集合。

现在,在 .Net 中,您可以使用 迭代集合For...Next,我相信您也可以在 VBA 中执行此操作,但我无法立即回忆。例如:

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

如果由于某种原因不起作用,您可以使用GetFirstandGetNext方法遍历集合。
例如:

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

至于按字母顺序排序,请查看Sort Method


就构建功能而言

...我会看到以我输入的字符串开头的所有匹配项。

我不确定你想如何“呈现”匹配项,或者你想在哪里输入字符串。但一般的想法是创建一个接受输入参数(例如"MatchName" As String)的函数并执行像上面这样的循环以查找该字符串上您想要查看的任何属性的所有匹配项,然后您将返回一个数组或其他内容您可以使用它来“呈现”信息。

如果您想让它动态化,以便“在您键入时”更新列表,您可以从KeyPress事件中运行更新过程。为了在键入单词时不遍历整个集合,您可能希望存储数组,然后在键入每个附加字母时,您可以遍历该数组并删除不匹配项(缩小结果)。在此之前,您可能需要进行某种检查以查看是否删除了一个字母(例如检查文本框中字符串的长度),这会告诉您的程序重新运行对AddressEntries集合的检查(扩大结果)。

无论如何,这是你可以做到的一种方式的一般想法。

于 2015-07-22T04:02:49.267 回答