如何为我放在一起的宏正确实现 MailMergeAfterRecordMerge?

问题描述 投票:0回答:1

请原谅我的无知,我只是一只试图学习新技巧的老狗,但我无法将这些点连接起来......

我的邮件合并 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
vba ms-word mailmerge
1个回答
0
投票

在合并期间“触发”邮件合并事件之前,需要启用文档的事件。

要实现这一目标,您需要的不仅仅是您在问题中发布的代码,如您引用的文章中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 个字符。

© www.soinside.com 2019 - 2024. All rights reserved.