Задача была, в экселе выбрать строку, макрос запустить, а он должен взять шаблон, туда всё подставить из ячеек, и чтобы сразу распечатывать потом.
Sub Export_to_Word()
If vbOK = MsgBox("Номер строки: " & ActiveCell.Row, vbOKCancel) Then
currentRow = ActiveCell.Row ' номер строки получили
' вынимаю содержимое ячеек
firstName = Cells.Range("A" & currentRow).Text
lastName = Cells.Range("B" & currentRow).Text
age = Cells.Range("C" & currentRow).Text
salary = Cells.Range("D" & currentRow).Text
Dim appWord As Object
Dim wordDoc As Object
Set appWord = CreateObject("Word.Application")
Set wordDoc = appWord.Documents.Open(ThisWorkbook.Path & "\pattern.doc") ' шаблон
' pattern.doc помечен "только для чтения", но я пробовал отключать, и всё равно
appWord.Visible = True
appWord.Activate
With appWord
.Selection.Find.ClearFormatting
.Selection.Find.Replacement.ClearFormatting
With .Selection.Find
.Text = "#1"
.Replacement.Text = "blablabla" ' сюда будут подставляться firstName, lastName...
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
.Selection.Find.Execute replace:=wdReplaceAll
End With
End If
End Sub
Так вот, окно открывается, "#1" в шаблоне выделяется, но не заменяется. Не знаю, что делать.
Переделал через DocVariable, всё работает. Но просто замена текста меня всё еще беспокоит.
Вот работающий код для потомков:
Sub Export_to_Word()
If vbOK = MsgBox("Номер строки: " & ActiveCell.Row, vbOKCancel) Then
currentRow = ActiveCell.Row ' номер строки получили
' вынимаем содержимое ячеек
' Value - это значение в том виде, как юзер ее ввел (40000)
' Text - в том виде, как оно выглядит в экселе (40 000,00р.)
firstName = Cells.Range("A" & currentRow).Text
lastName = Cells.Range("B" & currentRow).Text
age = Cells.Range("C" & currentRow).Text
salary = Cells.Range("D" & currentRow).Text
Dim appWord As Object
Dim wordDoc As Object
Set appWord = CreateObject("Word.Application") ' запускаем ворд
appWord.Visible = True
' так можно открыть документ
' Set wordDoc = appWord.Documents.Open(ThisWorkbook.Path & "\pattern.doc")
' но мы открываем как бы его копию
Set wordDoc = appWord.Documents.Add(ThisWorkbook.Path & "\pattern.doc", False, True)
' больше инфы об относительных путях к файлам
' http://stackoverflow.com/questions/213584/relative-instead-of-absolute-paths-in-excel-vba
With wordDoc
' назначить значения полям DocVariable
.Variables("name") = firstName
.Variables("surname") = lastName
.Variables("age") = age
.Variables("salary") = salary
' обновить поля DocVariable
.Fields.Update
' узнал про DocVariable
' отсюда http://sql.ru/forum/actualthread.aspx?tid=794788
End With
appWord.Activate
' Вид -> Разметка страницы
' больше инфы здесь: http://www.ozgrid.com/forum/showthread.php?t=44834&page=1
appWord.ActiveWindow.ActivePane.View.Type = 3
appWord.WordBasic.AcceptAllChangesInDoc
End If
End Sub
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков