自动邮件合并

时间:2015-11-06 17:55:14

标签: vb.net vba ms-word office-interop

我需要使用Access数据库表中的文本动态生成word文档。需要注意的是,来自数据库的一些文本需要修改为MergeFields。我目前正在使用Interop.Word(VBA Macro)和VB.NET来生成文档。

到目前为止,我的步骤如下:

  1. 拉标准.docx模板
  2. 使用表格
  3. 中的预定义填充文字填写模板
  4. 通过用实际合并字段替换填充文本片段来添加MergeFields
  5. 附加数据源并执行邮件合并
  6. 经过测试,我注意到我不能简单地将MergeFields作为字符串存储到访问数据库中,它们不会反馈到实际文档中。我在想的是创建一个已知字符串的表,应该用编码替换为MergeFields。

    例如:

    第2步将插入“在@ INACTIVE_DATE之后@您的帐户将不再有效。”这将在数​​据库文本中。

    步骤3将使用MergeField«INACTIVE_DATE»查找/替换@ INACTIVE_DATE @。我正在使用Word Interop执行此操作,因此理论上我可以遍历文档。

    我无法从文本到MergeField进行“查找和替换”,那么我该如何实现呢?

    另外标记VBA,因为我正在寻找“VBA”式答案(Word Interop)。

1 个答案:

答案 0 :(得分:1)

你遗漏了很多细节,所以我会用一般的术语回答这个问题。

你想做的事情绝对是可以实现的。立即想到两种可能的解决方案:

  1. 使用Find
  2. 替换范围
  3. 使用TypeText
  4. 插入令牌

    使用Find

    替换范围

    假设已插入文本,您可以在文档中搜索给定的模式,并将其替换为合并字段。例如:

    Sub FindInsertMerge()
        Dim rng As Range
        Set rng = ActiveDocument.Range
    
        With rng.Find
            .Text = "(\@*\@)"
            .MatchWildcards = True
            .Execute
    
            If .Found Then
                ActiveDocument.MailMerge.Fields.Add rng, Mid(rng.Text, 2, Len(rng.Text) - 2)
            End If
        End With
    End Sub
    

    将找到以@开头的第一个文本,匹配任何字符串并以@结尾。然后,找到的范围的内容将被合并字段替换。上面的代码可以很容易地扩展到所有字段的循环。

    使用TypeText

    插入令牌

    虽然我通常建议不要使用Selection来插入数据,但这个解决方案很简单。假设您有一个目标范围rng,您要标记要插入的数据库文本,选择范围,开始输入,每当找到指定的邮件合并字段时,插入一个字段而不是文本。

    例如:

    Private Sub InsertMergeText(rng As Range, txt As String)
        Dim i As Integer
        Dim t As String
        Dim tokens() As String
    
        tokens = Split(txt, " ")
        rng.Select
    
        For i = 0 To UBound(tokens)
            t = tokens(i)
    
            If Left(t, 1) = "@" And Right(t, 1) = "@" Then
                'Insert field if it's a mail merge label.
                ActiveDocument.MailMerge.Fields.Add Selection.Range, Mid(t, 2, Len(t) - 2)
            Else
                'Simply insert text.
                Selection.TypeText t
            End If
    
            'Insert the whitespace we replaced earlier.
            If i < UBound(tokens) Then Selection.TypeText " "
        Next
    End Sub
    

    致电示例:

    InsertMergeText Selection.Range, "After @INACTIVE_DATE@ your account will no longer be active which will be in the database text."