首页 > 解决方案 > 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

标签: vbaprintingoutlookcontacts

解决方案


首先,遍历联系人文件夹中的所有项目并不是一个好主意。这可能是一项耗时的操作,因此 Outlook UI 在完成之前可能会被冻结。相反,您可以考虑在 Outlook 中使用表格。

表表示文件夹或搜索对象中的只读动态数据行集。您可以使用Folder.GetTableSearch.GetTable来获取一个 Table 对象,该对象表示文件夹或搜索文件夹中的一组项目。如果 Table 对象是从Folder.GetTable获得的,您可以进一步指定一个过滤器(在Table.Restrict中)以获取文件夹中项目的子集。如果不指定任何过滤器,您将获取文件夹中的所有项目。

默认情况下,返回的 Table 中的每个项目仅包含其属性的默认子集。您可以将 Table 的每一行视为文件夹中的一个项目,将每一列视为项目的一个属性,将 Table 视为内存中的轻量级行集,允许快速枚举和过滤文件夹中的项目。虽然底层文件夹的添加和删除是通过表中的行来反映的,但表不支持任何添加、更改和删除行的事件。如果您需要 Table 行中的可写对象,请从 Table 中的默认EntryID列中获取该行的 Entry ID,然后使用NameSpace对象的GetItemFromID方法获取完整项,例如MailItemContactItem,支持读写操作。有关表中默认列的更多信息,请参阅表对象中显示的默认属性

因此,您可以使用联系人的全名检索表对象,EntryID如果选中,该对象可用于获取实际项目。或者只是将所需的属性获取到 table 对象中,因此您不需要在代码中获取实际的 item 实例。好吧,这取决于您的需求...


推荐阅读