【发布时间】:2020-09-27 14:02:37
【问题描述】:
你好知识渊博的人!
背景:
我正在为我们的团队在 MS Word VBA 中开发一个自定义邮件合并工具,以便我们拥有超出标准 Office Word 邮件合并包的额外功能。第三方产品或插件不可能。但是,自动附加特定文件、自定义主题行等的能力将为我们节省大量时间和精力。
其中一项功能是使用户能够从我们的公司 Microsoft Exchange 全球地址列表 (GAL) 中选择额外的抄送 (CC) 或密件抄送 (BCC) 电子邮件帐户以附加到邮件合并中。用户可能需要选择多个抄送或密送电子邮件帐户。
问题:
使用以前的问题和答案 (30918152) 我能够调用地址簿 GAL 并自定义 To: / CC: / BCC : 标签。该代码能够检索.Recipients 集合中选定的交换帐户,但我正在努力确定哪些选择是CC 或BCC。
我知道Outlook.Recipient.Type 返回一个变量类型Long,它与From: / To: / CC: / BCC:
但是,当我debug.print 'recipient.type' 总是返回 1 时,即使选择了 CC 或 BCC。
有人知道我哪里出错了吗?
目前的进展:
我搜索了 MSDN,运行了多个网络搜索并搜索了 Stack Overflow、VBOffice.net 等地方,但没有找到我想要的东西。我是自学成才,所以怀疑我的根本问题是对 SelectNamesDialog.Recipients 上的 MSDN 页面缺乏了解
代码:
Private Sub cmdSetProjectMember1_Click()
' CODE TO SELECT FROM ADDRESS BOOK AND TAKE EMAIL ADDRESS WHEN IT IS AN EXCHANGE USER.
' TAKEN FROM https://stackoverflow.com/questions/30918152/opening-outlook-address-book-from-excel
Dim olApp As Outlook.Application
Dim oDialog As SelectNamesDialog
Dim oGAL As AddressList
Dim myAddrEntry As AddressEntry
Dim exchUser As Outlook.ExchangeUser
Dim TEST_Recipient As Outlook.Recipient
Dim AliasName As String
Dim FirstName As String
Dim LastName As String
Dim EmailAddress As String
Set aOutlook = GetObject(, "Outlook.Application")
Set oDialog = aOutlook.Session.GetSelectNamesDialog
Set oGAL = aOutlook.GetNamespace("MAPI").AddressLists("Global Address List")
With oDialog
.AllowMultipleSelection = True
.InitialAddressList = oGAL
.ShowOnlyInitialAddressList = True
.Caption = "Custom mail merge tool ***** | | ***** SELECT EMAIL FROM ADDRESS BOOK"
.NumberOfRecipientSelectors = olShowToCc
.ToLabel = "Select CC:"
.CcLabel = "Select BCC:"
If .Display Then
AliasName = oDialog.Recipients.Item(1).Name
Set myAddrEntry = oGAL.AddressEntries(AliasName)
Set exchUser = myAddrEntry.GetExchangeUser
If Not exchUser Is Nothing Then
FirstName = exchUser.FirstName
LastName = exchUser.LastName
EmailAddress = exchUser.PrimarySmtpAddress
'MsgBox "You selected contact: " & vbNewLine & _
'"FirstName: " & FirstName & vbNewLine & _
'"LastName:" & LastName & vbNewLine & _
'"EmailAddress: " & EmailAddress
Set TEST_Recipient = oDialog.Recipients.Item(1)
Debug.Print TEST_Recipient.Type
If TEST_Recipient.Type = olCC Then
MsgBox "Carbon Copy"
Else
MsgBox "NOT CC"
End If
End If
End If
End With
Set olApp = Nothing
Set oDialog = Nothing
Set oGAL = Nothing
Set myAddrEntry = Nothing
Set exchUser = Nothing
End Sub
【问题讨论】:
-
对话框关闭后如何遍历所有收件人?在上面列出的代码中,只检查了第一个收件人。
-
嗨,我还没有写那部分,但我计划使用
Recipients.Count进行一个简单的循环,它将提取每个 Exchange 用户的所有详细信息。我似乎无法提取的唯一部分是用户将它们选择为 CC 还是 BCC。 -
您是否尝试使用
Logon方法登录特定帐户? -
能否同时指定带有内部版本号的 Outlook 版本?
-
我不熟悉那个命令,但会去研究并让你知道。如果有什么不同,这是一个团队,所以我们中的任何人(约 15 人)都可以加载这个 MS Word 文件,登录到网络,然后运行这个邮件合并工具。我已经有其他代码可以提取他们的网络名称以显示在用户窗体上。
标签: vba outlook ms-word addressbook mailmerge