Уважаемые коллеги программисты и просто знающие люди!
Подскажите, пожалуйста, как решить проблемку со сбросом формата данных.
В экселе запускаю макрос, который открывает вордовский файл "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
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", "ЗАМЕНА СДЕЛАНА")
' после замены текста в документе стили слетают
With objDocument.Content
.Find.ClearFormatting
.Find.Replacement.ClearFormatting
With .Find
.Text = "!Value1"
.Replacement.Text = "ЗАМЕНА СДЕЛАНА"
.Forward = True
.Wrap = 1 'wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
.Find.Execute Replace:=2 'wdReplaceAll
End With
objWord.Visible = True 'отображаем документ
Set myRange = Nothing
Set objDocument = Nothing
Set objWord = Nothing
End Sub
Код исправил. Константы ворда (в коде wdFindContinue, wdReplaceAll) эксель не видит. Заменил их на числовые значения. Помогла понять это тема отсель.
iScalper, да, а слона то я и не заметил. Почему не срабатывает не понимаю. Зацепило. Попробовал так:
Код
For Each w In objWord.ActiveDocument.Words
' Debug.Print w.Text
If w.Text Like "текст" Then w.Text = "ЗАМЕНА СДЕЛАНА"
Next w
Сработало, но если менять "!Value1", то не сработает, т.к. "!" и "Value1" - это разные слова. В общем при желании можно разобраться. Пытаемся дальше...
Формула массива (ФМ) вводится Ctrl+Shift+Enter Memento mori
JayBhagavan, выражаю Вам огромную благодарность! С этим вариантом уже можно работать. Приятно удивлен таким быстрым ответом! Спасибо, ещё раз!
Если Вам удастся найти более красивое решение, то рад буду на него взглянуть. В наш век автоматизации подобные штуки ещё сотню раз нам пригодятся в работе.
А что, встроенные средства 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
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...