Отправка на печать документа Word из кода VBA Excel. Пакетная печать всех документов Word из указанной папки. Примеры процедур с комментариями.
Позднее или раннее связывание
Для управления приложением Word из Excel мы будем использовать технологию OLE Automation.
OLE Automation (в современной документации Microsoft чаще называемая просто Автоматизацией) — это технология, позволяющая одной программе управлять объектами, функциями и данными другого приложения напрямую при помощи скриптов или кода. Она базируется на архитектуре COM (Component Object Model).
Существует два подхода:
- Раннее связывание (Early Binding)
Требует подключения библиотекиMicrosoft Word XX.0 Object Libraryчерез менюTools -> References.
Плюс: работает автодополнение кода (IntelliSense).
Минус: код может не работать на компьютере с другой версией Office. - Позднее связывание (Late Binding)
Мы создаем объект черезCreateObject.
Плюс: код универсален и работает на любых версиях Office без настроек.
Минус: нет автодополнения.
В этой статье мы используем позднее связывание, так как это самый надежный способ поделиться макросом с коллегами.
Печать одного документа
Этот макрос открывает указанный файл Word, отправляет его на принтер по умолчанию, закрывает файл и выгружает Word из памяти.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
Sub PrintSingleWordDoc() ' Объявляем переменные Dim wdApp As Object ' Объект приложения Word Dim wdDoc As Object ' Объект документа Word Dim filePath As String ' Путь к файлу ' Указываем путь к документу filePath = "C:\Test\Схема пакетика для семян.doc" ' Проверяем, существует ли файл? If Dir(filePath) = "" Then MsgBox "Файл не найден по пути: " & filePath, vbCritical, "Ошибка" Exit Sub End If ' Обработка ошибок On Error GoTo ErrorHandler ' Создаем невидимый экземпляр Word Set wdApp = CreateObject("Word.Application") ' wdApp.Visible = True ' Раскомментируйте для отладки, чтобы видеть, что делает Word ' Открываем документ Set wdDoc = wdApp.Documents.Open(filePath) ' --- НАСТРОЙКИ ПЕЧАТИ --- ' Для печати используется принтер по умолчанию ' Если нужно печатать документ на конкретном принтере, раскомментируйте и укажите имя ' wdApp.ActivePrinter = "Имя принтера" ' Отправляем документ на печать wdDoc.PrintOut Background:=False ' Закрываем документ без сохранения wdDoc.Close SaveChanges:=0 ' Закрываем Word wdApp.Quit ' Очищаем память Set wdDoc = Nothing Set wdApp = Nothing MsgBox "Документ успешно отправлен на печать!", vbInformation, "Готово" Exit Sub ErrorHandler: MsgBox "Произошла ошибка: " & Err.Description, vbCritical, "Ошибка VBA" ' Если Word завис, закрываем его принудительно If Not wdApp Is Nothing Then wdApp.Quit Set wdApp = Nothing End If End Sub |
Важно:
Использование параметра Background:=False метода PrintOut заставляет Excel ждать, пока документ полностью не уйдет в спулер печати, прежде чем он будет закрыт.
Спулер печати — набор компонентов Microsoft Windows, управляющих процессом печати. Диспетчер печати предоставляет пользователю графический интерфейс для получения информации о работе спулера и его конфигурирования. Однако спулер может продолжать работать, даже если диспетчер печати неактивен.
Пакетная печать документов
Часто стоит задача распечатать все документы из определенной директории. Для этого мы используем функцию Dir, чтобы перебрать все Word-файлы в указанной папке.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
Sub PrintAllDocsInFolder() Dim wdApp As Object Dim wdDoc As Object Dim folderPath As String Dim fileName As String ' Путь к папке (обязательно со слэшем \ на конце) folderPath = "C:\DATA\Личная\Справка по VB и VBA\" ' Проверяем наличие папки If Dir(folderPath, vbDirectory) = "" Then MsgBox "Папка не найдена!", vbCritical Exit Sub End If On Error GoTo ErrorHandler ' Запускаем Word один раз на все файлы (это экономит время) Set wdApp = CreateObject("Word.Application") ' wdApp.Visible = True ' Раскомментируйте для отладки, чтобы видеть, что делает Word ' Ищем первый файл .doc или .docx fileName = Dir(folderPath & "*.doc*") ' Если в папке нет файлов If fileName = "" Then MsgBox "В папке нет файлов .doc (.docx)", vbExclamation wdApp.Quit Set wdApp = Nothing Exit Sub End If ' Задаём нужный принтер, если не устраивает принтер по умолчанию ' wdApp.ActivePrinter = "Имя принтера" Application.StatusBar = "Идет печать документов..." ' Цикл по всем файлам в папке Do While fileName <> "" Set wdDoc = wdApp.Documents.Open(folderPath & fileName) ' Печать wdDoc.PrintOut Background:=False ' Закрытие wdDoc.Close SaveChanges:=0 ' Берем следующий файл fileName = Dir() Loop ' Завершаем работу Word wdApp.Quit Set wdDoc = Nothing Set wdApp = Nothing Application.StatusBar = False MsgBox "Пакетная печать завершена!", vbInformation Exit Sub ErrorHandler: MsgBox "Ошибка при печати файла " & fileName & ": " & Err.Description, vbCritical If Not wdApp Is Nothing Then wdApp.Quit Set wdApp = Nothing Application.StatusBar = False End Sub |
Примечания
Фоновая печать
По умолчанию Word печатает в фоновом режиме (Background Printing). Это значит, что команда PrintOut отдается, и VBA мгновенно выполняет следующую строку (wdDoc.Close). Если закрыть документ слишком рано, спулер печати может не успеть перехватить данные, и на принтер ничего не уйдет.
Всегда используйте wdDoc.PrintOut Background:=False или добавляйте небольшую задержку кода, чтобы не возникало ошибок при печати.
Выбор принтера
Если у вас в системе несколько принтеров, Word будет использовать тот, который установлен «по умолчанию». Если нужно перенаправить печать, используйте свойство ActivePrinter:
|
1 |
wdApp.ActivePrinter = "Имя принтера" |
Имя принтера должно в точности совпадать с тем, что отображается в панели управления Windows.
Печать определенных страниц
Метод PrintOut имеет множество параметров. Например, чтобы распечатать только первую страницу, используйте:
|
1 |
wdDoc.PrintOut Background:=False, Range:=3, Pages:="1" |
Печать диапазона страниц (например, с 1 по 5):
|
1 |
wdDoc.PrintOut Background:=False, Range:=3, From:="1", To:="5" |
Резюме
С помощью VBA можно полностью автоматизировать печать любых документов Word непосредственно из приложения Excel. Особенно полезно это в следующих случаях:
- Когда необходимо сгенерировать отчет в Excel, сохранить его как Word-файл и тут же распечатать.
- Когда нужно массово распечатать все документы Word из определённой директории.