跨多个 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" 文本。
我在 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" 文本。