如果我们手里有一个设置了标题样式的Word
长文档,只需要在文档中使用“引用”面板的“目录”命令,即可为文档添加目录,此时点击目录项,就会跳转到文档正文中的相应位置。但是点击正文中的标题,却不能跳转到对应的目录项。此外,如果我们希望正文中相应章节页面的页眉也显示章节标题,那么就必须在章节标题前添加分节符,这样才能实现不同章节的页眉互不影响。在每个章节前插入分节符以及给每节添加不同的页眉,并且实现点击每节的标题和页眉也能跳转到目录的相应位置,对于长文档来说,用手工输入肯定是比较困难的。本文介绍以下三个宏实现这一需求。下面的宏对文档规范化的要求是:每个标题的大纲级别是改标题下面所有内容中大纲级别最高的,并且标题不能是空行。
首先在每个指定级别的标题前添加分节符。推荐添加分页型分节符。如果章节较短,添加连续型分节符,如果某一页上靠前的一部分内容属于上一节的正文,中间出现下一节的标题,由于这一节的页眉属于上一节,这一页页眉的内容与页面上的标题就会对应不上。
Sub 指定级别标题前插入分节符()
Dim pos As Long
With Selection
.StartOf wdStory
Do
pos = .Start
.GoToNext wdGoToHeading
If pos = .Start Then Exit Do
If .ParagraphFormat.OutlineLevel = wdOutlineLevel1 Then
'如果章节较短,可插入连续分节符wdSectionBreakContinuous,
'否则宜插入分页分节符wdSectionBreakNextPage。
'推荐使用分页型分节符,这样页眉中的超链接与节标题可以一一对应
.InsertBreak Type:=wdSectionBreakNextPage
End If
Loop
End With
End Sub
为文档添加目录可以用手工完成。须注意的是如果没有在目录最后添加一个空行,下面的代码应该参考注释进行修改。为了使正文中的标题及页眉能够链接到相应的目录项,必须为每个目录项添加书签。以下的宏实现了这个功能,标签名也就是对应的标题的内容。
Sub 为每个目录项添加书签()
Dim aPara As Paragraph, txt$
ActiveDocument.TablesOfContents(1).Range.Select
For Each aPara In Selection.Paragraphs
txt = aPara.Range.Text
If Len(txt) > 1 Then
' 在目录项中截取标题文本作为书签名
txt = Left(txt, InStr(txt, Chr(9)) - 1) 'chr(9)为目录前导符
'在插入目录后应该将光标定位到最后一条目录结尾输入一个空行,最后一条目录的Range才不会是整个目录
'如不多输入一个空行,不应直接用aPara.Range作为下面的Add方法的参数,
'应该构造一个Range:ActiveDocument.Range(aPara.Range.Start, aPara.Range.End - 1)
ActiveDocument.Bookmarks.Add _
Range:=aPara.Range, Name:=txt
End If
Next
End Sub
最后是在每节的节标题区域插入到目录的链接,同时修改各节页眉,添加相应内容并插入链接。我在此前的博客中也写过实现相同功能的代码,但很显然都没有本文中的代码简洁高效:
Sub 处理节标题和页眉的链接()
Dim aSec As Section, pos As Long, txt$, aPara As Paragraph, leadingTxt$
leadingTxt = "前导字符串"
Application.ScreenUpdating = False
For Each aSec In ActiveDocument.Sections
With Selection
' 节标题为每节第一个段落
Set aPara = aSec.Range.Paragraphs(1)
'本文处理的标题大纲级别为1,VBA中有相应大纲级别常量定义
'如果文档编写规范,可以省略这个if判断语句
If aPara.OutlineLevel = wdOutlineLevel1 Then
txt = Replace(aPara.Range.Text, Chr(13), "") '去掉段落结尾的回车符
' Debug.Print txt
' 文档如果没有空白标题行,也可以省略下面的if判断
If Len(txt) > 1 Then
'将节标题链接到目录,注意在第一个宏中在目录项设置了以标题文本为书签名的书签
ActiveDocument.Hyperlinks.Add Anchor:=aPara.Range, Address:="", _
SubAddress:=txt
'设置页眉与上一接不同
aSec.Headers(wdHeaderFooterPrimary).LinkToPrevious = False
'在本届页眉区域添加内容并设置超链接链接到目录项
With aSec.Headers(wdHeaderFooterPrimary).Range
'设置页眉中的文本。leadingTxt可以是书名,与节标题间添加一个Tab键
.Text = leadingTxt & vbTab & txt
.Font.Size = 10 ' 字体大小为五号
.ParagraphFormat.TabStops.ClearAll
'在页眉中添加右对齐制表位,将节标题对齐到右边
.ParagraphFormat.TabStops.Add Position:=CentimetersToPoints(16 _
), Alignment:=wdAlignTabRight, Leader:=wdTabLeaderSpaces
End With
ActiveDocument.Hyperlinks.Add Anchor:=aSec.Headers(wdHeaderFooterPrimary).Range, Address:="", _
SubAddress:=txt
End If
End If
End With
Next
Application.ScreenUpdating = True
' 恢复视图为页面视图
If ActiveWindow.View.SplitSpecial <> wdPaneNone Then
ActiveWindow.Panes(2).Close
End If
ActiveWindow.ActivePane.View.Type = wdPrintView
End Sub
本文含有隐藏内容,请 开通VIP 后查看