在 VBA 中用上标替换正则表达式

Replace regexpr sith superscript in VBA

我想使用 VBA 将所有出现的表达式“\^[0-9]{1,2}”替换为其上标版本。我已经设法替换了一些私人案例,如下面的代码所示。但是我仍然需要一个基于正则表达式的通用形式。

' replace ^1
Dim table As table
For Each table In ActiveDocument.Tables
With table.Range.Find
.ClearFormatting
.Text = "^^1"
With .Replacement
.ClearFormatting
.Font.Superscript = wdToggle
.Text = "1"
End With
.Execute Replace:=wdReplaceAll, Forward:=True, Wrap:=wdFindContinue
End With
 Next table
End Sub

问题中的代码有很多问题:

  1. 在 VBA 中,变量名绝不能与项目引用的任何库中的对象同名。例如,不要为 Table 对象 table 命名对象变量。 VBA 区分大小写,因此它会将两个名称解释为相同,这可能会导致问题。
  2. 需要在代码中开启通配符匹配
  3. 为通配符搜索定义脱字符 ^ 的正确方法是将字符加倍:^^ - 在其前面放置反斜杠是无效的。
  4. 使用“替换”仅应用格式时,无需指定替换文本。
  5. 如果这应该是上标,则将 属性 设置为 True,而不是切换。
  6. 始终 在 运行 VBA 代码时使用 wdFindStop 以避免进入循环。

我的测试代码:

Sub FindAndSuperscript()
    Dim tbl As word.Table

    For Each tbl In ActiveDocument.Tables
        With tbl.Range.Find
            .MatchWildcards = True
            .ClearFormatting
            .Text = "^^[0-9]{1,2}" 'For systems that use a semicolon as list separator: {1;2}
            With .Replacement
                .ClearFormatting
                .Font.Superscript = True
            End With
            .Execute Replace:=wdReplaceAll, Forward:=True, wrap:=wdFindStop
        End With
    Next tbl
End Sub

尝试:

Sub Demo()
Application.ScreenUpdating = False
Dim Tbl As Word.Table
For Each Tbl In ActiveDocument.Tables
  With Tbl.Range.Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Replacement.Font.Superscript = True
    .MatchWildcards = True
    .Text = "^^([0-9]@>)"
    .Replacement.Text = ""
    .Forward = True
    .Wrap = wdFindStop
    .Execute Replace:=wdReplaceAll
  End With
Next Tbl
Application.ScreenUpdating = True
End Sub