Word VBA插入书签和格式

我试图从Excel表格插入一系列的78个值到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),创build一个新文件(targetfile),然后将源文件复制到targetfile。 这意味着文本,格式化和书签的位置都完全复制。

然后,它初始化一个新的Excel对象,在那里我保存我想要馈入到文档中的数据。 它将其打开,并为78个书签中的每一个运行78个单位的循环。 它保存新文档(以前称为targetfile),并根据excel电子表格中的值命名它。 它将新文档保存为PDF。 然后closures文件,closuresexcel,并closures文字。

我遇到的问题是格式化。 基本上,我正在寻找在某种下划线或边界之上发生插入,而不是取代线。 想象一下,填写一个应用程序 – 你写在线上,而不是插在旁边。 它似乎不像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 ' 

在这里输入图像说明

我最初的build议是在您使用的模板文件中手动添加绘图线,这样可以避免在使用此VBA过程创build的每个复制版本中重新创build绘图线,我仍然认为这样做会更好,但是如果由于某种原因不能修改模板文件,那么你应该可以做下面的事情。

  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 

我们在这里做的是使用Shapetypes的对象variablesobjLine (这是绘制对象的对象types,例如可以插入到Document中的Lines,TextBoxes等),并将AddLine方法的返回值AddLine给这个形状对象,每次迭代。 随后,我们使用objLine并将RGB颜色分配给Line.ForeColor (行没有Fill属性)。

从你的描述,听起来好像你正在尝试创build一个表单。

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

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

在书签上插入值时,不需要select它。 所以你可以简化你的部分代码来:

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