Word VBA插入书签和格式

时间:2017-04-14 20:37:38

标签: excel vba ms-word word-vba

我试图将一系列78个值从Excel工作表插入到word文档中。这是为了便于生成word文档。以下代码允许我插入:

Option Explicit

Sub WriteExtension()
'
' WriteExtension Macro
'
'
        copyFile

        Dim nWord As New Document
        word.Application.ScreenUpdating = False

        Set nWord = Documents.Open("C:\target\file\here\targetfile", Visible:=False)


        'initialize excel variables
        Dim oExcel As Excel.Application
        Dim oWorkbook As workbook
        Dim oWorksheet As worksheet

        'initialize excel object
        Set oExcel = New Excel.Application
        oExcel.ScreenUpdating = False
        Set oWorkbook = oExcel.Workbooks.Open("source\spreadsheet\here\sourcespreadsheet.xlsx")
        Set oWorksheet = oWorkbook.Worksheets(Sheets("Extensions").Index)

        'setup loop variables
        Dim tempString As String
        Dim i As Long
        Dim bkMark As Bookmark

        'insert items from spreadsheet onto word document
        Dim insertText As String

        For i = 1 To 78
            nWord.Bookmarks("BM" & i).Select
            nWord.Bookmarks.Item("BM" & i).Range.InsertAfter (Cells(4, i + 6))
        Next i

        Dim filePath As String
        Dim fileName As String
        Dim newName As String

        'save the file as a PDF and close the PDF
        filePath = "C:\target\path\here"
        fileName = Cells(4, 13) & Cells(4, 12) & Cells(4, 79) & ".pdf"
        newName = filePath & fileName
        nWord.SaveAs2 fileName:=newName, FileFormat:=wdFormatPDF

        'close things
        nWord.Close False
       ' oWorksheet.
        oWorkbook.Close False
        oExcel.Quit
End Sub

'function takes the current extension template which has this macro in it, and copies it to a new blank word document
Function copyFile()

    Dim fso As Object
    Set fso = VBA.CreateObject("Scripting.FileSystemObject")

    Dim sourceFile As String
    Dim targetFile As String

    sourceFile = "c:\source\file\here\sourcedocument.docx"
    targetFile = "c:\target\file\here\targetfile"

    fso.copyFile sourceFile, targetFile

End Function

简而言之,该程序的作用是,它是从电子表格中获取信息,并试图在文档的特定位置插入特定单元格中的信息(或进行特定计算)。为了做到这一点,它首先获取一个示例文档(sourcefile),创建一个新文件(targetfile),然后将源文件复制到targetfile。这意味着文本,格式化和书签的放置都是完全复制的。

然后它初始化一个新的excel对象,在那里我保留我想要提供给文档的数据。它打开它,并为78个书签中的每一个运行78个单位长的循环。它保存新文档(以前称为目标文件),并根据Excel电子表格中的值对其进行命名。它将新文档保存为PDF。然后它关闭文档,关闭excel,然后关闭单词。

我遇到的问题是形成问题。基本上,我正在寻找插入发生在某种下划线或边界之上,而不是它取代线。想象一下填写一个应用程序 - 你在线上写,而不是插在旁边。它看起来并不像font.underline,因为它只是拥抱文本而不是下划线的东西。它可能,也许我还没有完全充实它,但我希望Stackoverflow的天才可以帮助我。

所以问题是:如何在书签旁边插入内容,以便我可以将其插入到行而不是旁边?换句话说,如何使用书签/页面格式使文本显示为#3,而不是#1或#2。大部分时间它显示为#1。

此代码有效

        Dim i As Long
        Dim bkMark As Bookmark

        'insert items from spreadsheet onto word document
        Dim insertText As String

        Dim startX As Long
        Dim startY As Long


     For i = 1 To 2

        startX = ActiveDocument.Bookmarks.Item("BM" & i).Range.Information(wdHorizontalPositionRelativeToPage)
        startY = ActiveDocument.Bookmarks.Item("BM" & i).Range.Information(wdVerticalPositionRelativeToPage) + 13
        'Dim shp As Shape
         With ActiveDocument.Shapes.AddLine(startX, startY, startX + 200, startY).Line
            .ForeColor.RGB = RGB(0, 0, 0)

         End With
    Next i
'

enter image description here

2 个答案:

答案 0 :(得分:1)

我的原始建议是在您正在使用的模板文件中手动添加绘图线,这样可以避免在您创建的每个复制版本中重新创建它们使用这个VBA程序,我仍然认为这会更好,但如果由于某种原因无法修改模板文件,那么你应该可以做类似下面的事情。

    Dim objLine as Shape   'declare a Shape object to represent the drawing object lines you'll insert

    For i = 1 To 2

        startX = ActiveDocument.Bookmarks.Item("BM" & i).Range.Information(wdHorizontalPositionRelativeToPage)
        startY = ActiveDocument.Bookmarks.Item("BM" & i).Range.Information(wdVerticalPositionRelativeToPage) + 13
        ' at each iteration, assign the return from AddLine method to the objLine variable
        Set objLine = ActiveDocument.Shapes.AddLine(beginX:=startX, beginy:=startY, endx:=startX + 200, endY:=startY)
        ' assign the RGB color to the objLine.Line.ForeColor
        objLine.Line.ForeColor.RGB = RGB(0, 0, 0)
        ActiveDocument.Bookmarks.Item("BM" & i).Range.InsertAfter ("Bookmark" & i)

    Next i

我们在这里做的是使用类型为objLine的对象变量Shape(这是绘图对象的对象类型,如行,文本框等,您可以在其中插入文档),并在每次迭代时将AddLine方法的返回值赋给此形状对象。随后,我们使用objLine并为其分配RGB颜色Line.ForeColor(行不具有Fill属性。)

答案 1 :(得分:0)

根据您的描述,听起来好像您正在尝试创建表单。

如果您在Excel中创建表单,则可以格式化包含带有单行底部边框的响应的每个单元格。

现在将相同的思维转换为Word - 将表单设置为一个表格,其中需要输入的单元格使用底部边框格式化。将书签放在需要从Excel添加数据的单元格中。

在书签中插入值时,无需选择它。因此,您可以将代码的这一部分简化为:

For i = 1 To 78
    nWord.Bookmarks("BM" & i).Range.InsertAfter (Cells(4, i + 6))
Next i