Vba не заменяет текст в word

 

iScalper

Пользователь

Сообщений: 5
Регистрация: 06.08.2015

#1

06.08.2015 16:14:10

Уважаемые коллеги программисты и просто знающие люди!

Подскажите, пожалуйста, как решить проблемку со сбросом формата данных.

В экселе запускаю макрос, который открывает вордовский файл «1.doc».
В вордовском документе мы производим замену текста «!Value1» на текст «ЗАМЕНА СДЕЛАНА».
Файл открывается и текст заменяется. Но! Теряется формат текста в вордовском документе.

Я использую объектную модель и делаю замену именно в параметре содержащем чистый текст:  objDocument.Content.Text
Если я правильно это понимаю.
Я не очищаю формат документа или формат данных принудительно.

Вопрос, как заменить только чистый текст, чтобы стили и форматы в документе остались?
Может быть можно как-нибудь сохранять формат и позже восстанавливать? Не пойму почему сбрасываются стили и форматы.

PS (слияние не предлагать =))

Буду благодарен за помощь!


Office 2007

Код
Private Sub toWord_Click()

    Set objWord = CreateObject("Word.Application")
    If Err.Number Then
       MsgBox "Can't open Word."
       Exit Sub
    End If
    
    pt = "C:Автоматизация1.doc"
    Set objDocument = objWord.Documents.Open(Filename:=pt)
    ' здесь мы получили исходный документ

    objDocument.Content.Text = Replace(objDocument.Content.Text, "!Value1", "ЗАМЕНА СДЕЛАНА")
    ' после замены текста в документе стили слетают

    objWord.Visible = True 'отображаем документ
    
    Set myRange = Nothing
    Set objDocument = Nothing
    Set objWord = Nothing
        
End Sub

Прикрепленные файлы

  • 1.doc (25.5 КБ)

Изменено: iScalper06.08.2015 17:16:05

 

JayBhagavan

Пользователь

Сообщений: 11833
Регистрация: 17.01.2014

ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

iScalper, забыли вордовский файл приложить, с которым проблема.

<#0>
Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori

 

iScalper

Пользователь

Сообщений: 5
Регистрация: 06.08.2015

Это очень простой файл.
Прикрепляю.

Прикрепленные файлы

  • 1.doc (25.5 КБ)

 

JayBhagavan

Пользователь

Сообщений: 11833
Регистрация: 17.01.2014

ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

#4

06.08.2015 16:44:22

Может так устроит.

Скрытый текст

Код исправил. Константы ворда (в коде wdFindContinue, wdReplaceAll) эксель не видит. Заменил их на числовые значения. Помогла понять это тема

отсель

.

Изменено: JayBhagavan06.08.2015 18:35:17

<#0>
Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori

 

iScalper

Пользователь

Сообщений: 5
Регистрация: 06.08.2015

JayBhagavan, спасибо за быстрый ответ!

Стили остались прежними, не сбились, это очень хорошо!
Но значение !Value1 не изменилось. Замена текста не происходит.

 

JayBhagavan

Пользователь

Сообщений: 11833
Регистрация: 17.01.2014

ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

#6

06.08.2015 17:42:22

iScalper, да, а слона то я и не заметил. Почему не срабатывает не понимаю. Зацепило. Попробовал так:

Код
    For Each w In objWord.ActiveDocument.Words
'        Debug.Print w.Text
        If w.Text Like "текст" Then w.Text = "ЗАМЕНА СДЕЛАНА"
    Next w

Сработало, но если менять «!Value1», то не сработает, т.к. «!» и «Value1» — это разные слова. В общем при желании можно разобраться. Пытаемся дальше…

<#0>
Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori

 

iScalper

Пользователь

Сообщений: 5
Регистрация: 06.08.2015

JayBhagavan, выражаю Вам огромную благодарность!
С этим вариантом уже можно работать.
Приятно удивлен таким быстрым ответом! Спасибо, ещё раз!

Если Вам удастся найти более красивое решение, то рад буду на него взглянуть. В наш век автоматизации подобные штуки ещё сотню раз нам пригодятся в работе.

Изменено: iScalper07.08.2015 11:11:51

 

JayBhagavan

Пользователь

Сообщений: 11833
Регистрация: 17.01.2014

ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

iScalper, я в макросах ещё чайник и ворд из экселя не мучаю. Всё дело в бычьей упёртости. Пост №4 — исправил код + комментарий.

<#0>
Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#9

06.08.2015 20:07:52

А что, встроенные средства Word-а никак нельзя использовать?

