Word 自动化 (VBA):邮件合并富文本格式

Word Automation (VBA): Mail Merge Rich Text Format

我正在尝试通过 VBA 从我的 Access 项目中执行 Word MailMerge。我创建了一个 clsWordMerge class 这样我就可以声明 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>

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

无论我使用 CSV 文件作为数据源还是 Access table.

进行邮件合并,都会发生这种情况

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

谢谢..

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

邮件合并按字面显示数据文本,因为它出现在数据源中。没有 "advanced features" 可以选择性地格式化邮件合并结果。

另外,根据惨痛的经验,依赖MailMergeAfterMerge是不可取的。当它被介绍时,我尝试了,很热情……直到它开始失败。该事件不可预测且不可靠。

鉴于您的要求,从 Access 到 Word 的完全 VBA 驱动的数据传输是对时间和精力的更好投资。

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

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

  2. AFAICR 您可能需要的事件 (MailMergeBeforeRecordMerge) 仅在每次 Word 处理主文档时触发,而不是每次处理数据源中的记录时触发。因此,如果您的邮件合并主文档 "consumes" 不止一个数据源记录,例如因为它使用 { NEXT } 或 { NEXTIF } 字段,所以可能很难让 MaiMergeBeforeRecordMerge 执行您需要的操作。如果我是对的,那足以让我放弃尝试。

  3. 为了插入您的 "RTF",您必须

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

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

  4. 如果您的富文本长度超过 255 个字符(包括标记),Word 的 Document.MailMerge.DataSource.DataFields("the case-sensitive field name as Word sees it").Value 将被截断。因此,如果您需要整个文本或更多文本,则必须从其他地方获取它

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

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

  7. 如果您需要使用 (b) 或 (c) 将您的 HTML 保存到文件中,那么您可能需要包围从 Access 获得的 HTML使用标签和可能的标签让 Word 识别 HTML。您可以使用 Scripting.FileSystemObject 来保存文本,或者如果您已经在使用 ADODB 检索 Access 数据,则可以使用 ADODB.Stream。

  8. 你应该可以使用 VBA Range.InsertFile 来插入它,只要你有一些占位符告诉你要放什么。或者您可以使用 INCLUDETEXT 字段并确保您的事件代码更新该字段。 INCLUDETEXT 方法的一个障碍是,如果您合并到一个新文档,INCLUDETEXT 字段将保留在文档中,因此如果您更新它们,如果您不为每个源创建一个新文件,它们最终都会得到相同的结果记录.

即想了很多!