Regex + Word Macro для замены стилей - PullRequest
0 голосов
/ 09 марта 2020

У меня есть куча документов с разнородными стилями, которые я добавляю в длинный макрос, который находит и заменяет эти стили на правильные. Прямо сейчас я просто добавляю в список, поскольку нахожу неправильный стиль. Например, может быть заголовок 1, заголовок 1, H1 или h1. Я хочу написать функцию поиска и замены для каждого из них на данный момент. Что было бы круче, так это если бы я мог написать макрос catch all для такого рода вещей, используя Regex: (h | H). {6} \ s1 (не лучший писатель Regex, так что терпите). В идеале это могло бы охватить все варианты заголовка 1 (хотя это не охватило бы случаи h1, H1, хотя я мог бы добавить это достаточно легко.

Я знаю, что VBA поддерживает Regex. Я добавил ссылку на Я также знаю, как это будет работать для замены указанного c текста. Я не заменяю текст, хотя. ТОЛЬКО форматирование. Я не слишком много с этим играюсь. Я просто хочу знать, могу ли я использовать Regex при работе конкретно со стилем. Вот как выглядят функции прямо сейчас:

Selection.Find.ClearFormatting
Selection.Find.Style = ActiveDocument.Styles("Heading 1")
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.Style = ActiveDocument.Styles("SSC TOC 2")
With Selection.Find
    .Text = ""
    .Replacement.Text = ""
    .Forward = True
    .Wrap = wdFindContinue
    .Format = True
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll

Я просто записал это. Теперь, смогу ли я поставить Regex вместо этой строки, вот так:

Selection.Find.ClearFormatting
Selection.Find.Style = ActiveDocument.Styles(someRegex function (h|H).{6}\s1)
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.Style = ActiveDocument.Styles("SSC TOC 2")
With Selection.Find
    .Text = ""
    .Replacement.Text = ""
    .Forward = True
    .Wrap = wdFindContinue
    .Format = True
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll

В основном просто с помощью функции функция someRegex (h | H). {6} \ s1 вместо строкового литерала. Есть ли способ сделать это? Буду признателен за любые рекомендации или помогите!

1 Ответ

0 голосов
/ 10 марта 2020

Вы можете использовать что-то вроде строки в следующем макросе, чтобы удалить все неиспользуемые пользовательские стили (кроме связанных стилей) в документе, а также очистить различные H1, et c. Стили, которые вы упомянули:

Sub CleanUpStyles()
Application.ScreenUpdating = False
Dim Doc As Document, bDel As Boolean, bHid As Boolean
Dim Rng As Range, StlNm As String, i As Long
bHid = ActiveWindow.View.ShowHiddenText
ActiveWindow.View.ShowHiddenText = True
Set Doc = ActiveDocument
With Doc
  For i = .Styles.Count To 1 Step -1
    With .Styles(i)
      If .BuiltIn = False And .Linked = False Then
        bDel = True: StlNm = .NameLocal
        For Each Rng In Doc.StoryRanges
          With Rng
            With .Find
              .ClearFormatting
              .Format = True
              .Style = StlNm
              .Execute
            End With
            If .Find.Found = True Then
              If StlNm Like "[Hh]*#" Then
                If StlNm <> "Heading " & Right(StlNm, 1) Then
                  .Style = "Heading " & Right(StlNm, 1)
                  bDel = True
                End If
              Else
                bDel = False
              End If
              Exit For
            End If
          End With
        Next
        If bDel = True Then .Delete
      End If
    End With
  Next
End With
ActiveWindow.View.ShowHiddenText = bHid
Application.ScreenUpdating = True
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...