跨多个 Word 文档填写书签的用户表单?

Userform to fill in bookmarks across multiple Word documents?

我在 Word 中创建了一个用户表单,它会自动填写一份包含顾问姓名、地址等的合同。但是,我有多个合同要发送给每个顾问,我希望能够输入信息一次,并让它填充所有合同。

我尝试搜索它是如何工作的,但我一直无法将我学到的点点滴滴拼凑成一个成功的执行。

如果相关的话,这是我在单个文档上的用户表单的代码——如果我什至可以用这个确切的表单填充多个文档,那将节省大量时间。

Private Sub CancelButton_Click()
    ConsultantInfo.Hide
End Sub

Private Sub FillButton_Click()
    Dim consultantName1 As Range
    Set consultantName1 = ActiveDocument.Bookmarks("ConsultantName1").Range
    Dim consultantName2 As Range
    Set consultantName2 = ActiveDocument.Bookmarks("ConsultantName2").Range
    Dim consultantName3 As Range
    Set consultantName3 = ActiveDocument.Bookmarks("ConsultantName3").Range
    Dim consultantNameCaps As Range
    Set consultantNameCaps = 
    ActiveDocument.Bookmarks("ConsultantNameCaps").Range
    consultantName1.Text = Me.TextName.Value
    consultantName2.Text = Me.TextName.Value
    consultantName3.Text = Me.TextName.Value
    consultantNameCaps.Text = Me.TextName.Value
    consultantNameCaps.Font.AllCaps = True
    Dim consultantTitle As Range
    Set consultantTitle = ActiveDocument.Bookmarks("ConsultantTitle").Range
    consultantTitle.Text = Me.TextTitle.Value
    Dim consultantAddress1 As Range
    Set consultantAddress1 = 
    ActiveDocument.Bookmarks("ConsultantAddress1").Range
    consultantAddress1.Text = Me.TextAddress1.Value
    Dim consultantAddress2 As Range
    Set consultantAddress2 = 
    ActiveDocument.Bookmarks("ConsultantAddress2").Range
    consultantAddress2.Text = Me.TextAddress2.Value
    Me.Repaint
    ConsultantInfo.Hide
End Sub

Private Sub FillSaveButton_Click()
    Dim consultantName1 As Range
    Set consultantName1 = ActiveDocument.Bookmarks("ConsultantName1").Range
    Dim consultantName2 As Range
    Set consultantName2 = ActiveDocument.Bookmarks("ConsultantName2").Range
    Dim consultantName3 As Range
    Set consultantName3 = ActiveDocument.Bookmarks("ConsultantName3").Range
    Dim consultantNameCaps As Range
    Set consultantNameCaps = 
    ActiveDocument.Bookmarks("ConsultantNameCaps").Range
    consultantName1.Text = Me.TextName.Value
    consultantName2.Text = Me.TextName.Value
    consultantName3.Text = Me.TextName.Value
    consultantNameCaps.Text = Me.TextName.Value
    consultantNameCaps.Font.AllCaps = True
    Dim consultantTitle As Range
    Set consultantTitle = ActiveDocument.Bookmarks("ConsultantTitle").Range
    consultantTitle.Text = Me.TextTitle.Value
    Dim consultantAddress1 As Range
    Set consultantAddress1 = 
    ActiveDocument.Bookmarks("ConsultantAddress1").Range
    consultantAddress1.Text = Me.TextAddress1.Value
    Dim consultantAddress2 As Range
    Set consultantAddress2 = 
    ActiveDocument.Bookmarks("ConsultantAddress2").Range
    consultantAddress2.Text = Me.TextAddress2.Value
    ActiveDocument.SaveAs2 FileName:=ActiveDocument.Path & "\Consulting 
    Agreement Master " & consultantName1, FileFormat:=wdFormatDocument
    ActiveDocument.SaveAs2 FileName:=ActiveDocument.Path & "\Consulting 
    Agreement Master " & consultantName1, FileFormat:=wdFormatPDF
    Me.Repaint
    ConsultantInfo.Hide
End Sub

可以使用 IncludeText 字段将 Word 文档 link 内容添加到另一个文档的书签中。但这意味着您需要保留该 "source" 文档中的书签。就目前而言,您的代码可能正在删除书签。例如,在将数据写入书签后,您需要如何更改代码以确保数据在书签内:

Dim doc as Word.Document
Set doc = ActiveDocument
Dim rngConsultantNameCaps As Range
Dim sConsultantNameCaps as String
sConsultantNameCaps = "ConsultantNameCaps"
Set rngConsultantNameCaps = doc.Bookmarks(sConsultantNameCaps).Range
rngConsultantNameCaps.Text = Me.TextName.Value
doc.Bookmarks.Add(sConsultantNameCaps, rngConsultantNameCaps)

打开每个文档("data template" 除外)并用以下字段替换每个书签:

{ IncludeText "Path and filename" "bookmarkName" }

(请记住,如果您手动插入 { } 括号,则需要使用 Ctrl+F9 插入。)

如果所有文档都将保存在同一个文件夹中,则不需要整个路径 - 源文件名就足够了。 Word 会自动在同一文件夹中查找源文件。

link 也会带来字符格式。如果您不想这样,请将 \* CharFormat 开关添加到字段代码以强制它保持应用于字段第一个字符的格式:

{ IncludeText "Path and filename" "bookmarkName" \* CharFormat }

如果有很多文档,编写一个宏来执行此操作甚至可能是有意义的:只需循环书签,保存书签名称,在该范围内插入带有书签名称的字段。

稍后需要单独打开文档并更新字段(也可以在打印时完成)。

请注意,也可以使用 Link 字段,但该字段类型使用 OLE 进行通信,这有点 "overkill" 用于镜像 "simple" 文本。