Код
Private Sub toWord_Click() 
    Set objWord = CreateObject("Word.Application")
    If Err.Number Then
       MsgBox "Can't open Word."
       Exit Sub
    End If
     
    pt = "C:Автоматизация1.doc"
    Set objDocument = objWord.Documents.Open(Filename:=pt)
    ' здесь мы получили исходный документ
 
    objDocument.Content.Find.Execute "!Value", False, False, False, False, False, True, 1, False, "ЗАМЕНА СДЕЛАНА", 2
    ' после замены текста стили не слетают
 
    objWord.Visible = True 'отображаем документ
     
    Set myRange = Nothing
    Set objDocument = Nothing
    Set objWord = Nothing
         
End Sub

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

JayBhagavan

Пользователь

Сообщений: 11833
Регистрация: 17.01.2014

ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

The_Prist, если бы мы про них знали… :) а так поиск и макрорекордер мне такого не показали. Спасибо. _/_

<#0>
Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori

 

iScalper

Пользователь

Сообщений: 5
Регистрация: 06.08.2015

#11

07.08.2015 11:10:19

Цитата
The_Prist написал:
objDocument.Content.Find.Execute «!Value», False, False, False, False, False, True, 1, False, «ЗАМЕНА СДЕЛАНА», 2

Спасибо!
Работает как нужно.

KpacHblu_cMex

0 / 0 / 0

Регистрация: 02.02.2016

Сообщений: 2

1

02.02.2016, 13:36. Показов 12188. Ответов 2

Метки vba, word, Замена, текст (Все метки)


Студворк — интернет-сервис помощи студентам

Есть код, который должен заменять в Word’е слово «догвор» на «РАК», но вместо этого только выделяет его. В похожей теме на форуме описан точно такй же код. Подскажите, почему не просиходит замена?

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Sub Wrd()
Dim objWrdApp As Object
Dim objWrdDoc As Object
On Error Resume Next
Set objWrdApp = GetObject(, "Word.Application")
If objWrdApp Is Nothing Then
    Set objWrdApp = CreateObject("Word.Application")
    Set objWrdDoc = objWrdApp.Documents.Open("C:doc1.docx")
    objWrdApp.Visible = True
End If
    
objWrdApp.Activate
With objWrdApp.Selection
    .Find.ClearFormatting
    .Find.Replacement.ClearFormatting
    .Find.Text = "договор"
    .Find.Replacement.Text = "РАК"
    .Find.Execute Replace:=wdReplaceAll
End With
 
objWrdDoc.Close False
objWrdApp.Quit
Set objWrdDoc = Nothing
Set objWrdApp = Nothing
End Sub



0



KoGG

5590 / 1580 / 406

Регистрация: 23.12.2010

Сообщений: 2,366

Записей в блоге: 1

02.02.2016, 14:13

2

Лучший ответ Сообщение было отмечено SatanaXIII как решение

Решение

1 . Если мы запускаем макрос из другого приложения, то константу Worda wdReplaceAll VBA не видит, надо заменить на число:

Visual Basic
1
.Find.Execute Replace:=2 'wdReplaceAll

2. Если мы не сохраним файл с изменениями, то мы не увидим результатов замены:

Visual Basic
1
objWrdDoc.Close True



0



0 / 0 / 0

Регистрация: 02.02.2016

Сообщений: 2

02.02.2016, 14:18

 [ТС]

3

Да, при замене на число стало работать.
Спсибо.



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

02.02.2016, 14:18

3

I’m fairly new to VBA, trying to fill out a word template from Excel with VBA in Excel. I’m using the following code to put in the Date into a tag in the word document:
Dim Template As String

Dim WordDoc, WordApp As Object
Dim Template as String
On Error Resume Next                                                      
Set WordApp = GetObject("Word.Application")                                 
If Err.Number <> 0 Then                                                     
    Err.Clear                                                               
    Set WordApp = CreateObject("Word.Application")                          
    WordApp.Visible = True                                                  
End If
Template = "C:UsersmeDropboxme - Summer 2019RMA_Log0059-001_E_24May19_Form Returned Authorization.docx"
Set WordDoc = WordApp.Documents.Open(FileName:=Template, ReadOnly:=False)
With WordDoc.Content.Find                                                   
    .Text = "<Date>"                                                        
    .Replacement.Text = "06-06-2019"                                        
    .Execute Replace:=wdReplaceAll, Forward:=True, Wrap:=wdFindContinue                                     
End With

But this won’t replace any text in the main body of my word document.

I’ve tried doing WordDoc.ActiveDocument.Content.Find but that also doesn’t work. If I copy the code exactly and replace WordDoc with ActiveDocument and run it in word VBA, the text gets replaced.

