Выбрать результат замены - Word Macro

Я хочу получить и выбрать результат макроса поиска и замены и выполнить над ним некоторые операции.

Скажем, это текст: ‎\[abc\]‎, я хочу преобразовать его в abc, а затем выбрать abc.

Вот код:

    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "(\\\[)(*)(\\\])"
        .Replacement.Text = "\2"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchKashida = False
        .MatchDiacritics = False
        .MatchAlefHamza = False
        .MatchControl = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    Selection.Cut

Здесь в последней строке Selection.Cut выдает ошибку, что Selection пуст. Я хочу выбрать выход замены и Обрезать его.

Из моего репозитория Амин Макросы MSWord VBA

Проблема в том, что вы используете wdReplaceAll. Это ничего не меняет — просто заменяет все, что совпадает в документе.

Cindy Meister 15.07.2019 06:46

@CindyMeister Что мне делать вместо этого? удаление wdReplaceAll решает проблему?

Amin 15.07.2019 07:20

Использование только Selection.Find.Execute дает Run-time error 4605, the method or property is not available because the object is empty.

Amin 15.07.2019 07:55

Извините, я был на мобильном устройстве, прежде чем... Вместо этого используйте wdReplaceOne, и он сделает одну замену, поместив выделение (или диапазон, если вместо этого используется Range) в этой точке. Я написал это как ответы

Cindy Meister 15.07.2019 12:19
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
260
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

wdReplaceAll поскольку «цель» замены не переходит к отдельным «попаданиям», поэтому Selection ничего не подбирает.

Вместо этого используйте wdReplaceOne, и Selection (или объект Range, если он используется) переместится к найденному содержимому.

Возможно, вы захотите проверить, действительно ли что-то было найдено, прежде чем запускать команду .Cut, поскольку это может иметь неожиданные последствия, если ничего не будет найдено (удалить содержимое в точке, где был инициирован макрос). Например:

Sub FindReplaceAndCut()
    Dim found As Boolean

    With Selection.Find
        .ClearFormatting
        .Replacement.ClearFormatting
        .Text = "(\\\[)(*)(\\\])"
        .Replacement.Text = "\2"
        .Forward = True
        .wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchKashida = False
        .MatchDiacritics = False
        .MatchAlefHamza = False
        .MatchControl = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = True
    End With
    found = Selection.Find.Execute(Replace:=wdReplaceOne)
    If found Then
        Selection.Cut
    End If
End Sub

Другие вопросы по теме