Замените регулярное выражение с верхним индексом в VBA - PullRequest
0 голосов
/ 01 февраля 2019

Я хочу заменить все вхождения выражения "\ ^ [0-9] {1,2}" его версией надстрочного текста, используя VBA.Мне удалось заменить некоторые частные случаи, как показано в коде ниже.Однако мне все еще нужна общая форма, основанная на регулярных выражениях.

' 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

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

Попробуйте:

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 = "\1"
    .Forward = True
    .Wrap = wdFindStop
    .Execute Replace:=wdReplaceAll
  End With
Next Tbl
Application.ScreenUpdating = True
End Sub
0 голосов
/ 01 февраля 2019

Код в вопросе имеет ряд проблем:

  1. В VBA имя переменной никогда не должно совпадать с именем объекта в любой библиотеке, на которую ссылается проект.Например, не называйте переменную объекта для Table объекта table.VBA не чувствителен к регистру, поэтому он будет интерпретировать два имени одинаково, что может вызвать проблемы.
  2. Необходимо включить сопоставление с подстановочными знаками в коде.
  3. Правильный способ определения каретки ^ для поиска с подстановочными знаками состоит в удвоении символа: ^^ - неверный знак обратной косой черты перед ним.
  4. При использовании Replace для применения только форматирования нет необходимостиуказать текст замены.
  5. Если это должен быть верхний индекс, установите для свойства True, чтобы он не переключался.
  6. Всегда используйте wdFindStop при запуске кода VBA, чтобы избежать перехода вцикл.

Мой тестовый код:

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
...