Применение метода Найти и Заменить к MSWordDoc.Range почему-то не охватывало весь документ.

Вопрос или проблема

Я пытался заменить определённую строку, используя подстановочные знаки, с помощью VBA. Однако текст в фигурах с тем же форматом, который указан в FindText, каким-то образом остался нетронутым методом Replace.

Я также пробовал RngToFind.WholeStory, результат тот же. Как я могу применить функцию Поиск и Замена ко всему в документе?

Кстати, если я делаю замену вручную, результат отличный, и нет вышеупомянутой проблемы. Мне кажется, что дело в объявлении объекта диапазона.

Dim MSWordApp As Object, MSWordDoc As Object, RngToFind As Object

Set MSWordApp = CreateObject("Word.Application")
Set MSWordDoc = MSWordApp.Documents.Open("C:\Users\User\Desktop\123.docx")
Const wdReplaceAll As Long = 2
Const wdSaveChanges As Long = -1

Set RngToFind = MSWordDoc.Range
With RngToFind.Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Execute FindText:="Doc*.??", MatchWildcards:=True, ReplaceWith:="", Replace:=wdReplaceAll
End With
Set RngToFind = Nothing
MSWordDoc.Close SaveChanges:=wdSaveChanges
MSWordApp.Quit
Set MSWordDoc = Nothing
Set MSWordApp = Nothing

Вам нужно перебрать фигуры (пример макроса Word):

Option Explicit

Sub Macro4()
  Dim v As Variant
  For Each v In ActiveDocument.Shapes
    With v.TextFrame.TextRange.Find
      .Text = "Doc*.??"
      .Replacement.Text = ""
      .Forward = True
      .Wrap = wdFindContinue
      .Format = False
      .MatchCase = False
      .MatchWholeWord = False
      .MatchAllWordForms = False
      .MatchSoundsLike = False
      .MatchWildcards = True
      .Execute Replace:=wdReplaceAll
    End With
  Next
End Sub

Ответ или решение

Применение метода "Найти и заменить" в Word: Решение проблемы с текстом в Shape (фреймах)

Когда вы работаете с Microsoft Word и хотите заменить определенные строки текста с использованием VBA, вы можете столкнуться с проблемами при обработке некоторых элементов документа. Ваша проблема с тем, что текст в Shapes не заменяется автоматически, несмотря на использование метода Find, была замечена многими пользователями.

Проблема описания

Вы упомянули, что текст в Shapes (фреймах) с нужным форматом не заменяется, и это создает проблемы при попытке заменить текст в пределах всего документа. При этом вручную замена происходит корректно. Это указывает на то, что ваша процедура замены не охватывает определенные области документа, такие как Shapes.

Решение проблемы

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

Sub CompleteFindAndReplace()
    Dim MSWordApp As Object
    Dim MSWordDoc As Object
    Dim RngToFind As Object
    Dim Shape As Object

    ' Создаем экземпляр приложения Word
    Set MSWordApp = CreateObject("Word.Application")
    MSWordApp.Visible = True ' Для отладки можно сделать видимым
    Set MSWordDoc = MSWordApp.Documents.Open("C:\Users\User\Desktop\123.docx")

    ' Ищем и заменяем текст в основом документе
    Set RngToFind = MSWordDoc.Content
    With RngToFind.Find
        .ClearFormatting
        .Replacement.ClearFormatting
        .Text = "Doc*.??"
        .MatchWildcards = True
        .Execute Replace:=wdReplaceAll
    End With

    ' Ищем и заменяем текст в Shapes
    For Each Shape In MSWordDoc.Shapes
        With Shape.TextFrame.TextRange.Find
            .Text = "Doc*.??"
            .Replacement.Text = ""
            .Forward = True
            .Wrap = wdFindContinue
            .Format = False
            .MatchCase = False
            .MatchWholeWord = False
            .MatchAllWordForms = False
            .MatchSoundsLike = False
            .MatchWildcards = True
            .Execute Replace:=wdReplaceAll
        End With
    Next Shape

    ' Сохраняем и закрываем документ
    MSWordDoc.Close SaveChanges:=wdSaveChanges
    MSWordApp.Quit

    ' Освобождаем память
    Set MSWordDoc = Nothing
    Set MSWordApp = Nothing
End Sub

Объяснение кода

  1. Создание экземпляра Word: Создается объект приложения Word и открывается нужный документ.
  2. Замена в основном документе: Используется стандартный метод Find для текстового содержания документа.
  3. Замена в Shapes: Используется цикл For Each для перебора всех Shapes и применение метода Find к каждому из них.
  4. Сохранение изменений: После завершения замен документ закрывается, а экземпляр приложения Word освобождается.

Заключение

Применение этого метода позволит вам охватывать все элементы документа, включая текст, расположенный в Shapes. Это решение должно помочь справиться с проблемой неохваченных текстов при использовании метода "Найти и заменить". Убедитесь, что вы протестировали код в копии документа, прежде чем применять его к рабочим файлам.

Оцените материал
Добавить комментарий

Капча загружается...