Макрос создает документ word

  • Документы Word
  • Создание файлов
  • Работа с файлами

Таблица Excel с исходными данными для создания документов Word

Макрос предназначен для программного создания документов Word на основе шаблона

(без использования функции слияния в Word)

В прикреплённом к статье архиве находятся 2 файла:

  • шаблон договора в формате Microsoft Word (расширение .dot)
  • файл Excel с макросом

Настройки макроса задаются в коде:

Const ИмяФайлаШаблона = «шаблон.dot»
Const КоличествоОбрабатываемыхСтолбцов = 8
Const РасширениеСоздаваемыхФайлов = «.doc»

При нажатии кнопки запуска макрос на основе шаблона dot создаёт очередной файл, и в этом документе производит замену текста («кода поля») из первой строки файла Excel на значение поля (из очередной строки с данными файла Excel)

Папка для сформированных документов создаётся автоматически, и содержит в имени текущую дату и время
(например, созданная папка будет называться Договоры, сформированные 01-05-2011 в 15-03-24)

Имена создаваемых файлов формируются объединением полей фамилия, имя и отчество, с добавлением расширения doc

PS: Макрос был написан достаточно давно, когда я только начинал изучать VBA, — так что код недостаточно универсален.

Но, в качестве примера, пожалуй, подойдёт (если вам нужен более функциональный макрос, воспользуйтесь универсальной надстройкой (см. ниже))

Ознакомьтесь также с универсальной надстройкой формирования документов по шаблонам,
которая может делать всё тоже самое, что и эта программа,
только в качестве шаблонов могут выступать, помимо документов Word, ещё текстовые файлы, и книги Excel.

В надстройке — много возможностей, и полезных дополнений: склонение ФИО в родительный и дательный падежи, автоматический вывод на печать (с заданным количеством копий), размещение созданных файлов в разных папках, создание и рассылка писем со вложениями, и множество других полезных функций.

По вышеприведённой ссылке программа заполнения документов Word из Excel доступна для бесплатного скачивания.

Внимание: просьбы о доработке макроса, описанного в этой статье, не принимаются.

Есть новая (универсальная) версия, — в которой уже есть практически всё, что может понадобиться.

  • 197090 просмотров

Не получается применить макрос? Не удаётся изменить код под свои нужды?

Оформите заказ у нас на сайте, не забыв прикрепить примеры файлов, и описать, что и как должно работать.

Создание нового документа Word или открытие существующего из кода VBA Excel. Методы Documents.Add и Documents.Open. Сохранение и закрытие документа.

Работа с Word из кода VBA Excel
Часть 2. Создание и открытие документов Word
[Часть 1] [Часть 2] [Часть 3] [Часть 4] [Часть 5] [Часть 6]

Новый документ Word создается из кода VBA Excel с помощью метода Documents.Add:

Sub Test1()

Dim myWord As New Word.Application

Dim myDocument As Word.Document

Set myDocument = myWord.Documents.Add

myWord.Visible = True

End Sub

Переменную myDocument можно объявить с типом Object, но тогда не будет ранней привязки к типу Word.Document и подсказок при написании кода (Auto List Members).

Открытие существующего документа

Существующий документ Word открывается из кода VBA Excel с помощью метода Documents.Open:

Sub Test2()

Dim myWord As New Word.Application

Dim myDocument As Word.Document

Set myDocument = _

myWord.Documents.Open(«C:Документ1.docx»)

myWord.Visible = True

End Sub

Замените в этой процедуре строку «C:Документ1.docx» на адрес своего файла.

Подключение к открытому документу

Присвоение переменной ссылки на существующий экземпляр Word.Application осуществляется в VBA Excel с помощью функции GetObject:

Sub Test3()

Dim myWord As Object, myDoc As Word.Document

On Error GoTo Instr

    Set myWord = GetObject(, «Word.Application»)

    Set myDoc = myWord.Documents(«Документ1.docx»)

    myDoc.Range.InsertAfter «Добавляем новый текст, подтверждающий подключение к открытому документу.»

Exit Sub

Instr:

    MsgBox «Произошла ошибка: « & Err.Description

End Sub

Если открытого приложения Word нет, выполнение функции GetObject приведет к ошибке. Также произойдет ошибка, если не будет найден указанный документ (в примере — «Документ1.docx»).

Сохранение и закрытие документа

Сохранение нового документа

Чтобы сохранить из кода VBA Excel новый документ Word, используйте метод SaveAs2 объекта Document:

myDocument.SaveAs2 («C:Документ2.docx»)

Замените «C:Документ2.docx» на путь к нужному каталогу с именем файла, под которым вы хотите сохранить новый документ.

Сохранение изменений в открытом документа

Сохраняйте изменения в существующем документе с помощью метода Document.Save или параметра SaveChanges метода Document.Close:

‘Сохранение изменений документа

myDocument.Save

‘Сохранение изменений документа

‘при закрытии

myDocument.Close ‘по умолчанию True

myDocument.Close True

myDocument.Close wdSaveChanges

‘Закрытие документа без

‘сохранения изменений

myDocument.Close False

myDocument.Close wdDoNotSaveChanges

Закрытие любого сохраненного документа

Метод Document.Close закрывает документ, но не приложение. Если работа с приложением закончена, оно закрывается с помощью метода Application.Quit.


Краткое описание

Макрос на основе шаблонов в формате Word и по заданному списку значений в Excel формирует необходимое количество вордовских документов. Количество формируемых файлов неограниченно и зависит только от числа указанных вами параметров в Excel.

Подробное описание

Если по роду деятельности часто приходится формировать какие-либо документы в Word по шаблону (приказы, распоряжения, договора, соглашения, счета и др), то вам может пригодится макрос для автоматизации создания вордовских документов на основе исходных данных в файле Excel.

Макрос удобно и быстро создает необходимые документы, исходя из указанных шаблонов и настроенных параметров.

       — Шаблоны задаются в формате Word. Количество одновременно используемых шаблонов неограниченно.
       — Настройки (параметры) для подстановки в шаблоны хранятся в файле эксель. Может быть задано неограниченное количество параметров.

Из дополнительных возможностей макроса:

       — В настройках листа с данными достаточно указать название шаблона и именно данный шаблон будет применен для формирования документов. Если шаблонов указано несколько, то формирование документов будет происходить по нескольким (указанным) шаблонам.
       — В настройках макроса можно указать, по каким строкам формировать документы, а по каким пропускать.
       — Для каждого формируемого документа можно указать необходимое имя (название).
       — Для более удобной вставки наименований шаблонов в ячейку достаточно два раза кликнуть на соответствующей ячейке в столбце «C» и в открывшейся форме выбрать нужные шаблоны.

В целом, ничего сложного в работе с макросом и шаблонами нет.
Перед запуском макроса обязательно ознакомьтесь с примечаниями в пункте «Важно» на листе «const».

Скачать макрос эксель для создания документов и примеры шаблонов можно по ссылке выше.

Обновление макроса от 09.07.2020


В программу добавлена возможность замены значений в колонтитулах. Колонтитулы учитываются как верхние, так и нижние. При необходимости можете ознакомиться с примерами заполнения шаблонов, которые также присутствуют в архиве.
Ссылка на загрузку архива с программой обновлена. Актуальная версия программы: «CreateWord, v.2.xlsb».

В данном разделе мы рассмотрим трюк, с помощью которого можно автоматически создавать текстовые документы Word на основе данных, хранящихся в таблице Excel. Это бывает необходимо, например, для быстрого формирования текстовых отчетов, в которых должны фигурировать табличные данные. Использование этого приема мы рассмотрим на конкретном примере.

Предположим, что у нас есть следующие данные о продажах по регионам (рис. 3.31).

Внимание!

При изучении данного раздела следует обращать внимание на расположение данных на рабочем листе (то есть на координаты задействованных ячеек).

Для автоматического создания отчетов на основании приведенных данных следует в стандартном модуле редактора VBA написать код, приведенный в листинге 3.85.

Рис. 3.31. Данные о продажах

Листинг 3.85. Создание документов Word на основе таблицы Excel

Sub ReportToWord()

Dim intReportCount As Integer ‘ Количество сообщений

Dim strForWho As String ‘ Получатель сообщения

Dim strSum As String ‘ Сумма за товар

Dim strProduct As String ‘ Название товара

Dim strOutFileName As String ‘ Имя файла для сохранения

сообщения

Dim strMessage As String ‘ Текст дополнительного сообщения

Dim rgData As Range ‘ Обрабатываемые ячейки

Dim objWord As Object

Dim i As Integer

‘ Создание объекта Word

Set objWord = CreateObject(«Word.Application»)

‘ Информация с рабочего листа

Set rgData = Range(«A1»)

strMessage = Range(«E6»)

‘ Просмотр записей на листе Лист1

intReportCount = Application.CountA(Range(«A:A»))

For i = 1 To intReportCount

