在编辑Word
文档时,如果给标题段落指定了具有大纲等级的样式名称(如软件默认的“标题 1”、“标题 2”等),那么可以很轻松地通过“引用”面板的“目录”自动插入目录,点击目录项(或ctrl+点击,由选项设置决定)即可轻易导航到标题段落所在位置。可惜的是,这种导航是单向的,要从标题段落返回到目录,就没法简单地通过点击标题段落实现。
要创建从标题段落到目录的导航,需要先将目录项定义为书签。当然可以手动完成,但是目录项太多恐怕心烦、错误和遗漏在所难免。如果可以通过域代码添加书签,那么在将目录转换为域代码后再依靠使用通配符的查找替换功能来替换可能是一个比较好的方法,但目前所有版本的Word
似乎还没有这个功能,至少我翻阅域代码文档后没找到方法,微软官方对下图的提问也没有给出如何解决的答复:
所以,几乎只有求助VBA
这一个途径来自动实现前述需求。
以下是实现代码,其中有详细注解:
Sub 自动建立标题段落与目录的链接()
'不使用这个错误跳转语句会在第一个标题段落插入超链接前发生无效过程或参数错误,通过调试显示段落文本为不可显示字符(估计是分页符之类),原因不明
On Error Resume Next
Dim aPara As Paragraph
'需要先将自动生成的目录全选以建立选区,通过遍历目录区域为每个目录项建立书签
For Each aPara In Selection.Paragraphs
With ActiveDocument.Bookmarks
.DefaultSorting = wdPosition
.Add Range:=aPara.Range, _
'我正做脂砚斋重评石头记注解,所以标题段落都是“第##回”加空格开头,书签名就用的"con_"加上回目序号。这行代码需要根据标题段落的具体情况进行修改。VBA中indexOf的功能由`InStr`函数提供。
name:="con_" & Left(aPara.Range.Text, InStr(aPara.Range.Text, " ") - 1)
End With
Next
'移动一下光标
Selection.MoveUp
For Each aPara In ActiveDocument.Paragraphs
'在样式名相符的段落添加超链接
If aPara.Style = "标题 1" Then
ActiveDocument.Hyperlinks.Add Anchor:=aPara.Range, Address:="", _
SubAddress:="con_" & Left(aPara.Range.Text, InStr(aPara.Range.Text, " ") - 1)
End If
Next
End Sub
说明:本想编出一行更通用的书签命名的代码,但Word
中书签的命名有限制,目录页码前的前导符和标题段落中可能出现的某些特殊符号都是非法字符,简单以数字序号的方式命名书签倒是也可以通用地完成上述代码的功能,不过我个人更愿意使用与文件内容关联的书签名称。如果愿意,可以在两个For
循环中各添加一个计数变量i
,用下面的代码给第一个For
循环中的name
和第二个For
循环中的SubAddress
参数赋值,然后增加i
的值:
"bookmark" & i