Здравствуйте. Пытаюсь сгенерировать файл-отчет на основании рассчетов, выполненных в Excel. Не могу понять, как вставлять картинку, в нужное место (на место заранее установенной метки в шаблоне Word) и как вставлять таблицу с сохранением форматирования (заливки, шрифт и т.д) также, в заранее определенное место в шаблоне. Нашел в интернете пример замены заранее установленного параметра в нужных местах шаблона, в основном документе работает, но во время подготовки примера и эта функция перестала работать. Выдает ошибку User-defined type not defined, даже не начиная выполнение (проверял ставив Break Points). Решено, нужно было добавить ссылку на Microsoft Word Object Library в References. Файлы шаблона Word и попытки решения Excel прилагаю. Заранее благодарен за вашу помощь. --- Файлы удалены - превышен максимально допустимый размер.
Заинтересовали в платном форуме. Так как там ответы давать нельзя, напишу здесь. Что нужно дополнительно сделать: Для мест, куда будут производиться вставки нужно добавить закладки. Далее можно использовать примерно следующий сниппет:
Код
Sub start()
Dim sh As Worksheet
Dim doc As Word.Document
Set sh = ActiveSheet
If wrd Is Nothing Then Set wrd = New Word.Application 'включить сюда функцию GetObject, если нужно
Set doc = wrd.Documents.Open("C:\Users\Fedor\Documents\Template.docx", False)
sh.Shapes("Picture 2").Copy
doc.Bookmarks("Picture1").Range.Paste
doc.Bookmarks("Param1").Range.Text = [b1]
doc.Bookmarks("Param1Sub").Range.Text = [b1] ' место для колонтитула
Dim rng as Range
set rng = [InsertNamedRangeHere]
rng.copy
doc.Bookmarks("Tbl1").Range.PasteExcelTable True, False, False
wrd.Visible = True
wrd.Quit True
Set wrd = Nothing
End Sub
Все_просто, огромное спасибо, все получается. Есть некоторые детали, которые хотелось бы уточнить. При вставке рисунков и таблиц, сохраняются их исходные размеры. Каким образом можно задать им размер при вставке ? Пропорционально сжать, если превышает размер листа или пропорционально растянуть, если они меньше размера листа. Или же указать размеры в ручную ? Можно ли это сделать при вставке или это уже нужно отлавливать события в Word на изменение закладки ? Вставки осуществляю следующим образом:
Скрытый текст
Код
Sub Button5_Click()
Dim wrdApp As Word.Application
Dim wrdDoc As Word.Document
'путь к шаблону Word
HomeDir$ = ThisWorkbook.Path
Set wrdApp = CreateObject("Word.Application")
wrdApp.Visible = False
Set wrdDoc = wrdApp.Documents.Open(HomeDir$ & "\Template1.docx")
'Замена на текст из ячейки В1 в документе
wrdDoc.Bookmarks("Param1").Range.Text = Worksheets("Sheet1").Range("B1")
'Замена на текст из ячейки В1 в колонтитуле
wrdDoc.Bookmarks("hdParam1").Range.Text = Worksheets("Sheet1").Range("B1")
'Вставка картинки с лиса в указанное место документа
Worksheets("Sheet1").Shapes("Picture 2").Copy
wrdDoc.Bookmarks("Picture1").Range.Paste
'Вставка таблицы с листа в указанное место
Dim rng As Range
Set rng = Worksheets("Sheet1").Range("B11:E16")
rng.Copy
wrdDoc.Bookmarks("Tbl1").Range.PasteExcelTable True, False, False
'Сохранение измененного файла под новым именем, что бы не портить шаблон
nameOut$ = InputBox("Save as ")
wrdDoc.SaveAs HomeDir$ & "\" & nameOut$
wrdDoc.Close
wrdApp.Quit
Set wrdDoc = Nothing
Set wrdApp = Nothing
End Sub
Так же приложил файл примера. В архиве документ Excel и файл шаблон Word. В файлах ничего лишнего, но чтобы убраться в лимит 100 кБ, пришлось заархивировать. Заранее спасибо всем откликнувшимся.
Добавлено: Нашел вот такой способ ресайза вставленных рисунков:
Код
'Вставка картинки с лиса в указанное место документа
Worksheets("Sheet1").Shapes("Picture 2").Copy
wrdDoc.Bookmarks("Picture1").Range.Paste
With wrdDoc.InlineShapes(1)
.LockAspectRatio = msoFalse
.Width = 100
.Height = 100
End With
Работает, но нужно точно знать номер рисунка, что может давать сбой если в документе их несколько. Может можно при вставке картинки давать ей имя и потом к нему обращаться ?
Следствие из третьего закона Чизхолма: "Даже если ясность изложения исключает неверное толкование, все равно найдется кто-то, кто поймет Вас неправильно."
PerfectVam, спасибо за ответ. Я некоторое время экспериментировал со вставками различных объектов и позволю себе уточнить ваш комментарий. Ваш способ будет работать при вставке картинок последовательно, при движении от начала документа к его концу. Причем, при определении индекса, назовем так "свеже-вставленной" картинки, "+1" будет лишним, так как объекты Word нумерует с единицы. Т.е. не может существовать объекта Picture 0. Выражение
Код
numr = wrdDoc.InlineShapes.Count + 1
покажет номер картинки, которую мы собираемся вставить. В то же время замечено, что картинки и таблицы при из вставке MS Word нумерует динамически и последовательно. При наличии картинок в документе и вставке дополнительной между, ее индекс не будет равен
Код
numr = wrdDoc.InlineShapes.Count
, а будет равен индексу предыдущей +1. Для себя я решил вопрос обращения по индексу зная заранее количества и положения статических картинок вычисляю индекс вставляемой. Извините за много букв, возможно кому-то будет полезно. Все выше написанное справедливо для MS Office 2016.