【问题标题】:Word Automation (VBA): Mail Merge Rich Text FormatWord 自动化 (VBA):邮件合并富文本格式
【发布时间】:2019-12-17 21:02:11
【问题描述】:

我正在尝试通过我的 Access 项目中的 VBA 执行 Word MailMerge。我创建了一个 clsWordMerge 类,这样我就可以声明 Word 应用程序 WithEvents,并利用 Word 的 MailMerge 事件,主要是 AfterMerge 事件。

一切正常,我创建了完成的 Word 文档,除了包含 RTF 数据的源字段最终在文档中不是格式化文本,而是 RTF 代码和数据:

<div><font face="Times New Roman" size=3 color=black>This is my <strong><em>test </em></strong>paragraph.</font></div>

我希望看到的地方: 这是我的测试段落

无论我为我的数据源或 Access 表使用 CSV 文件进行邮件合并,都会发生这种情况。

那么有没有办法纠正这个问题,并显示格式化的数据?我可以访问 Word 提供的所有 MailMerge 事件。

谢谢..

【问题讨论】:

    标签: vba ms-word mailmerge


    【解决方案1】:

    不,无法在 RTF 中合并并使其显示为 Word 内容。 RTF 不是 Word 的本机文件格式 - 需要转换器才能将 RTF 显示为 Word 内容。

    邮件合并按字面意思显示数据文本,就像它出现在数据源中一样。没有“高级功能”可以选择性地格式化邮件合并结果。

    另外,基于痛苦的经验,不建议依赖MailMergeAfterMerge。当它被引入时,我尝试过,很热情……直到它开始失败。该事件不可预测且不可靠。

    根据您的要求,将完全由 VBA 驱动的数据从 Access 传输到 Word 是一种更好的时间和精力投资。

    【讨论】:

    • 谢谢。 MailMergeAfterMerge 不可靠太糟糕了,它似乎是一个完美的地方来做清理工作,比如关闭模板和搜索/替换生成的文档。
    • 我担心在邮件合并尚未完成的情况下对调用者进行清理工作,因此该事件似乎很完美。如果这不是问题,我根本不需要一个类,只需要一个模块中的方法,不需要任何事件。我想我会简单地删除整个富文本内容,并使用常规文本和标准邮件合并。我们可以对文档模板进行一些样式设置。非常感谢...
    【解决方案2】:

    它可能在某些情况下可以完成,但我同意 Cindy Meister 的观点,即邮件合并事件尚未被证明是可靠的(除非它们已被修复 - 我实际上已经多年没有使用它们了)。以下对我之前在尝试此操作时遇到的实际和可能问题的描述可能会有所帮助:

    1. 不确定是否可以合并到电子邮件。

    2. AFAICR 您可能需要的事件 (MailMergeBeforeRecordMerge) 仅在 Word 每次处理主文档时触发,而不是在每次处理数据源中的记录时触发。因此,如果您的邮件合并主文档“使用”多个数据源记录,例如因为它使用 { NEXT } 或 { NEXTIF } 字段,可能很难让 MaiMergeBeforeRecordMerge 做你需要的。如果我是对的,那足以让我推迟尝试。

    3. 为了插入您的“RTF”,您必须要么

      一个。拥有可以解释“RTF”编码并执行将其插入文档所需的所有正确操作的代码,或者 湾。有将“RTF”保存到外部文件的代码,然后使用(比如说) Range.InsertFile 插入它并让 Word 解释它的内容,或者也许 C。使用剪贴板帮助您进行转换。

      如果您的任何富文本字段实际上包含 RTF,那么 (a) 将很困难,除非您能找到合适的库来帮助您。但实际上,您的示例显示了一个典型的 Access 富文本字段值,它类似于 HTML。事实上,我认为它是 Word 可以解释的所有标准 HTML 标记,但我不确定。这可能更容易解释,特别是如果您只需要纯文本(最简单的情况下,您可能可以丢弃标记并插入结果。

    4. 如果富文本长度超过 255 个字符(包括标记),Word 的 Document.MailMerge.DataSource.DataFields("Word 看到的区分大小写的字段名称").Value 将被截断。因此,如果您需要整个文本或更多文本,则必须在其他地方获取它

    5. 使用 { MERGEFIELD } 字段插入到文档中的值不会被截断为 255 个字符,因此您可以从文档中获取值。 Word MailMerge 可能会施加另一个限制(不记得了,可能是 64Kb 用于 OLE DB 连接,可能更少,或者可能对整个数据有长度限制。

    6. 如果无法从文档中获取数据,可以直接从 Access 中获取。如果您的代码在 Access 中运行,可能相当容易,但可以通过使用 ADODB 或 Word VBA 代码中的 ADO 来完成。如果您想可靠地执行此操作,您的邮件合并数据源将需要检索记录的关键字段。在开发过程中,如果您的应用程序从 Access 运行,但您在 Word 中使用 VBA 代码,您可能还需要确保每次修改 Access VBA 代码时都保存您的 Access 数据库,否则 Access 会以独占方式打开数据库并且 Word将无法从中检索数据。

    7. 1234563 .您可以使用 Scripting.FileSystemObject 来保存文本,或者如果您已经使用 ADODB 来检索 Access 数据,也可以使用 ADODB.Stream。
    8. 您应该能够使用 VBA Range.InsertFile 来插入它,只要您有一些占位符告诉您要放置什么。或者您可以使用 INCLUDETEXT 字段并确保您的事件代码更新该字段。 INCLUDETEXT 方法的一个问题是,如果您合并到一个新文档,则 INCLUDETEXT 字段会保留在文档中,因此如果您更新它们,如果您不为每个源创建新文件,它们最终都会得到相同的结果记录。

    即很多事情要考虑!

    【讨论】:

    • 哇,感谢您提供令人难以置信的详细解释。似乎骰子在这个上对我不利。我会改用更简单的方法,也许会放弃所有的格式。再次感谢...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-20
    • 1970-01-01
    相关资源
    最近更新 更多