‘ Динамические сообщения в строке состояния

Application.StatusBar = «Создание сообщения » & i

‘ Назначение данных переменным

strForWho = rgData.Cells(i, 1).Value

strProduct = rgData.Cells(i, 2).Value

strSum = Format(rgData.Cells(i, 3).Value, «#,000»)

‘ Имя файла для сохранения отчета

strOutFileName = ThisWorkbook.path & «» & strForWho &

«.doc»

‘ Передача команд в Word

With objWord

.Documents.Add

With .Selection

‘ Заголовок сообщения

.Font.Size = 14

.Font.Bold = True

.ParagraphFormat.Alignment = 1

.TypeText Text:=»О Т Ч Е Т»

‘ Дата

.TypeParagraph

.TypeParagraph

.Font.Size = 12

.ParagraphFormat.Alignment = 0

.Font.Bold = False

.TypeText Text:=»Дата:» & vbTab & _

Format(Date, «mmmm d, yyyy»)

‘ Получатель сообщения

.TypeParagraph

.TypeText Text:=»Кому: менеджеру » & vbTab &

strForWho

‘ Отправитель

.TypeParagraph

.TypeText Text:=»От:» & vbTab &

Application.UserName

‘ Сообщение

.TypeParagraph

.TypeParagraph

.TypeText strMessage

.TypeParagraph

.TypeParagraph

‘ Название товара

.TypeText Text:=»Продано товара:» & vbTab &

strProduct

.TypeParagraph

‘ Сумма за товар

.TypeText Text:=»На сумму:» & vbTab & _

Format(strSum, «$#,##0»)

End With

‘ Сохранение документа

.ActiveDocument.SaveAs FileName:=strOutFileName

End With

Next i

‘ Удаление объекта Word

objWord.Quit

Set objWord = Nothing

‘ Обновление строки состояния

Application.StatusBar = False

‘ Вывод на экран информационного сообщения

MsgBox intReportCount & » заметки создано и сохранено в папке » _

& ThisWorkbook.path

End Sub

В результате написания кода в окне выбора макросов станет доступным макрос ReportToWord. После его запуска начнется формирование отчетов (информация о состоянии процесса будет отображаться в строке состояния). По окончании процесса на экране отобразится окно с сообщением о том, что документы сформированы и помещены в ту папку, в которой хранится текущая рабочая книга. В рассматриваемом примере будут созданы три документа с именами Магазин 1.doc, Магазин 2.doc и Магазин 3.doc. Содержимое документа Магазин 1. doc показано на рис. 3.32 (другие документы выглядят аналогичным образом).

В рассматриваемом примере Lesha – это имя пользователя, который создал документ. Очевидно, что в результате внесения соответствующих изменений в код макроса форму создаваемого отчета можно корректировать по своему усмотрению.

Рис. 3.32. Документ Word, созданный на основе данных таблицы Excel

bizard, сначала делайте код в программе Word.
Когда ставите точку, то появляются члены, которые есть у объекта. Если среди членов нет нужного, значит у объекта нет этого члена. Есть случаи, что не все члены появляются после того, как поставишь точку, но такое редко бывает.

TypeParagraph — является членом объекта Selection. Если вы перейдёте в программу Word, октроете программу VBA, введёте ActiveDocument и поставите точку, то во всплывающей подсказке не будет TypeParagraph. Это означает, что у объекта ActiveDocument нет члена TypeParagraph (могут быть исключения — член не появляется, но есть, но это бывает редко).

Здесь:

Visual Basic
1
ActiveDocument.Content.Font.Size = 11

вы используете ActiveDocument, а должны использовать oDocument, т.к. вся работа у вас из Excel в программе Word ведётся через две переменные: oWord и oDocument. Других слов ваш код не понимает, в т.ч. не понимает слова ActiveDocument.

 

khmelae

Пользователь

Сообщений: 6
Регистрация: 13.01.2017

#1

13.01.2017 03:02:19

Здравствуйте!

Есть макрос Excel который создает документ Word по шаблону. Необходимо внести изменения в код макроса таким образом чтобы:
1) Шаблоны хранились в папке «ШАБЛОНЫ (нужно чтобы хранились здесь)»
2) Готовые Договора сохранялись в папку «ДОГОВОРА (нужно чтобы сохранялись сюда)»
При этому если перемещается вся папка «CreateWordDocuments», в которой хранится файл с макросом «договор» и папки «ШАБЛОНЫ (нужно чтобы хранились здесь)» , «ДОГОВОРА (нужно чтобы сохранялись сюда)», маршрут должен подстраиваться под расположение файл с макросом «договор»

Пример прилагаю.

Заранее спасибо за помощь:)

Код
Const ИмяФайлаШаблона = "шаблон.dot"
Const КоличествоОбрабатываемыхСтолбцов = 11
Const РасширениеСоздаваемыхФайлов = ".doc"
Sub СформироватьДоговоры2()
    ПутьШаблона = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, ИмяФайлаШаблона)
    НоваяПапка = NewFolderName & Application.PathSeparator
    Dim row As Range, pi As New ProgressIndicator
    r = Cells(Rows.Count, "C").End(xlUp).row: rc = r - 2
    If rc < 1 Then MsgBox "Строк для обработки не найдено", vbCritical: Exit Sub
    pi.Show "Формирование договоров": pi.ShowPercents = True: s1 = 10: s2 = 90: p = s1: a = (s2 - s1) / rc
    pi.StartNewAction , s1, "Запуск приложения Microsoft Word"
    ' Dim WA As Word.Application, WD As Word.Document: Set WA = New Word.Application    ' c подключением библиотеки Word
    Dim WA As Object, WD As Object: Set WA = CreateObject("Word.Application")    ' без подключения библиотеки Word
    For Each row In ActiveSheet.Rows("3:" & r)
        With row
            ФИО = Trim$(.Cells(3)) & " " & Trim$(.Cells(4)) & " " & Trim$(.Cells(5))
            Filename = НоваяПапка & ФИО & РасширениеСоздаваемыхФайлов
            pi.StartNewAction p, p + a / 3, "Создание нового файла на основании шаблона", ФИО
            Set WD = WA.Documents.Add(ПутьШаблона): DoEvents
            pi.StartNewAction p + a / 3, p + a * 2 / 3, "Замена данных ...", ФИО
            For i = 1 To КоличествоОбрабатываемыхСтолбцов
                FindText = Cells(1, i): ReplaceText = Trim$(.Cells(i))
                ' так почему-то заменяет не всё (не затрагивает таблицу)
                'WA.Selection.Find.Execute FindText, , , , , , , wdFindContinue, False, ReplaceText, True
                pi.line3 = "Заменяется поле " & FindText
                With WD.Range.Find
                    .Text = FindText
                    .Replacement.Text = ReplaceText
                    .Forward = True
                    .Wrap = 1
                    .Format = False: .MatchCase = False
                    .MatchWholeWord = False
                    .MatchWildcards = False
                    .MatchSoundsLike = False
                    .MatchAllWordForms = False
                    .Execute Replace:=2
                End With
                DoEvents
            Next i
            pi.StartNewAction p + a * 2 / 3, p + a, "Сохранение файла ...", ФИО, " "
            WD.SaveAs Filename: WD.Close False: DoEvents
            p = p + a
        End With
    Next row
    pi.StartNewAction s2, , "Завершение работы приложения Microsoft Word", " ", " "
    WA.Quit False: pi.Hide
    msg = "Сформировано " & rc & " договоров. Все они находятся в папке" & vbNewLine & НоваяПапка
    MsgBox msg, vbInformation, "Готово"
End Sub

Function NewFolderName() As String
    NewFolderName = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, "Договоры, сформированные " & Get_Now)
    MkDir NewFolderName
End Function
Function Get_Date() As String: Get_Date = Replace(Replace(DateValue(Now), "/", "-"), ".", "-"): End Function
Function Get_Time() As String: Get_Time = Replace(TimeValue(Now), ":", "-"): End Function
Function Get_Now() As String: Get_Now = Get_Date & " в " & Get_Time: End Function

Прикрепленные файлы

  • CreateWordDocuments.rar (63.04 КБ)

 

khmelae

Пользователь

Сообщений: 6
Регистрация: 13.01.2017

#2

15.01.2017 02:58:16

Доброго всем времени суток!
После 4 часов проб и ошибок у меня получилось найти решение проблем с сохранением файла в нужное место. Все работает делюсь кодом макроса, может быть пригодится Вам.

Но возникли две новые трудности:
1) Как сделать так чтобы файл Word после сохранения открывался автоматически
тут у меня есть понимание что нужно внести коррективы в строку
WD.SaveAs Filename: WD.Close False: DoEvents
, но чтобы я не делал файл не открываются автоматически:

2) Как сохранить файл в формате PDF а не DOC
тут тоже есть догадка что нужно использовать метод ExportAsFixedFormat, но я не понимаю как его правильно применить.

