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

Word自动化(VBA):邮件合并富文本格式,vba,ms-word,mailmerge,Vba,Ms Word,Mailmerge,我正在尝试从Access项目中通过VBA进行Word邮件合并。我创建了一个clsWordMerge类,以便用事件声明Word应用程序,并利用Word的邮件合并事件,主要是AfterMerge事件 一切正常,我创建了完成的Word文档,除了包含RTF数据的源字段最终在文档中不是格式化文本,而是RTF代码和数据: <div><font face="Times New Roman" size=3 color=black>This is my <strong><

我正在尝试从Access项目中通过VBA进行Word邮件合并。我创建了一个clsWordMerge类,以便用事件声明Word应用程序,并利用Word的邮件合并事件,主要是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文件作为数据源还是访问表进行邮件合并,都会发生这种情况

那么,有没有办法纠正这一点,并显示格式化的数据?我可以访问Word提供的所有邮件合并事件


谢谢..

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

“邮件合并”按字面意思显示数据源中显示的数据文本。没有“高级功能”可以选择性地格式化邮件合并结果

此外,基于痛苦的经历,依靠
mailmergeftermerge
是不可取的。当它被介绍时,我试了一下,很热情。。。直到它开始失败。事件不可预测且不可靠


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

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

  • 如果您正在合并到电子邮件,则不确定是否可以执行任何操作

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

  • 为了插入“RTF”,您必须

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

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

  • 如果您的富文本长度超过255个字符(包括标记),Word的Document.MailMerge.DataSource.DataFields(“Word所看到的区分大小写的字段名称”)。值将被截断。因此,如果您需要整个文本或更多文本,您必须将其转移到其他地方

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

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

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

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


  • i、 e.需要考虑的事情太多了!

    哇,谢谢你难以置信的详细解释。这一次我似乎遇到了麻烦。我将换一个更简单的方法,也许放弃所有的格式设置。再次感谢……谢谢。MailMergeAfterMerge不可靠真是太糟糕了,它似乎是一个完美的地方,可以做像这样的清理工作关闭模板并对生成的文档进行搜索/替换。我担心在t情况下从调用方进行清理