请原谅我的无知,我只是一只试图学习新技巧的老狗,但我无法将这些点连接起来......
我的邮件合并 docm + xlsx 文档连接工作正常,从 VBA 编辑器手动运行时我的宏运行良好,但是我无法让它按邮件合并记录运行...
如果我能让微软的示例工作,我可以用它来学习它是如何工作的,但我什至无法让微软网站上的示例工作......
我使用的是 Microsoft Office 2013。
这就是我专门尝试重新创建以从中学习的内容:
https://learn.microsoft.com/en-us/office/vba/api/word.application.mailmergeafterrecordmerge
我的整个测试代码如下,我确信我遗漏了一些东西,所以请指定确切的内容和确切的位置,以便我可以获得 Microsoft 提供的示例代码。
谢谢你
Public WithEvents MailMergeApp As Word.Application
Private Sub MailMergeApp_MailMergeAfterRecordMerge(ByVal Doc As Document)
With Doc.MailMerge.DataSource
MsgBox .DataFields("FIRST_NAME").Value & " " & .DataFields(LAST_NAME).Value & " is merged."
End With
End Sub
在合并期间“触发”邮件合并事件之前,需要启用文档的事件。
要实现这一目标,您需要的不仅仅是您在问题中发布的代码,如您引用的文章中Syntax下的注释所示:“有关将事件与应用程序对象一起使用的信息,请参阅将事件与应用程序一起使用对象。”
我建议您这样做以使代码正常工作,然后根据需要进行重组,跳过您已经完成的任何步骤。
将邮件合并主文档另存为启用宏的文档 (.docm)
使用
Insert->Class Module
在该文档中插入类模块。
使用 VB 编辑器的属性窗格将模块重命名为
EventCLassModule
。
(您还需要确保代码中的
LAST_NAME
周围有引号)。
在文档的THisDocument模块中,放入以下代码
将 X 调暗为 EventClassModule
Sub DoTheMerge()
Set X = New EventClassModule
Set X.MailMergeApp = Word.Application
With ActiveDocument.MailMerge
.Destination = wdSendToNewDocument
.Execute
End With
Set X.MailMergeApp = Nothing
Set X = Nothing
End Sub
确保您的文档是活动文档(成功完成合并后不会是活动文档),然后运行
DoTheMerge
。
如果您只想启用事件,可以通过将以下代码添加到 ThisDocument 来实现
Sub EnableMergeEvents()
Set X = New EventClassModule
Set X.MailMergeApp = Word.Application
End Sub
然后,当您浏览功能区中的“完成并合并”选项时,合并应该在事件触发的情况下完成。然后您需要禁用事件,例如使用
Sub DisableMergeEvents()
Set X.MailMergeApp = Nothing
Set X = Nothing
End Sub
请注意,当您以这种方式启用事件时,它们(可能)将被启用以进行any合并(不仅仅是本文档),并且某些操作可能会导致事件被禁用(我忘记了我的头顶) ,但是例如更改事件例程之一可能会导致这种情况)。
实际上与您的问题无关,但如果您需要处理超过 255 个字符长的文本字段(“备注”字段),需要注意的是 Word 可能会正确合并它们,但 doc.Mailmerge.DataFields("NameOfTheMemoField")仅返回前 255 个字符。