首页 > 解决方案 > 添加对使用带有编号的项目宏的正则表达式找到的数字或文本的交叉引用

问题描述

我必须从文档中找到格式或正则表达式的文本 -"([\(]){1}([0-9]){1, 2}([\)]){1}"

我想用对使用 word 宏找到的相应编号项目的交叉引用替换正则表达式中单独找到的数字。唯一的条件是它不应该采用带有样式的数字项目 - “Heading1”(它有一个数字项目)

例如:找到的文本:“(1)”仅在数字处用交叉引用替换文本

我使用的代码会引发运行时错误:“需要对象”。

Dim WorkPara As String
Dim CheckP() As Boolean
Dim NumPara As Integer, J As Integer
NumPara = ActiveDocument.Paragraphs.count

ReDim CheckP(NumPara)
For J = 1 To NumPara
    CheckP(J) = False
    WorkPara = ActiveDocument.Paragraphs(J).Range.Text
    If InStr(WorkPara, regex.Pattern("([\(]){1}([0-9]){1}([\)]){1}")) > 0 Then
        CheckP(J) = True
    End If
Next J

For J = NumPara To 1 Step -1
    If CheckP(J) Then
        Selection.Range.InsertCrossReference wdRefTypeNumberedItem, wdNumberFullContext, "1"
    End If
Next J

任何人都可以帮我解决它

标签: vbams-word

解决方案


为此,您不需要 RegEx。考虑:

Sub Demo()
Application.ScreenUpdating = False
Dim Rng As Range
With ActiveDocument.Range
  With .Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text = "(^#)"
    .Forward = True
    .Format = False
    .Wrap = wdFindStop
    .MatchWildcards = False
    .Execute
  End With
  Do While .Find.Found
    If .Paragraphs(1).Style <> wdStyleHeading1 Then
      Set Rng = .Characters(2)
      With Rng
        .InsertCrossReference wdRefTypeNumberedItem, wdNumberFullContext, .Text, True
      End With
    End If
    .Collapse wdCollapseEnd
    .Find.Execute
  Loop
End With
Application.ScreenUpdating = True
End Sub

注意:上面的代码假设您的交叉引用是与找到的编号的标题。

如果您要处理的括号内的数字可能超过一位,您可以使用 Word 的通配符Find:

Sub Demo()
Application.ScreenUpdating = False
Dim Rng As Range
With ActiveDocument.Range
  With .Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text = "\([0-9]@\)"
    .Forward = True
    .Format = False
    .Wrap = wdFindStop
    .MatchWildcards = True
    .Execute
  End With
  Do While .Find.Found
    If .Paragraphs(1).Style <> wdStyleHeading1 Then
      Set Rng = .Duplicate
      With Rng
        .Start = .Start + 1
        .End = .End - 1
        .InsertCrossReference wdRefTypeNumberedItem, wdNumberFullContext, .Text, True
      End With
    End If
    .Collapse wdCollapseEnd
    .Find.Execute
  Loop
End With
Application.ScreenUpdating = True
End Sub

推荐阅读