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

时间:2018-08-14 05:41:53

标签: excel vba excel-vba ms-word word-vba

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

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 个答案:

答案 0 :(得分:1)

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

使用Word Range对象是正确的方法,但是需要进行一些改进。问题中的代码始终尝试使用整个文档。但是,有必要使用更“精确的”范围。我已经声明了两个Range对象:一个用于整个文档,一个用于标记应在其中插入新内容的“针点”。

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

还请注意使用这两个范围的StartEnd属性的用户,始终将“定位点”范围定位在文档的末尾。

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

对于遇到此问题并想使用代码的人:如果书签是[内容]而不是工字梁类型(书签中的文本 ),则原始代码将导致错误。将文本写入[内容]书签会自动删除该书签。在这种情况下,功能fillBookmarks_withContent将起作用。最后的功能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