使用VBA在自动生成的目录和标题段落之间建立交叉链接

在编辑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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yivifu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值