我正在开发一个 VBA 项目来自动编写通用报告。该报告要求每页顶部有“标题”,其中包含页码和一些识别信息。关键是这个“标题”实际上不能位于 Word 的标题空间中,它必须位于常规文本正文中。标题适用于除第一页和最后一页之外的所有页面。
我编写了以下代码来执行此操作。下面的块是保存文件之前执行的最后一件事。我遇到的问题是,输入的文本仅位于循环第一次迭代的页面顶部。后续迭代位于正确的页面上,但距离顶部向下 2-3 行。
p = 2
pTot = ActiveDocument.ActiveWindow.Panes(1).Pages.Count
Do While p < pTot
Selection.GoTo What:=wdGoToPage, Count:=p
Selection.TypeText Text:= "header text page " & CStr(p-1)
ActiveDocument.Fields.Update
p = p + 1
Loop
它的行为就好像在进入 Do 循环之前就决定了每个页面的顶部,而不是每次通过循环都重新评估。我尝试使用 ActiveDocument.Fields.Update 强制重新评估,但没有成功。
在输入文本之前,如何确保所选内容位于给定页面的顶部?
使用
range
对象代替选择和 InsertBefore
:
Sub insertHeader()
Dim pTot As Long
pTot = ActiveDocument.ActiveWindow.Panes(1).Pages.Count
Dim rg As Range
Set rg = ActiveDocument.Content
Dim p as Long
For p = 2 To pTot - 1
Set rg = rg.GoTo(what:=wdGoToPage, Count:=p)
rg.InsertBefore "header text page " & CStr(p - 1)
Next
With ActiveDocument
.Fields.Update
End With
End Sub