Вопрос или проблема
Я пытался заменить определённую строку, используя подстановочные знаки, с помощью 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
Объяснение кода
- Создание экземпляра Word: Создается объект приложения Word и открывается нужный документ.
- Замена в основном документе: Используется стандартный метод
Find
для текстового содержания документа. - Замена в Shapes: Используется цикл
For Each
для перебора всех Shapes и применение методаFind
к каждому из них. - Сохранение изменений: После завершения замен документ закрывается, а экземпляр приложения Word освобождается.
Заключение
Применение этого метода позволит вам охватывать все элементы документа, включая текст, расположенный в Shapes. Это решение должно помочь справиться с проблемой неохваченных текстов при использовании метода "Найти и заменить". Убедитесь, что вы протестировали код в копии документа, прежде чем применять его к рабочим файлам.