添加使用带有编号项宏的正则表达式找到的数字或文本的交叉引用

时间:2018-05-09 11:09:43

标签: vba ms-word word-vba

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

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

对于Ex:发现的文字:"(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

任何人都可以帮助我吗

1 个答案:

答案 0 :(得分:0)

您不需要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 通配符查找:

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