1.问题总结

1.问题总结

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

相关内容