Добрый день! Собираю макрос который по меткам в Word заменяет значения на значения из ячеек в Excel и сохраняет документ по новому пути и присваивает новое имя из соответствующей ячейки. файл template.docx - должен оставаться неизменным. Помогите разобраться с колонтитулом и сохранением, почему-то не срабатывает (
Код
Sub ReplaceLabelDocSave()
Dim objDocument As Object
ColonText = Sheets("Лист1").Cells(4, 1).Text 'ячейка от куда берется значение для замены колонтитула
NewPatchName = Sheets("Лист1").Cells(5, 1) 'имя файла и папки
Set objWord = CreateObject("Word.Application")
If Err.Number Then
MsgBox "Не могу открыть Word!"
Exit Sub
End If
Set objDocument = objWord.Documents.Open(Filename:="C:\temp2018\template.docx") 'Открываем документ
'Замена колонтитула
objDocument.ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageFooter 'Открываем нижний колонтитул
Set objDocument = objWord.ActiveDocument
With objWord.Selection
.Find.ClearFormatting
.Find.Replacement.ClearFormatting
.Find.Text = "@колонтитул"
.Find.Replacement.Text = ColonText
.Find.Execute Replace:=wdReplaceAll
End With
objDocument.ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument 'Закрываем колонтитул
'Заменяем метки на значения из ячеек
With objWord.Selection.Find
.Text = "@метка1"
.Replacement.Text = Range("A1")
.Wrap = 1
.Execute Replace:=2
.Text = "@метка2"
.Replacement.Text = Range("A2")
.Wrap = 1
.Execute Replace:=2
.Text = "@метка3"
.Replacement.Text = Range("A3")
.Wrap = 1
.Execute Replace:=2
End With
objWord.ActiveDocument.SaveAs Filename:=NewPatchName 'Сохранение документа в новую папку с новым именем
objDocument.Close
objWord.Quit
End Sub
Sub ReplaceLabelDocSave()
Dim objWord As Object, objDocument As Object
Dim NewPatchName As String
Set objWord = CreateObject("word.application")
Set objDocument = objWord.Documents.Open(Filename:="C:\temp2018\template.docx")
objWord.Visible = True
NewPatchName = Range("A5").Value
objDocument.Bookmarks("b1").Range.Text = Range("A1").Value
objDocument.Bookmarks("b2").Range.Text = Range("A2").Value
objDocument.Bookmarks("b3").Range.Text = Range("A3").Value
objDocument.Bookmarks("k1").Range.Text = Range("A4").Value
objDocument.SaveAs Filename:=NewPatchName
objDocument.Close: objWord.Quit
Set objDocument = Nothing: Set objWord = Nothing
End Sub
Сейчас наткнулся на маленький нюанс в решении с закладками - если в теле документа несколько одинаковых значений - это решается выделением через ctrl, но если одинаковые значения в теле документа и колонтитуле, то приходится дописывать в макрос строчки Но это мелочи)
прикрепил на всякий случай рабочий скрипт с заменой, может кому пригодится )
если одинаковые значения в теле документа и колонтитуле...
Да, разные закладки. По моему мнению, это правильнее: не нужно использовать поиск, в случае замены текста в коде ничего менять не нужно. В разные закладки можно передавать одно и то же значение.
О создании папки, если такой нет - не по теме. Вопрос может возникнуть не только у Вас, поэтому правильнее - создать отдельную тему.
Я пытаюсь реализовать подобный макрос но не с закладками а с метками типа {метка} Такие метки в шаблоне вордовском. В качестве меток в рабочей книге используются имя ячейки и имя листа типа {Лист1} так же в скобках
Так вот поиск и замену метки в шаблоне на значение из ячейки я реализовал. Поиск среди листов листов со скобками тоже не составляет проблемы
ну допустим есть лист копируем его содержимое там таблица:
Код
Sheets("{List}").UsedRange.Copy
Вопрос в том как заменить в шаблоне метку {List} на эту таблицу ???
Ура решение подсказал автор оригинального макроса. Благодарю, Дмитрий!
Возможно кому то такой вариант будет удобней в использовании.
Скрытый текст
Код
Sub Import_Word()
Dim objWrdApp As Object, objWrdDoc As Object, wdRange As Object
Dim IsAppClose As Boolean
Application.ScreenUpdating = True
'пытаемся подключится к Word
On Error Resume Next
Set objWrdApp = GetObject(, "Word.Application")
If objWrdApp Is Nothing Then
'если приложение закрыто - создаем новый экземпляр
Set objWrdApp = CreateObject("Word.Application")
'сделать видимым
objWrdApp.Visible = True
IsAppClose = True 'Не знаю что это
End If
On Error GoTo 0
If objWrdApp Is Nothing Then
MsgBox "Не удалось подключиться к Word"
Application.ScreenUpdating = True
Exit Sub
End If
'Открываем документ Word - документ "C:\Users\Olef\Desktop\макрос\Шаблон.doc"
'находится в папке с рабочей книгой
Set objWrdDoc = objWrdApp.Documents.Open("C:\Users\Olef\Desktop\макрос\Шаблон.doc")
'сохраняем файл шаблона с как "Расчет+дата.doc"
objWrdDoc.SaveAs ThisWorkbook.Path & "\Расчет " & Format(Now, "dd-mm-yy hh-mm") & ".doc"
'Перебираем именованые ячейки книги и сравниваем с метками в шаблоне, производим замену,
'если есть совпадения.
'Например. Значение ячейки с именем "Яч1" заменит метку в шаблоне {Яч1} по всему документу
Dim nName As Name
For Each nName In ThisWorkbook.Names
Set wdRange = objWrdDoc.Range
wdRange.Find.ClearFormatting
wdRange.Find.Replacement.ClearFormatting
With wdRange.Find
.text = "{" & nName.Name & "}"
.Replacement.text = Range(nName).text
.Forward = True
.Wrap = 1 'wdFindContinue - не знаю что это
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
.Execute Replace:=2 'wdReplaceAll - почемуто воспринимается как переменная и не работает :(
End With
Next nName
'Аналогичный перебор с листами книги. Таблица из листа {Лист1} должна заменить метку в шаблоне {Лист1}
Dim List As Worksheet
For Each List In ThisWorkbook.Worksheets
'Чтобы в переборе участвовали только листы с фигурными скобками
If InStr(List.Name, "{") > 0 Then
'Поиск и замена
ThisWorkbook.Worksheets(List.Name).UsedRange.Copy
With wdRange.Find
.text = List.Name
.Replacement.text = "^c"
.Forward = True
.Wrap = 1 'wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
.Execute Replace:=2 'wdReplaceAll
End With
End If
Next List
'закрываем документ Word с сохранением
objWrdDoc.Close True
'закрываем приложение Word - обязательно!
objWrdApp.Quit
'очищаем переменные Word - обязательно!
Set objWrdDoc = Nothing: Set objWrdApp = Nothing
End Sub