Dim Template As String
Template = "C:UsersmeDropboxme - Summer 2019RMA_Log0059-001_E_24May19_Form Returned Authorization.docx"

With ActiveDocument.Content.Find                                                   
    .Text = "<Date>"                                                        
    .Replacement.Text = "06-06-2019"                                        
    .Execute Replace:=wdReplaceAll, Forward:=True, Wrap:=wdFindContinue                                     
End With

If I run this code in Word VBA, it replaces the Tag, why wouldn’t it work to run this from Excel?

Edit: Office 2016

I have an MS Word document including a table. I am trying to find and replace text via VBA using the following code:

If TextBox1.Text <> "" Then
    Options.DefaultHighlightColorIndex = wdNoHighlight
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    Selection.Find.Replacement.Highlight = True
    With Selection.Find
        .Text = "<Customer_Name>"
        .Replacement.Text = TextBox1.Text
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With

Selection.Find.ClearFormatting
    With Selection.Find.Font
    .Italic = True
    End With
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find.Replacement.Font
    .Italic = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    End If

This works fine for replacing all my content which is outside of the table. But it will not replace any of the content within the table.

kvantour's user avatar

kvantour

24.7k4 gold badges49 silver badges69 bronze badges

asked Sep 4, 2013 at 9:21

122user321's user avatar

If your goal is to perform replacements in the whole documents (it looks so from the code, but it is not explicit), I would suggest you use Document.Range instead of the Selection object. Using Document.Range will make sure everything is replaced, even inside tables.

Also, it is more transparent to the user, as the cursor (or selection) is not moved by the macro.

Sub Test()
  If TextBox1.Text <> "" Then
    Options.DefaultHighlightColorIndex = wdNoHighlight
    With ActiveDocument.Range.Find
      .Text = "<Customer_Name>"
      .Replacement.Text = TextBox1.Text
      .Replacement.ClearFormatting
      .Replacement.Font.Italic = False
      .Forward = True
      .Wrap = wdFindContinue
      .Format = False
      .MatchCase = False
      .MatchWholeWord = False
      .MatchWildcards = False
      .MatchSoundsLike = False
      .MatchAllWordForms = False
      .Execute Replace:=wdReplaceAll
    End With
  End If
End Sub

answered Sep 4, 2013 at 10:47

d-stroyer's user avatar

d-stroyerd-stroyer

2,6282 gold badges18 silver badges31 bronze badges

0

I have used the following code and it works like charm….. for all the occurances that are found in the document.

  stringReplaced = stringReplaced + "string to be searched"
For Each myStoryRange In ActiveDocument.StoryRanges
    With myStoryRange.Find
        .Text = "string to be searched"
        .Replacement.Text = "string to be replaced"
        .Wrap = wdFindContinue
        .ClearFormatting
        .Replacement.ClearFormatting
        .Replacement.Highlight = False
        .Execute Replace:=wdReplaceAll
    End With
Next myStoryRange  

Christopher Oezbek's user avatar

answered Jan 30, 2014 at 6:59

122user321's user avatar

122user321122user321

2211 gold badge4 silver badges13 bronze badges

When I set up a test for your problem description in Word, by typing <<name>> I see that Word replaces the two angled brackets with special symbols. And it offers the possibility to undo the AutoCorrect causing this.

Querying ASC(Selection.Text) on them gives Chr(171) and Chr(187), which are also double-angled bracket symbols, but using them in Find does not work. Querying AscW() reveals the two symbols are Unicode 8810 and 8811, so they need to be searched differently.

Assuming that’s the issue in your case, the following works:

With wdDoc.content.Find
    .ClearFormatting
    .Text = ChrW(8810) & "name" & ChrW(8811) '"<<name>>"
    With .Replacement
        .ClearFormatting
        .Font.Bold = True
        .Text = "John Smith"
    End With
    .Execute Replace:=wdReplaceAll
End With

Further to your code — it has other, potentially grave problems (memory leak):

If you do this: wdApp.Visible = False then you need to be absolutely certain to remove Word from memory:

wdDoc.Close
wdApp.Quit
Set wdDoc = Nothing
Set wdApp = Nothing

Unlike Excel, Word won’t quit automatically when its object goes out of scope (macro ends). It will stay open, which you can see in the Task Manager.

In addition, you need to release the objects in the reverse order in which they were instantiated — wdDoc before wdApp.

ВикиЧтение

VBA для чайников
Каммингс Стив

Поиск и замена текста с помощью VBA в Word