Заранее спасибо за помощь:)

Код
Const ИмяФайлаШаблона = "ШАБЛОНЫ/шаблон2.dot"
Const ИмяФайлаДоговора = "ДОГОВОРА/Договоры"
Const КоличествоОбрабатываемыхСтолбцов = 11
Const РасширениеСоздаваемыхФайлов = ".doc"Sub СформироватьДоговоры()
    ПутьШаблона = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, ИмяФайлаШаблона)
    ПутьДоговора = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, ИмяФайлаДоговора)
    'НоваяПапка = NewFolderName & Application.PathSeparator
    Dim row As Range, pi As New ProgressIndicator
    r = Cells(Rows.Count, "C").End(xlUp).row: rc = r - 2
    If rc < 1 Then MsgBox "Строк для обработки не найдено", vbCritical: Exit Sub    pi.Show "Формирование договоров": pi.ShowPercents = True: s1 = 10: s2 = 90: p = s1: a = (s2 - s1) / rc
    pi.StartNewAction , s1, "Запуск приложения Microsoft Word"    ' Dim WA As Word.Application, WD As Word.Document: Set WA = New Word.Application    ' c подключением библиотеки Word
    Dim WA As Object, WD As Object: Set WA = CreateObject("Word.Application")    ' без подключения библиотеки Word    For Each row In ActiveSheet.Rows("3:" & r)
        With row
            ФИО = Trim$(.Cells(3)) & " " & Trim$(.Cells(4)) & " " & Trim$(.Cells(5) & Get_Now)
            Filename = ПутьДоговора & ФИО & РасширениеСоздаваемыхФайлов            pi.StartNewAction p, p + a / 3, "Создание нового файла на основании шаблона", ФИО
            Set WD = WA.Documents.Add(ПутьШаблона): DoEvents            pi.StartNewAction p + a / 3, p + a * 2 / 3, "Замена данных ...", ФИО
            For i = 1 To КоличествоОбрабатываемыхСтолбцов
                FindText = Cells(1, i): ReplaceText = Trim$(.Cells(i))                ' так почему-то заменяет не всё (не затрагивает таблицу)
                'WA.Selection.Find.Execute FindText, , , , , , , wdFindContinue, False, ReplaceText, True                pi.line3 = "Заменяется поле " & FindText
                With WD.Range.Find
                    .Text = FindText
                    .Replacement.Text = ReplaceText
                    .Forward = True
                    .Wrap = 1
                    .Format = False: .MatchCase = False
                    .MatchWholeWord = False
                    .MatchWildcards = False
                    .MatchSoundsLike = False
                    .MatchAllWordForms = False
                    .Execute Replace:=2
                End With
                DoEvents
            Next i
            pi.StartNewAction p + a * 2 / 3, p + a, "Сохранение файла ...", ФИО, " "
            WD.SaveAs Filename: WD.Close False: DoEvents
            'WD.PrintOut: WD.Close False: DoEvents печать без сохранения
            p = p + a
        End With
    Next row    pi.StartNewAction s2, , "Завершение работы приложения Microsoft Word", " ", " "
    WA.Quit True: pi.Hide
    msg = "Сформировано " & rc & " договоров. Все они находятся в папке" & vbNewLine & НоваяПапка
    MsgBox msg, vbInformation, "Готово"
End Sub




'Function NewFolderName() As String
   ' NewFolderName = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, ИмяФайлаДоговора & Get_Now)
   ' MkDir NewFolderName
'End FunctionFunction Get_Date() As String: Get_Date = Replace(Replace(DateValue(Now), "/", "-"), ".", "-"): End Function
Function Get_Time() As String: Get_Time = Replace(TimeValue(Now), ":", "-"): End Function
Function Get_Now() As String: Get_Now = Get_Date & " в " & Get_Time: End Function

Прикрепленные файлы

  • CreateWordDocuments_.rar (45.49 КБ)

Изменено: khmelae15.01.2017 02:59:58

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#3

15.01.2017 10:55:22

Цитата
khmelae написал:
использовать метод ExportAsFixedFormat, но я не понимаю как его правильно применить

записать в Word сохранение файла в PDF. Будет готовый код.

Цитата
khmelae написал:
чтобы файл Word после сохранения открывался автоматически

достаточно его просто не закрывать, я думаю. В этой строке:
WD.SaveAs Filename: WD.Close False: DoEvents
просто удалите
WD.Close False:

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

khmelae

Пользователь

Сообщений: 6
Регистрация: 13.01.2017

The_Prist

 спасибо за Ваш ответ. К сожалению просто удаление «WD.Close False: » не помогает сохраненные файлы не открываются автоматически. я уже попробовал разные варианты
