Word VBA插入书签和格式化

问题描述:

我试图从Excel表格插入一系列78个值到Word文档中。这是为了便于生成Word文档。下面的代码可以让我插入:Word VBA插入书签和格式化

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个单位的循环。它保存新文档(以前称为targetfile),并根据excel电子表格中的值命名它。它将新文档保存为PDF。然后它关闭文档,关闭excel,并关闭单词。

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

所以问题是:我如何在书签旁边插入东西,以便我可以将它插入到行而不是旁边?换句话说,我如何使用书签/页面格式来使文本显示为#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

+1

在您的示例屏幕截图中,我假设“下划线”是由shift和'-'键创建的模拟下划线?我想你不得不从你的模板中删除这些,而是​​插入一个位于文本下方的绘图对象(线条)。 –

+0

是的,你对你的假设是正确的。好。我看看绘图线。 – bdpolinsky

+0

是的,否则我不认为它可以工作,因为那些“下划线”实际上是输入到文档中的字符,并且不能将它们与文本本身结合使用。它是一个或另一个,你将以#1或#2结束,取决于你插入的位置,但不会#3,因为''Hello World''只会覆盖/替换''______________“'。 –

我最初的建议是手动添加的画线在模板文件您正在使用,这将避免需要重新创建它们在每个你用这个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 

我们在这里所做的是使用Shape类型(这是绘画般的线条,文本框等对象的对象类型的对象变量objLine您可能会插入到文档中),并将AddLine方法的返回值分配给此形状对象,每次迭代时都会返回该值。随后,我们使用objLine并将RGB颜色分配给它的​​(行没有Fill属性)。

从你的描述听起来好像你正试图创建一个表单。

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

现在将相同的思想转化为Word - 将表单的输出格式设置为带有底部边框的单元格。将您的书签放在需要从Excel中添加数据的单元格中。

将值插入书签时,不需要选择它。所以,你可以简化你的代码的该部分:

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