Хотя это звучит и несколько необычно, но Find — это объект Word VBA. Объекты Find принадлежат диапазонам и выделенным областям. Для обнаружения или форматирования текста с помощью объекта Find вам потребуется выполнить следующие действия.

1. Получите доступ к объекту Find для определенного диапазона или выделенной области. Если вам необходимо просмотреть целый документ, используйте свойство Content объекта Document для получения доступа к соответствующему диапазону, как показано ниже:

ActiveDocument.Content.Find

2. Определить свойства объекта Find в соответствии с тем, что же вы ищете и как именно вы хотите проводить поиск.

3. Вызвать метод Execute объекта Find. Соответствующий пример приведен ниже:

With OpenRange.Find

.Clear Formatting

.Text = «pogosticks»

.Execute

End With

Для свойств, значения которых явно вы задать не можете, объект Find выбирает параметры, использованные последними или те, которые в настоящий момент заданы в диалоговом окне Найти и заменить программы Word. Именно по этой причине вам всегда следует включать метод Clear Formatting перед началом нового поиска- он позволяет убрать все ранее определенные для проведения поиска параметры форматирования.

Работа с найденным текстом

Основная работа метода Execute — обнаружение первого экземпляра искомого текста или форматирования в указанном диапазоне или выделенной области. После выполнения этого метода вам прежде всего следует определить, было ли найдено то, что вы ищете. Для подобной проверки используйте свойство Found объекта Find совместно с инструкцией If…Then, как показано на примере следующей заготовки программного кода:

If .Found = True Then

(выполнение определенных действий с найденным текстом)

Else

(отображение соответствующего сообщения)

End If

Если метол Execute нашел необходимый текст, исходный диапазон или выделенная область переопределяются таким образом, чтобы содержать найденный текст. Это очень важный момент, поскольку это означает, что вы можете работать с найденным текстом посредством свойств и методов исходного объекта. В следующем примере, представляющем собой расширенный вариант первого фрагмента кода из настоящего раздела, инструкция .Parent. Italic = True обращается к родительскому объекту по отношению к объекту Find, т.е. диапазону OpenRange. При выполнении этой инструкции диапазон OpenRange теперь содержит только найденный фрагмент текста, так как только в нем предусмотрено форматирование курсивом:

With OpenRange.Find

.СlearFormatting

.Text = «pogosticks»

If .Found = True Then

.Parent.Italic = True

Else

MsgBox «No pogosticks found.»

End If

End with

Объект Reolacement принадлежит (а значит, является его свойством) объекту Find. При написании кода для операции поиска и замены вам следует задать свойства и выполнить методы объекта Replacement.

Следующий фрагмент кода заменяет все экземпляры фразы pogosticks словом skateboards. Выделенная область изменяется при выполнении критерия поиска, поскольку доступ к объекту Find осуществляется через объект Selection:

With ActiveDocument.Content.Find

.ClearFormatting

.Text = «pogosticks»

With .Replacement

.ClearFormatting

.Text == «skateboards»

End With

.Execute Replace := wdReplaceAll

End With

Обратите внимание на то, что метод Execute может использовать аргумент Replace, предназначенный для контроля за тем, будут ли заменены все обнаруженные экземпляры обнаруженного фрагмента текста, или только первый.

Читайте также

Поиск и замена данных

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

Поиск и замена данных

Поиск и замена данных
В программе Extra Hide Studio имеется удобный механизм для быстрого поиска и замены данных. Эта возможность особенно актуальна при работе с большими исходными кодами, поскольку поиск данных путем просмотра всего кода может занять слишком много времени, и к

Глава 2 Подготовка текста в Microsoft Word

Глава 2 Подготовка текста в Microsoft Word
• Общие сведения о Word 2007• Основные правила форматирования• Вставка стандартных блоков в документ• Нумерация страниц и колонтитулы• Проверка правописания, поиск синонимов, перевод слов• Сноски и закладки• Настройка параметров

3.1. Поиск и замена фрагментов

3.1. Поиск и замена фрагментов
Текстовый редактор успешно справляется с поиском и заменой текста в отдельном файле. Однако, если это же нужно сделать сразу в нескольких файлах, лучше воспользоваться специальными программами, с помощью которых можно заменить фрагменты

Поиск и замена текста

Поиск и замена текста
В текстовом редакторе Adobe InDesign можно воспользоваться полезнейшей функцией поиска и замены фрагментов текста. Причем, раз мы имеем дело с программой верстки, найденные фрагменты можно не только заменить другими, но и оформить каким-то образом –

Поиск и замена форматирования

