iScalper Пользователь Сообщений: 5 |
#1 06.08.2015 16:14:10 Уважаемые коллеги программисты и просто знающие люди! Подскажите, пожалуйста, как решить проблемку со сбросом формата данных. В экселе запускаю макрос, который открывает вордовский файл «1.doc». Я использую объектную модель и делаю замену именно в параметре содержащем чистый текст: objDocument.Content.Text Вопрос, как заменить только чистый текст, чтобы стили и форматы в документе остались? PS (слияние не предлагать =)) Буду благодарен за помощь!
Прикрепленные файлы
Изменено: iScalper — 06.08.2015 17:16:05 |
||
JayBhagavan Пользователь Сообщений: 11833 ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64 |
iScalper, забыли вордовский файл приложить, с которым проблема. <#0> |
iScalper Пользователь Сообщений: 5 |
Это очень простой файл. Прикрепленные файлы
|
JayBhagavan Пользователь Сообщений: 11833 ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64 |
#4 06.08.2015 16:44:22 Может так устроит.
Код исправил. Константы ворда (в коде wdFindContinue, wdReplaceAll) эксель не видит. Заменил их на числовые значения. Помогла понять это тема отсель . Изменено: JayBhagavan — 06.08.2015 18:35:17 <#0> |
|
iScalper Пользователь Сообщений: 5 |
JayBhagavan, спасибо за быстрый ответ! Стили остались прежними, не сбились, это очень хорошо! |
JayBhagavan Пользователь Сообщений: 11833 ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64 |
#6 06.08.2015 17:42:22 iScalper, да, а слона то я и не заметил. Почему не срабатывает не понимаю. Зацепило. Попробовал так:
Сработало, но если менять «!Value1», то не сработает, т.к. «!» и «Value1» — это разные слова. В общем при желании можно разобраться. Пытаемся дальше… <#0> |
||
iScalper Пользователь Сообщений: 5 |
JayBhagavan, выражаю Вам огромную благодарность! Если Вам удастся найти более красивое решение, то рад буду на него взглянуть. В наш век автоматизации подобные штуки ещё сотню раз нам пригодятся в работе. Изменено: iScalper — 07.08.2015 11:11:51 |
JayBhagavan Пользователь Сообщений: 11833 ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64 |
iScalper, я в макросах ещё чайник и ворд из экселя не мучаю. Всё дело в бычьей упёртости. Пост №4 — исправил код + комментарий. <#0> |
The_Prist Пользователь Сообщений: 14182 Профессиональная разработка приложений для MS Office |
#9 06.08.2015 20:07:52 А что, встроенные средства Word-а никак нельзя использовать?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
||
JayBhagavan Пользователь Сообщений: 11833 ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64 |
The_Prist, если бы мы про них знали… а так поиск и макрорекордер мне такого не показали. Спасибо. _/_ <#0> |
iScalper Пользователь Сообщений: 5 |
#11 07.08.2015 11:10:19
Спасибо! |
||
KpacHblu_cMex 0 / 0 / 0 Регистрация: 02.02.2016 Сообщений: 2 |
||||
1 |
||||
02.02.2016, 13:36. Показов 12188. Ответов 2 Метки vba, word, Замена, текст (Все метки)
Есть код, который должен заменять в Word’е слово «догвор» на «РАК», но вместо этого только выделяет его. В похожей теме на форуме описан точно такй же код. Подскажите, почему не просиходит замена?
0 |
KoGG 5590 / 1580 / 406 Регистрация: 23.12.2010 Сообщений: 2,366 Записей в блоге: 1 |
||||||||
02.02.2016, 14:13 |
2 |
|||||||
Сообщение было отмечено SatanaXIII как решение Решение1 . Если мы запускаем макрос из другого приложения, то константу Worda wdReplaceAll VBA не видит, надо заменить на число:
2. Если мы не сохраним файл с изменениями, то мы не увидим результатов замены:
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
24.7k4 gold badges49 silver badges69 bronze badges
asked Sep 4, 2013 at 9:21
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-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
answered Jan 30, 2014 at 6:59
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
Замечаний: |
А так не портит форматирование:
[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) — очень медленно!