1) WD.SaveAs Filename: WD.Open True: DoEvents   ‘сохранить и открыть
2) WD.Open Filename: DoEvents ‘открыть без сохранения
Но увы ничего не работает(((

C сохранением в PDF тоже не выходит, по Вашему совету сделал запись макроса «сохранение файла DOC в PDF». Попытался по подобию сделать, но ничего не получилось(((
1) WD.ExportAsFixedFormat OutputFilename: ExportFormat: wdExportFormat , PDFOpenAfterExport:=True
2) WD.ExportAsFixedFormat Filename: WD.Close False: DoEvents



Пока мой метод проб и ошибок не приносит результата…

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#5

16.01.2017 10:42:38

Цитата
khmelae написал:
сохраненные файлы не открываются

Они вообще у Вас создаются? Если каждый файл не закрывать — то он останется открытым, что приведет ровно к тому же эффекту, что закрыть-открыть. Поэтому приведенное мной решение работать должно без проблем, если только у Вас не возникает где-то раньше ошибка кода. Приведите код полностью как Вы там чего изменили.

Строка сохранения в PDF у Вас не рабочая — ознакомьтесь со статьей:

Как из Excel обратиться к другому приложению

Потому что нет у Excel понятия, что такое wdExportFormat. И то ли у Вас опечатка, то ли там знака равно после двоеточия не хватает. Выглядеть в итоге должно как-то так:

Код
WD.ExportAsFixedFormat OutputFileName:=Filename, ExportFormat:=17

только Filename должно так же отдельно формироваться для PDF, чтобы формат был именно .pdf, а не .doc. Т.е. надо создать доп.переменную, такую же как Filename и назначать ей значение. После строки:

Код
Filename = ПутьДоговора & ФИО & РасширениеСоздаваемыхФайлов

записать еще одну:

Код
FilenamePDF = ПутьДоговора & ФИО & ".pdf"

и для сохранения в PDF использовать её:

Код
WD.ExportAsFixedFormat OutputFileName:=FilenamePDF, ExportFormat:=17

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

RAN

Пользователь

Сообщений: 7091
Регистрация: 21.12.2012

#6

16.01.2017 11:00:51

Цитата
khmelae написал:
но чтобы я не делал файл не открываются автоматически

Он открывается, только в скрытом режиме.
Отобразите word на экране

Код
 WA.Visible = True
 

khmelae

Пользователь

Сообщений: 6
Регистрация: 13.01.2017

#7

17.01.2017 00:21:46

Добрый вечер!
Большое спасибо за помощь

The_Prist

.
Вопрос с сохранением в формате .pdf решен, все работает. рабочий код см. ниже. Было достаточно внести два изменения:

Const РасширениеСоздаваемыхФайлов = «.pdf»

WD.ExportAsFixedFormat OutputFileName:=Filename, ExportFormat:=17 ‘ сохранение в pdf
WD.Close False: DoEvents ‘ закрытие файла

Код
Const ИмяФайлаШаблона = "ШАБЛОНЫ/1401-1.dotx"
Const ИмяФайлаДоговора = "ПЕЧАТНЫЕ ФОРМЫ/1401-1"
Const КоличествоОбрабатываемыхСтолбцов = 134
Const РасширениеСоздаваемыхФайлов = ".pdf"
Sub СформироватьДоговоры()
    ПутьШаблона = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, ИмяФайлаШаблона)
    ПутьДоговора = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, ИмяФайлаДоговора)
    Dim row As Range, pi As New ProgressIndicator
    r = Cells(Rows.Count, "DA").End(xlUp).row: rc = r - 2
    If rc < 1 Then MsgBox "Строк для обработки не найдено", vbCritical: Exit Sub
    pi.Show "Формирование договоров": pi.ShowPercents = True: s1 = 10: s2 = 90: p = s1: a = (s2 - s1) / rc
    pi.StartNewAction , s1, "Запуск приложения Microsoft Word"
    ' Dim WA As Word.Application, WD As Word.Document: Set WA = New Word.Application    ' c подключением библиотеки Word
    Dim WA As Object, WD As Object: Set WA = CreateObject("Word.Application")    ' без подключения библиотеки Word
    For Each row In ActiveSheet.Rows("3:" & r)
        With row
            НазваниеФайла = " " & Trim$(.Cells(105)) & " " & Get_Now
            Filename = ПутьДоговора & НазваниеФайла & РасширениеСоздаваемыхФайлов
            pi.StartNewAction p, p + a / 3, "Создание нового файла на основании шаблона", НазваниеФайла
            Set WD = WA.Documents.Add(ПутьШаблона): DoEvents
            pi.StartNewAction p + a / 3, p + a * 2 / 3, "Замена данных ...", НазваниеФайла
            For i = 1 To КоличествоОбрабатываемыхСтолбцов
                FindText = Cells(1, i): ReplaceText = Trim$(.Cells(i))
                ' так почему-то заменяет не всё (не затрагивает таблицу)
                'WA.Selection.Find.Execute FindText, , , , , , , wdFindContinue, False, ReplaceText, True
                pi.line3 = "Заменяется поле " & FindText
                With WD.Range.Find
                    .Text = FindText
                    .Replacement.Text = ReplaceText
                    .Forward = True
                    .Wrap = 1
                    .Format = False: .MatchCase = False
                    .MatchWholeWord = False
                    .MatchWildcards = False
                    .MatchSoundsLike = False
                    .MatchAllWordForms = False
                    .Execute Replace:=2
                End With
                DoEvents
            Next i
            pi.StartNewAction p + a * 2 / 3, p + a, "Сохранение файла ...", НазваниеФайла, " "
            WD.ExportAsFixedFormat OutputFileName:=Filename, ExportFormat:=17 ' сохранение в pdf
            'WD.SaveAs Filename: WD.Close False: DoEvents
            'WD.PrintOut: WD.Close False: DoEvents 'печать без сохранения
            WD.Close False: DoEvents
            p = p + a
        End With
    Next row
    pi.StartNewAction s2, , "Завершение работы приложения Microsoft Word", " ", " "
    WA.Quit True: pi.Hide
    msg = "Сформировано " & rc & " договоров. Все они находятся в папке" & vbNewLine & ПутьДоговора
    MsgBox msg, vbInformation, "Готово"
    
End Sub

'Function NewFolderName() As String
   ' NewFolderName = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, ИмяФайлаДоговора & Get_Now)
   ' MkDir NewFolderName
'End Function

Function Get_Date() As String: Get_Date = Replace(Replace(DateValue(Now), "/", "-"), ".", "-"): End Function
Function Get_Time() As String: Get_Time = Replace(TimeValue(Now), ":", "-"): End Function
Function Get_Now() As String: Get_Now = Get_Date & " в " & Get_Time: End Function

Изменено: khmelae17.01.2017 00:25:51

 

khmelae

Пользователь

Сообщений: 6
Регистрация: 13.01.2017

#8

17.01.2017 01:26:42

Цитата
The_Prist написал:
Они вообще у Вас создаются?

Да создаются, я прикрепил вложение можете проверить.

По вопросу автоматического открытия / не закрытия сохраненного документа пока решения не нашел

The_Prist

.  Ваш вариант с удалением из кода «WD.Close False:» кажется логичным и правильным, но почему то не работает.
У меня есть одна догадка, суть работы макроса заключается в открытии файла шаблона DOT замене необходимых полей и сохранением файлов в формате DOС. При этом насколько я понимаю в процессе работы макроса сами созданные файлы DOС не открываются. Поэтому может быть эту проблему можно решить через открытие созданных документов DOС, но как правильно это сделать для меня пока не ясно(((

Цитата
RAN написал:
Он открывается, только в скрытом режиме.
Отобразите word на экране
Код ? 1WA.Visible = True

RAN я не совсем понимаю куда можно применить данный метод «WA.Visible = True «

Код
Const ИмяФайлаШаблона = "ШАБЛОНЫ/шаблон2.dot"
Const ИмяФайлаДоговора = "ДОГОВОРА/Договоры"
Const КоличествоОбрабатываемыхСтолбцов = 11
Const РасширениеСоздаваемыхФайлов = ".doc"
Sub СформироватьДоговоры()
    ПутьШаблона = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, ИмяФайлаШаблона)
    ПутьДоговора = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, ИмяФайлаДоговора)
    'НоваяПапка = NewFolderName & Application.PathSeparator
    Dim row As Range, pi As New ProgressIndicator
    r = Cells(Rows.Count, "C").End(xlUp).row: rc = r - 2
    If rc < 1 Then MsgBox "Строк для обработки не найдено", vbCritical: Exit Sub
    pi.Show "Формирование договоров": pi.ShowPercents = True: s1 = 10: s2 = 90: p = s1: a = (s2 - s1) / rc
    pi.StartNewAction , s1, "Запуск приложения Microsoft Word"
    ' Dim WA As Word.Application, WD As Word.Document: Set WA = New Word.Application    ' c подключением библиотеки Word
    Dim WA As Object, WD As Object: Set WA = CreateObject("Word.Application")    ' без подключения библиотеки Word
    For Each row In ActiveSheet.Rows("3:" & r)
        With row
            ФИО = Trim$(.Cells(3)) & " " & Trim$(.Cells(4)) & " " & Trim$(.Cells(5) & Get_Now)
            Filename = ПутьДоговора & ФИО & РасширениеСоздаваемыхФайлов
            pi.StartNewAction p, p + a / 3, "Создание нового файла на основании шаблона", ФИО
            Set WD = WA.Documents.Add(ПутьШаблона): DoEvents
            pi.StartNewAction p + a / 3, p + a * 2 / 3, "Замена данных ...", ФИО
            For i = 1 To КоличествоОбрабатываемыхСтолбцов
                FindText = Cells(1, i): ReplaceText = Trim$(.Cells(i))
                ' так почему-то заменяет не всё (не затрагивает таблицу)
                'WA.Selection.Find.Execute FindText, , , , , , , wdFindContinue, False, ReplaceText, True
                pi.line3 = "Заменяется поле " & FindText
                With WD.Range.Find
                    .Text = FindText
                    .Replacement.Text = ReplaceText
                    .Forward = True
                    .Wrap = 1
                    .Format = False: .MatchCase = False
                    .MatchWholeWord = False
                    .MatchWildcards = False
                    .MatchSoundsLike = False
                    .MatchAllWordForms = False
                    .Execute Replace:=2
                End With
                DoEvents
            Next i
            pi.StartNewAction p + a * 2 / 3, p + a, "Сохранение файла ...", ФИО, " "
            WD.SaveAs Filename: DoEvents ' сохранить и открыть/незакрывать
            'WD.SaveAs Filename: WD.Close False: DoEvents ' сохранить и закрыть
            'WD.PrintOut: WD.Close False: DoEvents ' печать без сохранения
            p = p + a
        End With
    Next row
    pi.StartNewAction s2, , "Завершение работы приложения Microsoft Word", " ", " "
    WA.Quit True: pi.Hide
    msg = "Сформировано " & rc & " договоров. Все они находятся в папке" & vbNewLine & НоваяПапка
    MsgBox msg, vbInformation, "Готово"
End Sub





'Function NewFolderName() As String
   ' NewFolderName = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, ИмяФайлаДоговора & Get_Now)
   ' MkDir NewFolderName
'End Function
Function Get_Date() As String: Get_Date = Replace(Replace(DateValue(Now), "/", "-"), ".", "-"): End Function
Function Get_Time() As String: Get_Time = Replace(TimeValue(Now), ":", "-"): End Function
Function Get_Now() As String: Get_Now = Get_Date & " в " & Get_Time: End Function

Прикрепленные файлы

  • CreateWordDocuments2.rar (37.92 КБ)

Изменено: khmelae17.01.2017 01:35:39

 

Logistic

Пользователь

Сообщений: 741
Регистрация: 03.01.2013

khmelae

, а что нужно изменить в коде ,что бы можно было формировать  один договор ,выделили в таблице  ячейку «Прізвище» Дзюба и получили договор по конкретной Фамилии.

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#10

17.01.2017 10:32:17

Цитата
khmelae написал:
в процессе работы макроса сами созданные файлы DOС не открываются

открываются. И даже по коду видно, что открываются, заполняются и далее СОХРАНЯЮТСЯ КАК. А это значит, что они остаются открытыми. Об этом же говорит строка WD.Close, т.к. если бы они не были открыты — зачем их закрывать?
Просто, вполне очевидно, что Вам надо еще убрать строку WA.Quit. Это закрытие Word-а полностью. А вместе с ним, естественно, закрываются и все документы.

Цитата
khmelae написал:
не совсем понимаю куда можно применить данный метод «WA.Visible = True «

сразу после строки:

Код
Dim WA As Object, WD As Object: Set WA = CreateObject("Word.Application")

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

khmelae

Пользователь

Сообщений: 6
Регистрация: 13.01.2017

#11

18.01.2017 00:40:11

Ооо то что надо спасибо

The_Prist

, теперь я понял как применить идею

RAN

, ему тоже спасибо за помощь.

И так позволю себе подвести промежуточные итоги по улучшению данного макроса. Пример подкрепляю к данному сообщению, код макроса с различными вариантами его работы выкладываю ниже.

Цитата
Logistic написал:
а что нужно изменить в коде ,что бы можно было формировать  один договор ,выделили в таблице  ячейку «Прізвище» Дзюба и получили договор по конкретной Фамилии.

Logistic

я к сожалению не так хорошо разбираюсь в написании макросов чтобы, так просто и легко написать Вам изменение для формирования договора по выделенной ячейки, могу сказать одно что это точно можно реализовать, т.к. я видел похожие решения на др. форумах, но как реализовать конкретно для этого макроса я не подскажу. Попробуйте обратится к Богу Excel

The_Prist

;), он думаю сможет подсказать идеи.
Но я могу предложить рабоче-крестьянский вариант выполнения Вашей

Logistic

задачи без внесения изменений в данный макрос. Как вариант можно использовать формулу ВПР и дополнительный столбец с отметкой какую строку нужно сформировать как договор, это если надо сформировать только один договор из списка (пример во вложении). Если же Вам необходимо сформировать несколько договоров то можно использовать ВПР + массив. Если не разберетесь пишите ;)

Код
Const ИмяФайлаШаблона = "ШАБЛОНЫ/шаблон2.dot"
Const ИмяФайлаДоговора = "ДОГОВОРА/Договоры"
Const КоличествоОбрабатываемыхСтолбцов = 19
Const РасширениеСоздаваемыхФайлов = ".doc"
Sub СформироватьДоговоры()
    ПутьШаблона = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, ИмяФайлаШаблона)
    ПутьДоговора = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, ИмяФайлаДоговора)
    'НоваяПапка = NewFolderName & Application.PathSeparator
    Dim row As Range, pi As New ProgressIndicator
    r = Cells(Rows.Count, "K").End(xlUp).row: rc = r - 2
    If rc < 1 Then MsgBox "Строк для обработки не найдено", vbCritical: Exit Sub
    pi.Show "Формирование договоров": pi.ShowPercents = True: s1 = 10: s2 = 90: p = s1: a = (s2 - s1) / rc
    pi.StartNewAction , s1, "Запуск приложения Microsoft Word"
    ' Dim WA As Word.Application, WD As Word.Document: Set WA = New Word.Application    ' c подключением библиотеки Word
    Dim WA As Object, WD As Object: Set WA = CreateObject("Word.Application")    ' без подключения библиотеки Word
    WA.Visible = True ' отобразить Word
    
    For Each row In ActiveSheet.Rows("3:" & r)
        With row
            ФИО = Trim$(.Cells(11)) & " " & Trim$(.Cells(12)) & " " & Trim$(.Cells(13) & Get_Now)
            Filename = ПутьДоговора & ФИО & РасширениеСоздаваемыхФайлов
            pi.StartNewAction p, p + a / 3, "Создание нового файла на основании шаблона", ФИО
            Set WD = WA.Documents.Add(ПутьШаблона): DoEvents
            pi.StartNewAction p + a / 3, p + a * 2 / 3, "Замена данных ...", ФИО
            For i = 11 To КоличествоОбрабатываемыхСтолбцов
                FindText = Cells(1, i): ReplaceText = Trim$(.Cells(i))
                ' так почему-то заменяет не всё (не затрагивает таблицу)
                'WA.Selection.Find.Execute FindText, , , , , , , wdFindContinue, False, ReplaceText, True
                pi.line3 = "Заменяется поле " & FindText
                With WD.Range.Find
                    .Text = FindText
                    .Replacement.Text = ReplaceText
                    .Forward = True
                    .Wrap = 1
                    .Format = False: .MatchCase = False
                    .MatchWholeWord = False
                    .MatchWildcards = False
                    .MatchSoundsLike = False
                    .MatchAllWordForms = False
                    .Execute Replace:=2
                End With
                DoEvents
            Next i
            pi.StartNewAction p + a * 2 / 3, p + a, "Сохранение файла ...", ФИО, " "
            WD.SaveAs Filename: 'сохранить созданый документ
            'или
            'WD.ExportAsFixedFormat OutputFileName:=Filename, ExportFormat:=17 ' сохранение в pdf
            'или
            'WD.PrintOut:'печать без сохранения
            
            'WD.Close False: DoEvents 'закрыть созданый документ Word
            
            p = p + a
        End With
    Next row
    pi.StartNewAction s2, , "Завершение работы приложения Microsoft Word", " ", " "
    'WA.Quit True: 'закрыть приложение Word
    pi.Hide
    msg = "Сформировано " & rc & " договоров. Все они находятся в папке" & vbNewLine & НоваяПапка
    MsgBox msg, vbInformation, "Готово"
