Изменение стиля слов в зависимости от того, является ли слово жирным или нет, происходит медленно - PullRequest
0 голосов
/ 08 января 2020

Я хочу изменить стиль нескольких слов в активном документе.

  • Каждое слово может появляться более одного раза.
  • Некоторые слова выделены жирным шрифтом, а некоторые - не выделены жирным шрифтом.

Слова хранятся в массиве Arr().

Если найденное слово X не выделено, замените стиль на StyleA и, если он выделен жирным шрифтом, измените его на StyleB.

В следующем коде есть две проблемы.

1) Слова с жирным и не жирным форматом изменяются на StyleA .
2) Время выполнения медленное. Я протестировал l oop от 1 до 5, и это заняло почти минуту.

Sub ReplaceStyle()
    Dim Arr(1 to 200)

    Arr(1) = "Word1"
    Arr(2) = "Word2"
    .
    .
    .
    Arr(200) = "Word200"

    For i = 1 To Ubound(Arr)
        With Selection.Find
            .ClearFormatting
            .Replacement.ClearFormatting
            .Text = Arr(i)
            .Replacement.Text = ""

            If Selection.Font.Bold = False Then
                .Replacement.Style = ActiveDocument.Styles("StyleA")
            Else
                .Replacement.Style = ActiveDocument.Styles("StyleB")
            End If

            .Forward = True
            .Wrap = wdFindContinue
            .Format = True
            .MatchCase = False
            .MatchWholeWord = False
            .MatchWildcards = False
            .MatchSoundsLike = False
            .MatchAllWordForms = False
            .Execute Replace:=wdReplaceAll
        End With
    Next

End Sub

1 Ответ

1 голос
/ 08 января 2020

Лог c кода в вопросе неисправен. Find должен на самом деле найти поисковый запрос, прежде чем код сможет проверить, будет ли он жирным или не жирным.

Возможны два базовых c подхода

  1. Поиск термина, когда найден, выполнить тест и применить стиль
  2. Искать каждый термин дважды, один раз для полужирный и один раз не полужирный

Вам нужно было бы протестировать, но, исходя из опыта, я считаю, что второй подход будет более быстрым, поскольку он может использовать ReplaceAll.

Код ниже демонстрирует принцип, основанный на коде в вопросе. Обратите внимание, что он использует объект Range, а не Selection, поскольку это обычно более эффективно.

Sub FindReplaceFormattingVariations()
    Dim rng As Word.Range
    Dim searchTerm As String
    Dim Arr(1 to 200)

    Arr(1) = "Word1"
    Arr(2) = "Word2"
    .
    .
    .
    Arr(200) = "Word200"

For i = 1 To Ubound(Arr) 
    searchTerm = Arr(i)
    Set rng = ActiveDocument.content
    With rng.Find
        .ClearFormatting
        .Replacement.ClearFormatting
        .Text = searchTerm
        .Font.Bold = True
        .Replacement.Style = ActiveDocument.Styles("StyleA")
        .Execute Replace:=wdReplaceAll
    End With

    With rng.Find
        .ClearFormatting
        .Replacement.ClearFormatting
        .Text = searchTerm
        .Font.Bold = False
        .Replacement.Style = ActiveDocument.Styles("StyleB")
        .Execute Replace:=wdReplaceAll
    End With
Next    
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...