Я хочу получить и выбрать результат макроса поиска и замены и выполнить над ним некоторые операции.
Скажем, это текст: \[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
@CindyMeister Что мне делать вместо этого? удаление wdReplaceAll решает проблему?
Использование только Selection.Find.Execute дает Run-time error 4605, the method or property is not available because the object is empty.
Извините, я был на мобильном устройстве, прежде чем... Вместо этого используйте wdReplaceOne, и он сделает одну замену, поместив выделение (или диапазон, если вместо этого используется Range) в этой точке. Я написал это как ответы





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
Проблема в том, что вы используете
wdReplaceAll. Это ничего не меняет — просто заменяет все, что совпадает в документе.