如何在包含表格单元格的Word文档选择中迭代并替换VBA RegExp匹配项(或其部分)?

如何在包含表格单元格的Word文档选择中迭代并替换VBA RegExp匹配项(或其部分)?,regex,vba,replace,ms-word,Regex,Vba,Replace,Ms Word,我使用以下VBA宏替换短语“claim”的数字部分,如“5.权利要求4的装置,进一步包括…”,并更新引用的权利要求段落的交叉引用,以便如果我在某处插入权利要求(带有编号列表段落样式)且编号发生变化,我不必手动逐个更新所有受影响的索赔引用 它一直按预期工作,但我发现如果选择中有一个表,我会收到错误消息“运行时错误'4198':Command failed”,调试器会高亮显示粗体行以插入交叉引用。如果我不得不猜测的话,单元格边界似乎将m.FirstIndex(与匹配开头的光标位置相关)的值增加了2,

我使用以下VBA宏替换短语“claim”的数字部分,如“5.权利要求4的装置,进一步包括…”,并更新引用的权利要求段落的交叉引用,以便如果我在某处插入权利要求(带有编号列表段落样式)且编号发生变化,我不必手动逐个更新所有受影响的索赔引用

它一直按预期工作,但我发现如果选择中有一个表,我会收到错误消息“运行时错误'4198':Command failed”,调试器会高亮显示粗体行以插入交叉引用。如果我不得不猜测的话,单元格边界似乎将m.FirstIndex(与匹配开头的光标位置相关)的值增加了2,而Selection.MoveStart方法似乎根本不将单元格边界计算为具有字符宽度,因此,将光标移动到m.FirstIndex实际上会将其放置在匹配开始的右侧两个空格处。我相信可能是这样的,因为在我的一次测试运行中,出现了正确的交叉引用,但它没有替换“claim 1”的纯文本“1”,而是替换了下一个单元格开头附近的一个字符(但不是第一个字符-第二个字符!)。然而,我不确定这为什么会导致“命令失败”错误,因为插入交叉引用的命令似乎正在执行,尽管在错误的位置

此外,在我的初始运行中,该命令插入了交叉引用,以替换包含声明列表的单元格的全部内容,使其显示为“Error!reference source not found.”,因为交叉引用引用的“声明1”段落已被插入删除。但在摆弄了索赔清单相对于表的不同位置之后,我无法重现这种行为。(不用说,我是一个新手程序员,我的调试技术还有很长的路要走…)

如果有人能解释一下正在发生的事情,并解释一下如何在这个例行程序中跳过细胞边界,或者忽略它们的存在,我将不胜感激

子InsertMultipleClaimReferences()


Regex确实不适合在包含表、行内图像、字段等的文档中返回范围。请尝试基于Word的通配符工具:

Sub Demo()
Application.ScreenUpdating = False
With ActiveDocument.Range
  With .Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text = "<[Cc]laim \<[0-9]@\>"
    .Replacement.Text = ""
    .Forward = True
    .Format = False
    .Wrap = wdFindStop
    .MatchWildcards = True
    .Execute
  End With
  Do While .Find.Found
    With .Duplicate
      .Collapse wdCollapseEnd
      .MoveStartUntil "<", wdBackward
      .Collapse wdCollapseStart
      .MoveEndUntil ">", wdForward
      .InsertCrossReference ReferenceType:="Numbered item", _
          ReferenceKind:=wdNumberNoContext, ReferenceItem:=.Text, _
          InsertAsHyperlink:=True
    End With
    .Collapse wdCollapseEnd
    .Find.Execute
  Loop
End With
Application.ScreenUpdating = True
End Sub
子演示()
Application.ScreenUpdating=False
使用ActiveDocument.Range
和…一起找
.ClearFormatting
.Replacement.ClearFormatting
.Text=”
Sub Demo()
Application.ScreenUpdating = False
With ActiveDocument.Range
  With .Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text = "<[Cc]laim \<[0-9]@\>"
    .Replacement.Text = ""
    .Forward = True
    .Format = False
    .Wrap = wdFindStop
    .MatchWildcards = True
    .Execute
  End With
  Do While .Find.Found
    With .Duplicate
      .Collapse wdCollapseEnd
      .MoveStartUntil "<", wdBackward
      .Collapse wdCollapseStart
      .MoveEndUntil ">", wdForward
      .InsertCrossReference ReferenceType:="Numbered item", _
          ReferenceKind:=wdNumberNoContext, ReferenceItem:=.Text, _
          InsertAsHyperlink:=True
    End With
    .Collapse wdCollapseEnd
    .Find.Execute
  Loop
End With
Application.ScreenUpdating = True
End Sub