从模板插入Word文档并从Excel填充书签

从模板插入Word文档并从Excel填充书签,excel,vba,ms-word,Excel,Vba,Ms Word,我需要打开一个模板文件,填充它的书签,插入同一模板的新页面,再次填充书签。。。但仅在插入的页面上 Sub test() Dim WA As Object, WD As Object Set WA = CreateObject("Word.Application") Set WD = WA.Documents.Add(TemplatesName) For i = 1 To 100 fillBookmarks WA, WD

我需要打开一个模板文件,填充它的书签,插入同一模板的新页面,再次填充书签。。。但仅在插入的页面上

Sub test()
Dim WA As Object, WD As Object
    Set WA = CreateObject("Word.Application")
    Set WD = WA.Documents.Add(TemplatesName)
        For i = 1 To 100
            fillBookmarks WA, WD
            With WD.Range
                .Collapse 0
                .InsertBreak Type:=wdSectionBreakNextPage
                .End = WD.Range.End
                '.Collapse 0
                .InsertFile TemplatesName
            End With
        Next i
    WD.SaveAs PdfFile, 17
    WD.Close False: Set WD = Nothing
    WA.Quit False: Set WA = Nothing
End Sub

Function fillBookmarks(ByVal WA As Object, ByVal WD As Object)
    With WD
        .Bookmarks.Item("Client_Code").Range.Text = "545"
            .Bookmarks.Item("Client_Code").Delete
        .Bookmarks.Item("Company_Name").Range.Text = "545"
            .Bookmarks.Item("Company_Name").Delete
        .Bookmarks.Item("Company_Street").Range.Text = "545"
            .Bookmarks.Item("Company_Street").Delete
        .Bookmarks.Item("Company_PostCode").Range.Text = "545"
            .Bookmarks.Item("Company_PostCode").Delete
        .Bookmarks.Item("Company_Country").Range.Text = "545"
            .Bookmarks.Item("Company_Country").Delete
    End With
End Function
更新:以下内容做得很好,但按相反的顺序(第一页变为最后一页)如何反转

        With WD.Range
            .InsertBreak Type:=wdSectionBreakNextPage
            .Collapse Direction:=wdCollapseEnd
            .MoveEnd Unit:=wdCharacter, Count:=-1
            .InsertFile TemplatesName
        End With

书签仅在第一页上填充(也是在删除之后),因此如何从模板插入页面并填充书签?

这里有几个问题:1。书签名称在文档中必须是唯一的。因此,每当您插入新部分时,如果书签名称已经存在,则书签将被删除。2.在新材质的正确位置获取插入点

使用Word
Range
对象是正确的方法,但需要稍微改进。问题中的代码总是试图处理整个文档。然而,有必要使用更“针尖”的范围。我声明了两个范围对象:一个用于整个文档,另一个用于标记新内容应该插入的位置的“pin point”

注意使用
Duplicate
来“复制”原始文档范围。如果使用的是
=
,那将是一个完全相同的副本:更改一个将自动更改另一个

另请注意,这两个范围的
开始
结束
属性的用户总是将“pin point”范围定位在文档的末尾

不需要将Word应用程序传递给填充书签的函数,因此我在下面的示例代码中删除了它

对于遇到此问题并希望使用代码的人:如果书签是[content]而不是I-beam类型(书签中有文本),则原始代码将导致错误。将文本写入[content]书签会自动删除书签。在这种情况下,函数
fillBookmarks\u with content
将起作用。最后的函数
fillRemoveBookmarks
将适用于这两种类型的书签

Sub test()
Dim WA As Object, WD As Object
Dim rngDoc as Object, rngInsert as Object 'both data type Word.Range
    Set WA = CreateObject("Word.Application")
    Set WD = WA.Documents.Add(TemplatesName)
    Set rngDoc = WD.Content
    Set rngInsert = rngDoc.Duplicate
        For i = 1 To 100
            fillBookmarks WD
            With rngInsert
                .Start = rngDoc.End
                .InsertBreak Type:=wdSectionBreakNextPage
                .Start = rngDoc.End
                .InsertFile TemplatesName
            End With
        Next i
    WD.SaveAs PdfFile, 17
    WD.Close False: Set WD = Nothing
    WA.Quit False: Set WA = Nothing
End Sub

Function fillBookmarks(ByVal WD As Object)
    With WD
        .Bookmarks.Item("Client_Code").Range.Text = "545"
            .Bookmarks.Item("Client_Code").Delete
        .Bookmarks.Item("Company_Name").Range.Text = "545"
            .Bookmarks.Item("Company_Name").Delete
        .Bookmarks.Item("Company_Street").Range.Text = "545"
            .Bookmarks.Item("Company_Street").Delete
        .Bookmarks.Item("Company_PostCode").Range.Text = "545"
            .Bookmarks.Item("Company_PostCode").Delete
        .Bookmarks.Item("Company_Country").Range.Text = "545"
            .Bookmarks.Item("Company_Country").Delete
    End With
End Function

Function fillBookmarks_withContent(ByVal WD As Object)
    With WD
        .Bookmarks.Item("One").Range.Text = "545"
        .Bookmarks.Item("TWo").Range.Text = "544"
    End With
End Function

Function fillRemoveBookmarks(ByVal wd As Word.Document)
    With wd
        .Bookmarks.Item("One").Range.Text = "545"
        If Bookmarks.Exists("One") Then .Bookmarks("One").Delete

        .Bookmarks.Item("TWo").Range.Text = "544"
        If Bookmarks.Exists("Two") Then .Bookmarks("Two").Delete
    End With
End Function

我建议用[F8]逐步检查代码,以确定问题所在。更多信息请参见Chip Pearson's。最后一部分是什么,命名并立即删除相同的书签?也许您可以准确地解释您正试图做什么,并将示例数据作为可应用数据包含在内,以重现问题。请参见如何创建。删除书签以防止在插入带有相同书签的新页面后再次将数据粘贴到书签中。这听起来不是一个理想的设置。书签是半永久性的,周围的数据应该改变。“545”的意义是什么?这是一个示例,值动态变化这看起来像是邮件合并的作业,而不是宏。