1.问题总结
这是我第一次为 Word 编写 VBA。我有多个文档;每个文档都超过 100 页,并且根据段落编号有一个纯文本索引。我正在编写一个脚本,根据文档中使用的编号格式查找和标记段落,以便超链接索引条目和/或交叉引用文档。
2. 详细信息
编号格式{##-###.}
为连字符前为章节号,连字符后为段落序号。原始编号不包含前导零。
我在脚本中包含了字体颜色更改,以便任何未作为书签捕获的段落编号都会立即突出显示。
我被困的地方
- 当前脚本匹配文档中任意位置的表达式
{##-###.}
;这是一个问题,因为表格和图形使用与段落相同的格式进行编号。我需要以某种方式将此表达式仅与位于段落开头的字符串进行匹配。 - 当前脚本使用该
Bookmarks.Exists
方法来检查相同的书签姓名在创建书签之前。我还想同时检查书签地点就像Selection.Start
,但尚未学会如何。
3. 脚本
' Variables:
' pNum: verbatim result of the search expression
' arrPNum: array containing padded two-digit chapter at (0) and padded three-digit paragraph at (1)
' CleanPNum: chapter and paragraph reformatted into bookmark name
Sub makeBookmarks()
Selection.Find.ClearFormatting
With Selection.Find
.Text = "[0-9]{1,2}-[0-9]{1,3}."
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchByte = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = True
End With
For Each para In ActiveDocument.Paragraphs
Selection.Find.Execute
pNum = Selection
If pNum <> "" Then
arrPNum = Split(Left(pNum, Len(pNum) - 1), "-")
CleanPNum = "para_" & Format$(arrPNum(0), "00") & "_" & Format$(arrPNum(1), "000")
End If
If ActiveDocument.Bookmarks.Exists(CStr(CleanPNum)) = True Then
Selection.MoveRight Unit:=wdWord, Count:=1
Else
Selection.Font.Color = 15132391
Selection.MoveLeft Unit:=wdCharacter, Count:=1
With ActiveDocument.Bookmarks
.Add Range:=Selection.Range, Name:=CStr(CleanPNum)
.DefaultSorting = wdSortByName
.ShowHidden = False
Selection.MoveRight Unit:=wdWord, Count:=1
End With
End If
Next
End Sub