В прошлом посте описал опыт автоматизации обработки КВД, а сейчас расскажу об автоматизации выгрузки результатов в Word.
Автоматизируй_это_3
Вообще, взаимодействовать с документами Word через VBA не столь удобно, как с Excel - отсутствует полноценный макрорекодер. Плюс нет интуитивно понятной системы навигации по документу - в Excel все просто, каждая ячейка имеет свои координаты, а в текстовом документе - как?
Методом проб и ошибок я для себя выработал стратегию - все делаем в Excel, в Word выгружаем разве что только результаты. Ибо нефиг. Простой пример - было написано программное средство, которое из n подотчетов лепило один общий отчет. В Word 2007, 2010 оно работало прекрасно, в Word 2013 - перестало. И мы очень долго не могли его заставить работать как надо.
Но вернемся к нашей задаче.
Общее решение для таких задач следующее:
1) Создаем шаблон документа, куда будем выгружать данные
2) В тем места, куда нужно выгружать данные, добавляем закладки
3) Пишем код, который содержимое нужной нам ячейки копирует в нужную нам закладку
4) Четвертого пункта нет - все закончилось еще на третьем.
Рассмотрим подробнее.
1) Мне нужно было на основе Excel-файла из прошлого поста слепить такое вот конклюжн (т.е. заключение).
Из этого файлика я убрал все лишнее - то, что меняется от раза к разу.
2) Добавил закладки, куда следует. Полезный совет - либо дайте им нормальные имена, либо запишите куда-нибудь, что именно вы собираетесь поместить в закладку №100500. Лучше и имена дать и комментарии оставить)
Почему-то, функция закладок в Word не совсем очевидна - даже чтобы просто увидеть их, нужно достаточно далеко залезть.
3) Ну а код очень простой, вот основные моменты:
sTemplatePath = ThisWorkbook.Path & "\шаблон_заключения.docx"
sNewDocumentPath = ThisWorkbook.Path & "\" & WellName & "_" & StartKVD_1_Date & ".docx"
Set wdApp = CreateObject("Word.Application")
FileCopy Source:=sTemplatePath, Destination:=sNewDocumentPath
Set oDocument = wdApp.Documents.Open(FileName:=sNewDocumentPath, Visible:=False)
oDocument.Bookmarks("Закладка_1").Range.Text = WellName
For i = 2 To 14
oDocument.Bookmarks("Закладка_" & i).Range.Text = H_KVD
Next i
В каталоге с книгой, из которой работает код, лежит шаблон заключения. Делаем его копию, присваиваем ей имя. Открываем в невидимом режиме и начинаем заполнять закладки. Чтобы в новом созданном файле не остались закладки - просто порядку для - удаляем их.
For j = oDocument.Bookmarks.Count To 1 Step -1
oDocument.Bookmarks(j).Delete
Next j
Если вы - молодец и дали всем закладкам имена, то ссылаться на них можно аккурат по именам:
oDocument.Bookmarks("NumRP").Range.Text = NumRP
На этом - все. Задача решена. Можно браться за новую или идти пить чай.
Вопросы? В комментарии!
P.S. Если вы такие хулиганы и хотите подобное реализовать, то не забудьте в настройках VBE (Visual Basic Editor - то место, где вы пишите свой VBA код) Excel (Tools -> References...) поставить ссылку на Word - иначе не взлетит.