Excel-VBA 从 Outlook AddressList 中获取筛选的集合

标签 excel outlook vba

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

我正在访问的全局地址列表有大约一百万个条目,我需要搜索它多达 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 中获得类似的集合?

最佳答案

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

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

如果要全部退回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

如果由于某种原因不起作用,您可以使用 GetFirst 遍历集合。和 GetNext方法。
例如。:
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 .

就构建功能而言

...I am presented with all matches starting with the string I type in.



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

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

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

关于Excel-VBA 从 Outlook AddressList 中获取筛选的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14382557/

相关文章:

c# - EPPlus LoadFromDataTable 错误

excel - 按字符串中倒数第二个字符实例修剪

c# - 使用 outlook 对象模型,我可以获取在 outlook 联系人中看到的字段吗

vba - 应用程序定义或对象定义的错误

vba - 如何在多张纸上应用卡住 Pane ?

sql-server - 将数据从列转置为行

excel - 以编程方式将 GetPivotData 公式分配给单元格

Excel 无法使用 openpyxl 识别日期

python - 在 python 脚本中使用 Pywin32 和 outlook 发送自动电子邮件是有效的,但是当通过 Windows 任务计划程序自动发送电子邮件时不起作用

vba - 在 Windows 文件夹中保存选定的 Outlook 电子邮件的宏