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
'
我最初的建议是手动添加的画线在模板文件您正在使用,这将避免需要重新创建它们在每个你用这个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
在您的示例屏幕截图中,我假设“下划线”是由shift和'-'键创建的模拟下划线?我想你不得不从你的模板中删除这些,而是插入一个位于文本下方的绘图对象(线条)。 –
是的,你对你的假设是正确的。好。我看看绘图线。 – bdpolinsky
是的,否则我不认为它可以工作,因为那些“下划线”实际上是输入到文档中的字符,并且不能将它们与文本本身结合使用。它是一个或另一个,你将以#1或#2结束,取决于你插入的位置,但不会#3,因为''Hello World''只会覆盖/替换''______________“'。 –