End Sub





'Function NewFolderName() As String
   ' NewFolderName = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, ИмяФайлаДоговора & Get_Now)
   ' MkDir NewFolderName
'End Function
Function Get_Date() As String: Get_Date = Replace(Replace(DateValue(Now), "/", "-"), ".", "-"): End Function
Function Get_Time() As String: Get_Time = Replace(TimeValue(Now), ":", "-"): End Function
Function Get_Now() As String: Get_Now = Get_Date & " в " & Get_Time: End Function

 

Прикрепленные файлы

  • CreateWordDocuments3.rar (27.75 КБ)

Изменено: khmelae18.01.2017 00:43:20

 

msdmo

Пользователь

Сообщений: 4
Регистрация: 29.02.2016

Доброго времени суток.
Подскажите пожалуйста, какие параметры надо изменить в коде макроса, если мне надо добавить слева один столбик и сверху 8 строк?
Поменял в строках:
r = Cells(Rows.Count, «B«).End(xlUp).row: rc = r — 10
For Each row In ActiveSheet.Rows(«11:» & r)
ФИО = Trim$(.Cells(2)) & » » & Trim$(.Cells(3)) & » » & Trim$(.Cells(4))
Вордовские документы формируются, но данные не вставляются.

Прикрепленные файлы

  • test1.zip (53.5 КБ)

 

msdmo

Пользователь

Сообщений: 4
Регистрация: 29.02.2016

#13

19.05.2017 16:17:45

Сделал.

Код
FindText = Cells(9, i): ReplaceText = Trim$(.Cells(i)) 'менять номер строки с фигурными скобками

