Как добавить список исключений в строку поиска? - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь создать макрос, который может помечать экземпляры используемого префикса pre. Я могу создать тот, который выделяет все случаи появления «pre», но затем помечает такие слова, как «present», «pretend» и т. Д.

Мой план состоял в том, чтобы создать массив со словами, которые я бы не хотел помечать (например, «представить»), а затем использовать операцию AND, чтобы текст был равен «pre» и НЕ равнялся слова, которые я не хочу, помечены. Мой код ниже, при запуске есть синтаксическая ошибка в строке .Text <> Exceptions. Есть ли лучший способ сделать это? Спасибо!

Sub NeedPrefix()
    Dim range As range
    Dim i As Long
    Dim TargetList
    Dim Exception

    TargetList = Array(" pre")
    Exceptions = Array("prepare", "preparation", "present", "presentation", "presented", "prepared", "pretense", "pretend")

    For i = 0 To UBound(TargetList)
        Set range = ActiveDocument.range
        With range.Find
            .Text = TargetList(i)
            .Text <> Exceptions
            .Format = False
            .MatchCase = False
            .MatchWholeWord = False
            .MatchWildcards = False
            .MatchSoundsLike = False
            .MatchAllWordForms = False

            Do While .Execute(Forward:=True) = True
                ActiveDocument.Comments.Add range, "Is the use of a prefix appropriate?"
            Loop
        End With
    Next
End Sub

1 Ответ

0 голосов
/ 28 августа 2018

Вот одна из возможностей сравнить список терминов с найденным диапазоном.

Зацикливание массива для каждого «попадания» возможно, хотя и отнимает много времени. Вместо этого можно сравнить найденный диапазон со списком, используя Instr. Возвращает 0, если найденный диапазон отсутствует в строке.

Для того, чтобы это работало, найденный диапазон должен быть расширен, чтобы охватить все слово, поэтому конечная точка диапазона расширяется до тех пор, пока не будет найден пробел.

Если вам ничего не нужно делать, если в списке найден термин, вы, конечно, можете пропустить часть кода Else фрагмента кода.

range.Collapse wdCollapseEnd устанавливает начальную точку для следующего цикла Find после найденного термина - в противном случае цикл будет повторяться бесконечно для одного и того же "pre".

Я изменил имя переменной с range на rng - в VBA всегда плохо использовать зарезервированное слово (имя объекта, метода или свойства, принадлежащего Word или VBA) в качестве переменной название. Также обратите внимание на включение .Wrap = wdFindStop - это важно, так как в противном случае код мог бы продолжиться снова с начала документа.

Sub NeedPrefix()
    Dim rng As Range
    Dim i As Long
    Dim TargetList
    Dim Exceptions As String
    Dim theException As String

    TargetList = Array(" pre")
    Exceptions = "prepare preparation present presentation presented prepared pretense pretend"

    For i = 0 To UBound(TargetList)
        Set rng = ActiveDocument.Content
        With rng.Find
            .Text = TargetList(i)
            .Format = False
            .Wrap = wdFindStop
            .MatchCase = False
            .MatchWholeWord = False
            .MatchWildcards = False
            .MatchSoundsLike = False
            .MatchAllWordForms = False

            Do While .Execute(Forward:=True) = True
                Debug.Print "Characters moved: " & rng.MoveEndUntil(" " & Chr(13))
                If InStr(Exceptions, rng.Text) = 0 Then
                    ActiveDocument.Comments.Add rng, "Is the use of a prefix appropriate?"
                Else
                    theException = Mid(Exceptions, InStr(Exceptions, rng.Text))
                    theException = Mid(theException, 2)
                    theException = Left(theException, InStr(theException, " ") - 1)
                    Debug.Print "An exception was found: " & theException
                End If
                rng.Collapse wdCollapseEnd
            Loop
        End With
    Next
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...