如果我们手里有一个设置了标题样式的Word
长文档,只需要在文档中使用“引用”面板的“目录”命令,即可为文档添加目录,此时点击目录项,就会跳转到文档正文中的相应位置。但是点击正文中的标题,却不能跳转到对应的目录项。此外,如果我们希望正文中相应章节页面的页眉也显示章节标题,那么就必须在章节标题前添加分节符,这样才能实现不同章节的页眉互不影响。在每个章节前插入分节符以及给每节添加不同的页眉,并且实现点击每节的标题和页眉也能跳转到目录的相应位置,对于长文档来说,用手工输入肯定是比较困难的。本文介绍以下三个宏实现这一需求。下面的宏对文档规范化的要求是:每个标题的大纲级别是该标题下面所有内容中大纲级别最高的,并且标题不能是空行。
首先在每个指定级别的标题前添加分节符。推荐添加分页型分节符。如果章节较短,添加连续型分节符,如果某一页上靠前的一部分内容属于上一节的正文,中间出现下一节的标题,由于这一节的页眉属于上一节,这一页页眉的内容与页面上的标题就会对应不上。
Sub 指定级别标题前插入分节符()
Dim pos As Long, styleBodyText$, styleHeading$
styleBodyText = "正文" '正文文本的样式名
styleHeading = "标题 3" '要插入分节符的标题的样式名
outlineHeading = wdOutlineLevel3
Application.ScreenUpdating = False
With Selection
.StartOf wdStory
Do
pos = .Start
.GoToNext wdGoToHeading
If pos = .Start Then Exit Do
If .ParagraphFormat.Style = styleHeading Then
'如果章节较短,可插入连续分节符wdSectionBreakContinuous,
'否则宜插入分页分节符wdSectionBreakNextPage。
'推荐使用分页型分节符,这样页眉中的超链接与节标题可以一一对应
'为了不改变原文档的大纲结构,先将标题降格为正文再插入分节符,然后恢复标题的样式
.ParagraphFormat.Style = styleBodyText
.InsertBreak Type:=wdSectionBreakContinuous
.ParagraphFormat.Style = styleHeading
End If
Loop
End With
Application.ScreenUpdating = True
End Sub
为文档添加目录可以用手工完成。在正文标题插入超链接时以便于跳转到目录项时,需要提供书签定位目录项,作为超链接的链接目标。一个目录项的构成是“标题文本+前导符+页码”,考虑到目录项与标题段落包含了相同的文本内容,从简化编程的角度考虑可以用标题段落文本作为每个目录项的书签名。如果标题段落里包含空格等不合法的标签名字符,可以考虑使用正则表达式或Selection
对象的Find
方法里的Replace
功能将不合法字符全部替换为空字符,只保留合法字符。要注意VBA
的Rplace
函数无法使用正则表达式,所以不很适用(本文示例文档标题中不包含非法标签名字符,因此未做处理)。取得标题段落的文本比较简单,从目录项中取得标题文本,则需要找到前导符在目录项文本中的位置,然后使用Left
函数截取该位置左边的全部文本。这里的困难在于要找到前导符的位置,却无法直观地用一个字符来表示前导符进行查找(例如,用省略号或者圆点字符并不能找到圆点前导符的位置)。这里可以考虑将前导符的ASCII
码传给chr
函数,由chr
函数将前导符的ASCII
码转换为字符。先用鼠标在目录项中选择以前导符开头的若干字符,然后运行如下VBA
代码,前导符的ASCII
码就会输出到立即窗口中:
Sub Test()
Debug.Print