Поиск и замена форматирования
Для поиска текста с определенным форматированием используйте свойства объекта Find, касающиеся форматирования. Они идентичны свойствам, используемым при работе с форматированием диапазона или выделенной области, как я уже отмечал в разделе

Автоматический поиск и замена данных

Автоматический поиск и замена данных
В процессе работы иногда возникает необходимость быстро найти те или иные данные (слово, текстовый фрагмент и т. д.) либо заменить одни данные на другие. Для решения такой задачи в Publisher 2007 реализован механизм автоматического поиска и

Поиск и замена

Поиск и замена
В новой версии Excel был полностью изменен пользовательский интерфейс и расширены функциональные возможности средства Найти и заменить. Теперь можно с помощью одной операции производить поиск и замену по всем листам книги, повторно выполнять запросы поиска

Поиск и замена символов

Поиск и замена символов
Иногда при подготовке электронных документов возникает задача поиска определенных текстовых фрагментов. Например, вы забыли номер чертежа, но помните, что в его названии или дополнительной информации, размещенной на чертеже, содержится

Глава 2 Подготовка текста в Microsoft Word

Глава 2
Подготовка текста в Microsoft Word
Microsoft Word – пожалуй, самая популярная на сегодняшний день программа, предназначенная для работы с текстами. Продукт компании Microsoft обладает всеми необходимыми возможностями, связанными с набором и правкой текстов любой сложности.

5.7. Поиск и замена

5.7. Поиск и замена
В документе можно производить автоматический поиск текста и замену его другим.Поиск и замена ведется по введенному образцу. Если в качестве образца указано слово «ход», то компьютер найдет и слово «пароход», если предварительно не поставить условие, что

13.3.4. Поиск и замена текста

13.3.4. Поиск и замена текста
Как вы уже догадались, окно Найти и заменить используется не только для перехода на нужную страницу. Вкладка Найти используется для поиска текста. Для быстрого доступа к этой вкладке нажмите Ctrl+F или выберите команду меню Правка, Найти. Нажмите

Поиск и замена

Поиск и замена
Для поиска в тексте документа нужного слова или сочетания символов служит окно поиска и замены (рис. 9.19), которое открывается нажатием Ctrl+F. Если надо, чтобы оно сразу открылось как окно замены, используйте сочетание Ctrl+H.

Рис. 9.19. Окно поиска и замены.Для

Поиск и замена фрагментов фильма

Поиск и замена фрагментов фильма
Очень часто бывает нужно найти в изображении или фильме Flash какой-либо текст и, возможно, заменить его на другой. Специально для этого Flash, как и многие другие программы, работающие с документами, предлагает богатые возможности по поиску и

Поиск и замена текста

Поиск и замена текста
Поиск определенного слова или фразы в большом документе является довольно непростой задачей, но ее можно значительно упростить, если воспользоваться командой Главная ? Редактирование ? Найти. В появившемся окне (рис. 5.20) введите искомый текст и

Поиск и замена данных

Поиск и замена данных
По современным меркам таблица с несколькими тысячами записей считается небольшой, но даже в такой таблице ручной поиск или отбор нужной информации может занять продолжительное время. С помощью средств поиска, сортировки и фильтрации нужные данные

Группа: Проверенные

Ранг: Участник

Сообщений: 73


Репутация:

14

±

Замечаний:
0% ±


Excel 2007, 2010, 2013, 2016

А так не портит форматирование:
[vba]

Код

Sub Замена()
     Dim w As Range, t As String
     ‘Первое слово в тексте
     Set w = ActiveDocument.Words.First
     Do Until w Is Nothing   ‘перебираем до конца документа
         ‘Поскольку «рис.1а» для Ворда — три слова
         ‘то набираем выражение постепенно
         t = t & w.Text
         If t Like «рис.#а» Then
             ‘Если мы нашли искомое, заменяем последний знак в текущем обрабатываемом слове
             w.Text = Mid(t, Len(t) — 1, 1) & «б»
         ElseIf t <> «рис» And t <> «рис.» Then
             ‘Очень важно вовремя очищать временную переменную от «мусора»
             t = «»
         End If
         ‘Переходим к следующему слову в документе
         Set w = w.Next(Unit:=wdWord, Count:=1)
     Loop
End Sub

[/vba]
Важно: не применяйте выражения Words(i) — очень медленно!

Понравилась статья? Поделить с друзьями:
  • Vba надстройка для word
  • Vba надстройка для excel скачать
  • Vba на сортировку excel от а до я
  • Vba на разных листах excel
  • Vba на английском excel