【问题标题】:Excel-VBA get filtered collection from Outlook AddressListExcel-VBA 从 Outlook AddressList 中获取筛选的集合
【发布时间】:2013-01-01 04:44:09
【问题描述】:

问题: 在我看来 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 中的类似集合?

【问题讨论】:

  • 某事告诉我 Outlook 地址列表应该可以使用 Windows 搜索进行查询。不确定这是否正确,或者您是否可以使用 VBA 中的 Windows 搜索查询,我必须承认。不过,如果您想看一下,基本文档位于msdn.microsoft.com/en-us/library/windows/desktop/…。不过,您需要一个 COM 处理程序来处理地址列表。

标签: excel outlook vba


【解决方案1】:

AddressEntries 对象是AddressEntry 对象的集合。
当您直接索引到 AddressEntries 集合时,您会根据提供的 Index 参数返回一个 single AddressEntry 对象。 Index 参数可以是索引号,也可以是项目的默认属性。

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


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

现在,在 .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

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

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 集合的检查(扩大结果)。

无论如何,这是您可以做到的一种总体思路。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-09
    • 2018-01-12
    相关资源
    最近更新 更多