vba - VBA 用户表单组合框是 Outlook 联系人姓名列表和命令按钮,用于在选择姓名时搜索匹配的联系人家庭电话号码
问题描述
我正在尝试制作一个用户表单,将您的所有 Outlook 联系人全名加载到组合框中,然后根据选择的名称,他们与该名称匹配的电话号码将打印在另一个文本框中。选择名称后,您如何返回获取电话号码并将其打印到文本框中?
这是将 Outlook 联系人姓名放入组合框中的复制代码,可能同时将电话号码项目添加到组合框而不是文本框,但是您如何将信息与正确的姓名匹配?这个想法是它制作一个电话留言表,然后您将其通过电子邮件发送给该消息的对象,这将有助于查看该人之前是否曾打过电话,而无需手动查找他们的号码或再次询问
Private Sub UserForm_Initialize()
Dim MyOLApp As New Outlook.Application
Dim myNameSpace As Namespace
Dim myContacts As Items
Dim myContact As ContactItem
Dim newfax As MailItem
Set myNameSpace = MyOLApp.GetNamespace("MAPI")
Set myContacts = myNameSpace.GetDefaultFolder(olFolderContacts).Items
ComboBox1.Clear
For Each myContact In myContacts
ComboBox1.AddItem myContact.FullName
ComboBox1.Column(1, ComboBox1.ListCount - 1) = myContact.FullName
Next
Set myContacts = Nothing
Set myNameSpace = Nothing
Set MyOLApp = Nothing
End Sub
解决方案
首先,遍历联系人文件夹中的所有项目并不是一个好主意。这可能是一项耗时的操作,因此 Outlook UI 在完成之前可能会被冻结。相反,您可以考虑在 Outlook 中使用表格。
表表示文件夹或搜索对象中的只读动态数据行集。您可以使用Folder.GetTable或Search.GetTable来获取一个 Table 对象,该对象表示文件夹或搜索文件夹中的一组项目。如果 Table 对象是从Folder.GetTable获得的,您可以进一步指定一个过滤器(在Table.Restrict中)以获取文件夹中项目的子集。如果不指定任何过滤器,您将获取文件夹中的所有项目。
默认情况下,返回的 Table 中的每个项目仅包含其属性的默认子集。您可以将 Table 的每一行视为文件夹中的一个项目,将每一列视为项目的一个属性,将 Table 视为内存中的轻量级行集,允许快速枚举和过滤文件夹中的项目。虽然底层文件夹的添加和删除是通过表中的行来反映的,但表不支持任何添加、更改和删除行的事件。如果您需要 Table 行中的可写对象,请从 Table 中的默认EntryID
列中获取该行的 Entry ID,然后使用NameSpace对象的GetItemFromID方法获取完整项,例如MailItem或ContactItem,支持读写操作。有关表中默认列的更多信息,请参阅表对象中显示的默认属性。
因此,您可以使用联系人的全名检索表对象,EntryID
如果选中,该对象可用于获取实际项目。或者只是将所需的属性获取到 table 对象中,因此您不需要在代码中获取实际的 item 实例。好吧,这取决于您的需求...
推荐阅读
- ruby-on-rails - 如何使用带有查询参数的 Rails 片段缓存自动到期?
- typescript - 模块消费者的 TypeScript 声明合并
- angular - 如何将 json 数据显示到 p-dropdown 和 p-autocomplete 中?
- php - 将javascript日期和时间对象插入数据库
- asp.net-core - 从后台任务访问 DbContext 服务
- android - 为什么TextView textColor会自动调整为背景色调
- angular - TypeScript 编译中缺少 index.ts
- botframework - MS Teams 示例未向侦听机器人应用程序发送消息
- vbscript - 如何在 netstat 命令中传递参数?
- javascript - What range of problems jest.fn() is intended to solve?