Ещё ошибки возникают, если объединённая ячейка попадается ((

Содержание

  • VBA PDF (бесплатные загрузки)
  • Примеры Word VBA «Шпаргалка»
  • Учебное пособие по макросам Word VBA
  • Пример простого макроса Word
  • Объект документа Word
  • Документы
  • Диапазон, выделение, абзацы
  • Примеры макросов Word

Добро пожаловать в наше мега-руководство по Word VBA / макросам!

Эта страница содержит:

    1. Учебное пособие по Word VBA в формате PDF (бесплатная загрузка)
    2. Word VBA «Шпаргалка», содержащая список наиболее часто используемых фрагментов кода Word VBA.
    3. Полное руководство по Word VBA / Macro.
    4. Список всех наших руководств по макросам Word VBA с возможностью поиска

Возможно, вас заинтересует наше интерактивное руководство по VBA для Excel. Хотя некоторые из примеров / упражнений относятся к Excel VBA, большая часть содержимого является общим для всех VBA, и вам может быть полезно изучить такие концепции, как If, Loops, MessageBoxes и т. Д.

VBA PDF (бесплатные загрузки)

Загрузите наше бесплатное руководство по Microsoft Word VBA! Или учебники VBA для других программ Office!

Скачать

Ниже вы найдете простые примеры кода VBA для работы с Microsoft Word.

Выбрать / перейти к

ОписаниеКод VBABackspaceSelection.TypeBackspaceВыбрать весь документSelection.HomeKey Unit: = wdStory
Selection.ExtendКопироватьSelection.CopyУдалитьSelection.Delete Unit: = wdCharacter, Count: = 1Вставить послеSelection.InsertAfter «текст»Начало строкиSelection.HomeKey Unit: = wdLineКонец линииSelection.EndKey Unit: = wdLineВставитьSelection.PasteВыбрать всеSelection.WholeStoryВыбрать всю строкуSelection.EndKey Unit: = wdLine, Extend: = wdExtendВверх по абзацуSelection.MoveUp Unit: = wdParagraph, Count: = 1Переместить вправо на один символSelection.MoveRight Unit: = wdCharacter, Count: = 1Переместить вправо на одну ячейку в таблицеSelection.MoveRight Unit: = wdCellПерейти к началу документаSelection.HomeKey Unit: = wdStoryПерейти в конец документаSelection.EndKey Unit: = wdStoryПерейти на страницу 1Selection.GoTo What: = wdGoToPage, Which: = wdGoToNext, Name: = ”1 ″Перейти к началу страницыSelection.GoTo What: = wdGoToBookmark, Name: = ” Page”
Selection.MoveLeft Unit: = wdCharacter, Count: = 1

Return to Top

Закладки

ОписаниеКод VBAДобавлятьС ActiveDocument.Bookmarks
.Add Range: = Selection.Range, Name: = «Name».
.DefaultSorting = wdSortByName
.ShowHidden = Ложь
Конец сСчитатьDim n as Integer
n = ActiveDocument.Bookmarks.CountУдалитьActiveDocument.Bookmarks («Имя закладки»). УдалитьСуществуют?Если ActiveDocument.Bookmarks.Exists («BookmarkName») = True, то
‘Сделай что-нибудь
Конец, еслиПерейти кSelection.GoTo What: = wdGoToBookmark, Name: = ”BookmarkName”ВыбиратьActiveDocument.Bookmarks («Имя закладки»). ВыберитеЗаменить текстSelection.GoTo What: = wdGoToBookmark, Name: = ”BookmarkName”
Selection.Delete Unit: = wdCharacter, Count: = 1
Selection.InsertAfter «Новый текст»
ActiveDocument.Bookmarks.Add Range: = Selection.Range, _
Name: = ”BookmarkName”

Return to Top

Документ

ОписаниеКод VBAАктивироватьДокументы («Example.doc»). АктивироватьДобавить в переменнуюDim doc As Document
Установить doc = Documents.AddДобавлятьDocuments.AddДобавить (из другого документа)Documents.Add Template: = ”C: Forms FormDoc.doc”, _
NewTemplate: = FalseЗакрыватьДокументы («Example.doc»). ЗакрытьЗакрыть — сохранить измененияДокументы («Example.doc»). Закройте SaveChanges: = wdSaveChangesЗакрыть — не сохранятьДокументы («Example.doc»). Закройте SaveChanges: = wdDoNotSaveChanges.Закрыть — запрос на сохранениеДокументы («Example.doc»). Закройте SaveChanges: = wdPromptToSaveChanges.

Return to Top

Столбцы

ОписаниеКод VBAСохранить какДокументы («Example.doc»). SaveAs («C: Example Example.doc»)СохранитьДокументы («Example.doc»). СохранитьЗащищатьДокументы («Example.doc»). Защитить пароль: = «пароль»Снять защитуДокументы («Example.doc»). Снять пароль: = «пароль»Число страницDim varNumberPages как вариант
varNumberPages = _
ActiveDocument.Content.Information (wdActiveEndAdjustedPageNumber)РаспечататьДокументы («Example.doc»). Распечатать

Return to Top

Устали искать примеры кода VBA? Попробуйте AutoMacro!

Шрифт

ОписаниеКод VBAРазмерSelection.Font.Size = 12ЖирныйSelection.Font.Bold = TrueКурсивSelection.Font.Italic = TrueПодчеркиваниеSelection.Font.Underline = wdUnderlineSingleВсе заглавные буквыSelection.Font.AllCaps = TrueЦветSelection.Font.TextColor = vbRedИмяSelection.Font.Name = «Абади»Нижний индексSelection.Font.Subscript = TrueSuperScriptSelection.Font.Superscript = TrueЦвет выделенияSelection.Range.HighlightColorIndex = wdYellowСтильSelection.Style = ActiveDocument.Styles («Нормальный»)

Return to Top

Вставлять

ОписаниеКод VBAВставить автотекстSelection.TypeText Текст: = ”a3 ″
Selection.Range.InsertAutoTextВставить код датыВставить файлSelection.InsertFile («C: Docs Something.doc»)Вставить разрыв страницыSelection.InsertBreak Тип: = wdPageBreakВставить символ абзацаSelection.TypeText Text: = Chr $ (182)Вставить вкладкуSelection.TypeText Текст: = vbTabВставить текстSelection.TypeText Text: = «Любой текст»Вставить абзац типаSelection.TypeParagraphВставить абзацSelection.InsertParagraph

Return to Top

Петли

ОписаниеКод VBAСделать до конца документаСделать до ActiveDocument.Bookmarks (« Sel») = ActiveDocument.Bookmarks (« EndOfDoc»)
‘Сделай что-нибудь
SubДля каждого документа в ДокументахDim doc As Document
Для каждого документа в документах
‘Сделай что-нибудь
Следующий документЦикл по абзацамПодпункты через абзацы
Dim i As Long, iParCount As Long
iParCount = ActiveDocument.Paragraphs.CountFori = 1 На iParCount
ActiveDocument.Paragraphs (i) .Alignment = wdAlignParagraphLeft
Далее я

Return to Top

Пункт

ОписаниеКод VBAKeepLinesTogetherSelection.ParagraphFormat.KeepTogether = TrueKeepWithNextSelection.ParagraphFormat.KeepWithNext = ИстинаПробел послеSelection.ParagraphFormat.SpaceAfter = 12Пространство доSelection.ParagraphFormat.SpaceBefore = 0Выровнять по центруSelection.ParagraphFormat.Alignment = wdAlignParagraphCenterВыровнять по правому краюSelection.ParagraphFormat.Alignment = wdAlignParagraphRightВыровнять по левому краюSelection.ParagraphFormat.Alignment = wdAlignParagraphLeftЛевый отступSelection.ParagraphFormat.LeftIndent = InchesToPoints (3,75)Правый отступSelection.ParagraphFormat.RightIndent = InchesToPoints (1)Межстрочный интервалС Selection.ParagraphFormat
.LineSpacingRule = wdLineSpaceExactly
.LineSpacing = 12
Конец сПеребрать все абзацыПодпункты через абзацы
Dim i As Long, iParCount As Long
iParCount = ActiveDocument.Paragraphs.CountFori = 1 На iParCount
ActiveDocument.Paragraphs (i) .Alignment = wdAlignParagraphLeft
Далее я

Return to Top

Учебное пособие по макросам Word VBA

Это руководство по использованию VBA с Microsoft Word. Это руководство научит вас писать простой макрос и взаимодействовать с документами, диапазонами, выделениями и абзацами.

Примечание. Если вы новичок в Macros / VBA, вам также может быть полезна эта статья: Как писать макросы VBA с нуля.

VBA — это язык программирования, используемый для автоматизации программ Microsoft Office, включая Word, Excel, Outlook, PowerPoint и Access.

Макросы представляют собой блоки кода VBA, которые выполняют определенные задачи.

Когда ты Записать макрос, Word запишет код VBA в макрос, что позволит вам повторять ваши действия. Вы можете увидеть список всех доступных макросов из Просмотр> Макросы.

После записи макроса вы сможете редактировать макрос из списка макросов:

Когда вы нажимаете Редактировать, вы открываете Редактор VBA. Используя редактор VBA, вы можете редактировать записанные макросы или писать макрос Word с нуля. Для доступа к редактору VBA используйте ярлык ALT + F11 или щелкните Visual Basic от Лента разработчика.

Пример простого макроса Word

Это простой пример макроса Word VBA. Он выполняет следующие задачи:

  • Открывает документ Word
  • Записывает в документ
  • Закрывает и сохраняет документ Word.
123456789101112131415 Sub WordMacroExample ()’Открыть документ и назначить переменнойDim oDoc как документУстановите oDoc = Documents.Open («c: Users something NewDocument.docx»).’Написать в документSelection.TypeText «www.automateexcel.com»Selection.TypeParagraph’Сохранить и закрыть документoDoc.SaveoDoc.CloseКонец подписки

Основы работы с макросами Word

Весь код VBA должен храниться в подобных процедурах. Чтобы создать процедуру в VBA, введите «Sub WordMacroExample» (где «WordMacroExample» — желаемое имя макроса) и нажмите ВХОДИТЬ. VBA автоматически добавит круглые скобки и End Sub.

Объект документа Word

При взаимодействии с Microsoft Word в VBA вы часто будете ссылаться на Word «Объекты». Наиболее распространенные объекты:

Объект приложения — сам Microsoft Word

Объект документа — документ Word

Объект диапазона — Часть документа Word

Объект выделения — Выбранный диапазон или положение курсора.

заявка

Приложение — это объект «верхнего уровня». Через него можно получить доступ ко всем остальным объектам Word.

Помимо доступа к другим объектам Word, можно применить настройки «уровня приложения»:

1 Application.Options.AllowDragAndDrop = True

Это пример доступа к «Выборке» в «Windows (1)» в Приложении:

1 Application.Windows (1) .Selection.Characters.Count

Однако к наиболее распространенным объектам Word можно получить доступ напрямую, без ввода полной иерархии. Поэтому вместо этого вы можете (и должны) просто ввести:

1 Selection.Characters.Count

Документы

ActiveDocument

Часто у вас есть два или более документов, открытых в Word, и вам нужно указать, с каким конкретным документом Word следует взаимодействовать. Один из способов указать, какой документ использовать ActiveDocument. Например:

1 ActiveDocument.PrintOut

… Напечатал бы ActiveDocument. ActiveDocument — это документ в Word, который «имеет фокус»

Чтобы переключить ActiveDocument, используйте команду Activate:

1 Документы («Example.docx»). Активировать

Этот документ

Вместо использования ActiveDocument для ссылки на активный документ вы можете использовать ThisDocument для ссылки на документ, в котором хранится макрос. Этот документ никогда не изменится.

Переменные документа

Однако для более сложных макросов может быть сложно отслеживать активный документ. Также может быть неприятно переключаться между документами.

Вместо этого вы можете использовать переменные документа.

Этот макрос назначит ActiveDocument переменной, а затем распечатает документ, используя переменную:

12345 Sub VarExample ()Dim oDoc как документУстановите oDoc = ActiveDocumentoDoc.PrintOutКонец подписки

Документ Методы

Открыть документ

Чтобы открыть документ Word:

1 Documents.Open «c: Users SomeOne Desktop Test PM.docx»

Мы рекомендуем всегда назначать документ переменной при его открытии:

12 Dim oDoc как документУстановите oDoc = Documents.Open («c: Users SomeOne Desktop Test PM.docx»).

Создать новый документ

Чтобы создать новый документ Word:

Мы можем указать Word создать новый документ на основе некоторого шаблона:

1 Documents.Add Template: = «C: Program Files Microsoft Office Templates MyTemplate.dotx»

Как всегда, присвоение документа переменной при создании или открытии помогает избавить от серьезных проблем:

12 Dim oDoc как документУстановите oDoc = Documents.Add (Template: = «C: Program Files Microsoft Office Templates MyTemplate.dotx»)

Сохранить документ

Чтобы сохранить документ:

или Сохранить как:

1 ActiveDocument.SaveAs FileName: = c: Users SomeOne Desktop test2.docx «, FileFormat: = wdFormatDocument

Закрыть документ

Чтобы закрыть документ и сохранить изменения:

1 ActiveDocument.Close wdSaveChanges

или без сохранения изменений:

1 ActiveDocument.Close wdDoNotSaveChanges

Распечатать документ

Это напечатает активный документ:

1 ActiveDocument.PrintOut

Диапазон, выделение, абзацы

Диапазон а также Выбор являются, вероятно, наиболее важными объектами в Word VBA и, безусловно, наиболее часто используемыми.

Диапазон относится к некоторой части документа, обычно, но не обязательно, к тексту.

Выбор относится к выделенному тексту (или другому объекту, например изображениям) или, если ничего не выделено, к точке вставки.

Абзацы представляют абзацы в документе. Это менее важно, чем кажется, потому что у вас нет прямого доступа к тексту абзаца (вам нужно получить доступ к определенному диапазону абзацев, чтобы внести изменения).

Диапазон

Диапазон может быть любой частью документа, включая весь документ:

12 Dim oRange As RangeУстановите oRange = ActiveDocument.Content

или он может быть маленьким, как один символ.

Другой пример, этот диапазон будет относиться к первому слову в документе:

12 Dim oRange As RangeУстановите oRange = ActiveDocument.Range.Words (1)

Обычно вам нужно получить диапазон, который относится к определенной части документа, а затем изменить его.

В следующем примере мы выделим первое слово второго абзаца жирным шрифтом:

123 Dim oRange As RangeУстановите oRange = ActiveDocument.Paragraphs (2) .Range.Words (1)oRange.Bold = True

Установить текст диапазона

Чтобы установить текстовое значение диапазона:

123 Dim oRange As RangeУстановите oRange = ActiveDocument.Paragraphs (2) .Range.Words (1)oRange.Text = «Привет»

(Совет: обратите внимание на пробел после «Hello». Поскольку слово «объект» включает пробел после слова, просто «hello» мы получим «Hellonext word»)

С диапазонами можно делать сотни вещей. Всего несколько примеров (предполагается, что вы уже сделали объектную переменную апельсин относится к интересующему диапазону):

Изменить шрифт

1 oRange.Font.Name = «Arial»

Отображение в окне сообщения количества символов в определенном диапазоне

1 MsgBox oRange.Characters.Count

Вставьте текст перед ним

1 oRange.InsertBefore «это вставленный текст»

Добавить сноску к диапазону

12 ActiveDocument.Footnotes.Add Диапазон: = oRange, _Text: = «Подробнее читайте на easyexcel.net.»

Скопируйте в буфер обмена

1234 oRange.CopyЧасто вам нужно перейти к конкретному диапазону. Итак, вы можете начать, начать и закончитьoRange.Start = 5oRange.End = 50

После приведенного выше кода oRange будет относиться к тексту, начинающемуся с пятого и заканчивающемуся 50-м символом в документе.

Выбор

Выбор используется даже шире, чем Диапазон, потому что с ним легче работать Выборы чем Диапазоны, ЕСЛИ ваш макрос взаимодействует ТОЛЬКО с ActiveDocument.

Сначала выберите желаемую часть вашего документа. Например, выберите второй абзац в активном документе:

1 ActiveDocument.Paragraphs (2) .Range.Select

Затем вы можете использовать объект выбора для ввода текста:

1 Selection.TypeText «Какой-то текст»

Мы можем ввести несколько абзацев ниже «Некоторый текст»:

12 Selection.TypeText «Какой-то текст»Selection.TypeParagraph

Часто необходимо знать, выделен ли какой-то текст или у нас есть только точка вставки:

12345 Если Selection.Type wdSelectionIP ТогдаSelection.Font.Bold = TrueЕщеMsgBox «Вам нужно выделить текст».Конец, если

При работе с объектом Selection мы хотим поместить точку вставки в определенное место и запускать команды, начиная с этой точки.

Начало документа:

1 Selection.HomeKey Unit: = wdStory, Extend: = wdMove

Начало текущей строки:

1 Selection.HomeKey Unit: = wdLine, Extend: = wdMove

Параметр Extend wdMove перемещает точку вставки. Вместо этого вы можете использовать wdExtend, который выделит весь текст между текущей точкой вставки.

1 Selection.HomeKey Unit: = wdLine, Extend: = wdExtend

Переместить выделение

Самый полезный метод изменения положения точки вставки — «Перемещение». Чтобы переместить выделение на два символа вперед:

1 Selection.Move Unit: = wdCharacter, Count: = 2

чтобы переместить его назад, используйте отрицательное число для параметра Count:

1 Selection.Move Unit: = wdCharacter, Count: = — 2

Параметр единицы измерения может быть wdCharacter, wdWord, wdLine или другим (используйте справку Word VBA, чтобы увидеть другие).

Чтобы вместо этого переместить слова:

1 Selection.Move unit: = wdWord, Count: = 2

С выделением легче работать (по сравнению с диапазонами), потому что он похож на робота, использующего Word, имитирующего человека. Где находится точка вставки — какое-то действие произойдет. Но это означает, что вы должны позаботиться о том, где находится точка вставки! Это непросто после многих шагов в коде. В противном случае Word изменит текст в нежелательном месте.

Если вам нужно какое-то свойство или метод, недоступный в объекте Selection, вы всегда можете легко получить диапазон, связанный с выбором:

1 Установите oRange = Selection.Range.

СОВЕТ: Использование Выбор часто проще, чем использование диапазонов, но также и медленнее (важно, когда вы имеете дело с большими документами)

Абзацы

Вы не можете напрямую использовать объект Paragraphs для изменения текста:

1 ActiveDocument.Paragraphs (1) .Text = «Нет, это не сработает»

Выше не сработает (на самом деле выдаст ошибку). Вам нужно сначала получить диапазон, связанный с конкретным абзацем:

1 ActiveDocument.Paragraphs (1) .Range.Text = «Теперь работает :)»

Но вы можете напрямую изменить его стиль:

1 ActiveDocument.Paragraphs (1) .Style = «Нормальный»

или измените форматирование на уровне абзаца:

1 ActiveDocument.Paragraphs (1) .LeftIndent = 10

или, может быть, вы хотите сохранить этот абзац на одной строке со следующим абзацем:

1 ActiveDocument.Paragraphs (1) .KeepWithNext = True

Сделайте абзац по центру:

1 ActiveDocument.Paragraphs (1) .Alignment = wdAlignParagraphCenter

ОЧЕНЬ полезно назначить конкретный абзац объектной переменной. Если мы присвоим переменной конкретный абзац, нам не нужно беспокоиться, станет ли первый абзац вторым, потому что мы вставили перед ним один абзац:

12 dim oPara как абзацУстановите oPara = Selection.Paragraphs (1) ‘здесь мы присваиваем первый абзац текущего выделения переменной

Вот пример, в котором мы вставляем абзац над первым абзацем, но мы все еще можем ссылаться на старый первый абзац, потому что он был назначен переменной:

1234567 Sub ParagraphExample ()Dim oPara как абзацУстановить oPara = ActiveDocument.Paragraphs (1)MsgBox oPara.Range.TextoPara.Range.InsertParagraphBefore ‘Вставить абзацMsgBox oPara.Range.TextКонец подписки

Объект абзаца очень часто используется в циклах:

123456789101112 Sub LoopThroughParagraphs ()Dim oPara как абзацДля каждого параметра в ActiveDocument.Paragraphs«Сделай что-нибудь с этим. Мы просто покажем’текст абзаца, если его стиль — «Заголовок 4″Если oPara.Style = «Заголовок 4», тоMsgBox oPara.Range.TextКонец, еслиДалее oParaКонец подписки

Word VBA Tutorial Заключение

В этом руководстве были рассмотрены основы Word VBA. Если вы новичок в VBA, вам также следует ознакомиться с нашим общим руководством по VBA, чтобы узнать больше о переменных, циклах, окнах сообщений, настройках, условной логике и многом другом.

Примеры макросов Word

Примеры макросов Word
Шаблоны
Добавить новые документы
Подсчет слов в выделенном фрагменте
Текстовые поля
Сохранить как PDF
Закладки
Таблицы
Найти, найти и заменить
Открытые документы

Word VBA: часто задаваемые вопросы

Что такое макрос Word?

Макрос — это общий термин, обозначающий набор инструкций по программированию, которые автоматизируют задачи. Макросы Word автоматизируют задачи в Word с помощью языка программирования VBA.

Есть ли в слове VBA?

Да, в Microsoft Word есть редактор VBA. Доступ к нему можно получить, нажав клавиши ALT + F11 или перейдя в раздел «Разработчик»> «Visual Basic».

Как использовать VBA в Word?

1. Откройте редактор VBA (ALT + F11 или Разработчик> Visual Basic).
2. Выберите «Вставить»> «Модуль», чтобы создать модуль кода.
3. Введите «Sub HelloWorld» и нажмите Enter.
4. Между строками «Sub HelloWorld» и «End Sub» введите «MsgBox« Hello World! »
5. Вы создали макрос!
6. Теперь нажмите «F5», чтобы запустить макрос.

Цель процесса автоматического создания документов

Автоматическое создание документа — базовая единица оптимизации ресурсных затрат Вашей организации. Деятельность любой компании неразрывно связана с документооборотом, будь то управление персоналом — кадровая служба (заявления на отпуск, увольнение, больничный), бухгалтерия, либо же просто формирование определенного пакета документов по той или иной активности компании. Зачастую, сам процесс подготовки документов сводится к монотонным действиям по расстановке конкретных значений по заранее отведенным позициям в шаблоне. Слабыми сторонами данного подхода являются: низкая скорость подготовки документации и высокая степень возникновения ошибки ввиду человеческого фактора. При росте объема документации вероятность ошибки только возрастает, например, Вам нужно подготовить доп соглашения для всего штата сотрудников. Основные задачи программы автоматического создания документов Word на основе шаблонов — свести к минимуму вероятность возникновения ошибок ввода, значительно увеличить скорости самого процесса. Все действия сводятся к выбору записи или записей данных о сотруднике/клиенте/заказе/поставщике из исходной таблицы и указанию шаблона подготавливаемого документа.

Ссылки для скачивания:

— Скачать макрос автоматического создания документов Word по шаблону (архив 208КБ)

Автоматическое создание документа

Как начать работу с автоматическим формированием документов Word:

1. Разархивируйте скачанный архив с файлом с помощью программы 7zip или WinRar.

2. При появлении сообщения о доверенном источнике: закройте программу, кликните правой кнопкой мыши на файле — «Свойства», далее установите галочку напротив «Разблокировать».
сообщение безопасности платежного календаряразблокировать платежный календарь

3. Если в Вашем Excel запуск макросов по умолчанию отключен, в данном окне необходимо нажать «Включить содержимое».включить содержимое

4. Для полноценной работы с файлом необходимо нажать «Разрешить редактирование» при появлении данного сообщения.разрешить редактирование

Автоматическое создание документа — этап 1. Настройка программы

Все действия по настройке макроса и сам процесс построения документов происходят на листе «Настройки», который условно можно разделить на две области: таблица исходных данных и панель кнопочного управления.

Таблица исходных данных состоит из строки меток (условных обозначений каждого столбца) — строка №3, заголовка с названиями столбцов — строка №4 и построчных записей — начиная с 5й строки. Количество колонок, их названия и условные обозначения можно свободно редактировать, соблюдая простые правила:

  • Если Вы добавляете новую колонку, у нее должно быть название и условное обозначение.
  • Для склонения ФИО сотрудника в Родительный или Дательный падежи используйте встроенные функции =RODP() и =DATP() соответственно.
  • Не допускайте наличия пустых колонок (без названий и обозначений) между колонками данных.
  • Не удаляйте колонку «ФИО сотрудника», т.к. она является ключевой для работы программы. Вы можете ее переименовать — заказчик, ответственный, клиент, менеджер и т.д. на свое усмотрение. Она используется в процессе сохранения итогового word документа, как часть имени, например: Иванов А.В. Заявление на отпуск, Петров В.К. Накладная на отгрузку.

Автоматическое создание документа по шаблону

Также Вы можете разбивать записи таблицы (строки) на группы. Например Вы хотите завести сотрудников по отделам или заказчиков по направлениям деятельности, или городам расположения и т.д..

Панель кнопочного управления автоматизированного создания документов состоит из следующих элементов интерфейса:

  • Добавить запись — вставляет новую строку в заранее выбранную вами ячейку. Также можно добавлять записи вручную с помощью стандартной вставки строки excel;
  • Добавить группу — вставляет новую серую строку группы в заранее выбранную вами ячейку;
  • Удалить элемент — удаляет любую выбранную строку таблицы данных;
  • Очистить таблицу — полностью стирает данные из таблицы. Можно использовать для очистки листа от тестовых данных;
  • Создать документ — выбор шаблона word для построения документа. Перед этим в таблицы должны быть выбраны записи данных, по которым необходимо произвести построение.

Перед запуском процедуры автоматизированного создания документов убедитесь, что указаны верные пути к word шаблонам и папке сохранения результатов построения!

Автоматическое создание документа — этап 2. Шаблоны Word

автоматизированный шаблон Word

Процесс подготовки word шаблонов для автоматического построения документов включает в себя рад несложных действий. Создайте общую папку для всех шаблонов, в ней создайте папки категорий, чтобы разделить шаблоны по областям применения (названия категорий укажите на свое усмотрение). В каждой подпапке определенной категории расположите непосредственно документы word с расставленными метками. Метки расположены в 3й строке таблицы над каждый ее столбцом. Поставьте метки в те места шаблона, в которые вы хотите прокачать данные из определенного столбца. Например, там где должно быть фио сотрудника укажите [fio].

Порядок действий запуска автоматического создания документов

Когда таблица данных заполнена, а метки в шаблонах расставлены по своим местам пора приступать к самой интересной части — автоматизированному формированию документов word.

В первую очередь, выделите строку или диапазон данных таблицы, по которым хотите сформировать документы:

Автоматическое создание документа Word

Шаг номер два — нажмите кнопку «Создать документ». Перед Вами появится диалоговое окно, в котором нужно выбрать подпапку — категорию документа и один, либо несколько шаблонов построения. Далее кликните по кнопке «Сформировать документы».

окно выбора шаблон Word

Мои поздравления! Документы успешно сформированы и лежат по указанному Вами пути для сохранения!

Заказать разработку программ или доработку любого проекта

Благодарю Вас за прочтение данной статьи. Надеюсь, что материал подан понятно и я смог ответить на большую часть Ваших вопросов по поводу автоматизации создания документов. Но, как говорится, лучше один раз попробовать, чем сто раз прочитать. Скачивайте программу по ссылке вверху или внизу статьи, в архиве также идет набор тестовых данных, которые содержат как шаблоны, так и заполненную таблицу самого макроса. Просто разархивируйте файлы в любое доступное место и начинайте работу.

Всегда рад ответить на Ваши вопросы, готов подготовить оптимальные решения обработки данных для Вашего бизнеса, автоматизировать рутинные процессы, связаться со мной можно через WatsApp 89507094770, сайт excellab.ru или написать на почту: goryaninov@bk.ru, профиль вк:

Ссылки для скачивания:

— Скачать макрос автоматического создания документов Word по шаблону (архив 208КБ)

Здесь можно ознакомиться с другими программами автоматизации, которые представлены на моем сайте:

— Дневной табель учета рабочего времени в excel
— Почасовой табель учета рабочего времени в excel
— Табель учета рабочего времени в днях по форме Т-13
— Табель расчет и планирование вахты
— Табель учета рабочего времени с учетом ночных смен
— Платежный календарь в excel

Понравилась статья? Поделить с друзьями:
  • Макрос снять фильтр excel
  • Макрос следующая строка excel
  • Макрос скрытия ячеек excel
  • Макрос скрывающий пустые строки в excel
  • Макрос синтаксис if в excel