Skip to content
На чтение 5 мин. Просмотров 3.3k.
Что делает макрос: Одним из наиболее востребованных форм интеграции Word с почтой — это слияние. В большинстве случаев рассылки писем относятся к процессу создания одного письма или
документа, а затем его сочетание с отдельным документом, содержащим их имена и адреса.
Например, предположим, что у вас есть список клиентов, и вы хотите, составить письмо с каждым клиентом. При помощи слияния, вы можете написать письмо один раз, а затем запустить функцию слияния в Word, чтобы автоматически создалось письмо для каждого клиента, прикрепляя соответствующий адрес, имя и другую информацию для каждой буквы. Для автоматизации, вы можете использовать макрос для имитации функции почтового слияния из
Excel.
Содержание
- Как макрос работает
- Код макроса
- Как этот код работает
- Как использовать
Как макрос работает
Идея относительно проста. Вы начинаете с шаблоном, который содержит закладки, идентифицирующие каждый элемент контактной информации. После того, как шаблон готов, идея состоит в том, чтобы просто перебрать каждого в списке контактов, выбирая
составные части их контактной информации в соответствующие закладки.
Одним из образцов является документ под названием MailMerge.docx. Это документ имеет все закладки, необходимые для запуска примеров кода, показанного здесь.
Обратите внимание, что вам нужно будет установить ссылку на библиотеку объектов Microsoft Word.
Код макроса
Sub SliyanieSWord() 'Шаг 1: Объявляем переменные Dim wd As Word.Application Dim wdDoc As Word.Document Dim MyRange As Excel.Range Dim MyCell As Excel.Range Dim txtAddress As String Dim txtCity As String Dim txtState As String Dim txtPostalCode As String Dim txtFname As String Dim txtFullname As String 'Шаг 2: Запустите Word и добавьте новый документ Set wd = New Word.Application Set wdDoc = wd.Documents.Add wd.Visible = True 'Шаг 3: Установите диапазон вашего списка контактов Set MyRange = Sheets("Список контактов").Range("A5:A24") 'Шаг 4: Начните цикл через каждую ячейку For Each MyCell In MyRange.Cells 'Шаг 5: Присвойте значения каждому компоненту буквы txtAddress = MyCell.Value txtCity = MyCell.Offset(, 1).Value txtState = MyCell.Offset(, 2).Value txtPostalCode = MyCell.Offset(, 3).Value txtFname = MyCell.Offset(, 5).Value txtFullname = MyCell.Offset(, 6).Value 'Шаг 6: Вставьте структуру шаблона документа wd.Selection.InsertFile _ ThisWorkbook.Path & "" & "MailMerge.docx" 'Шаг 7: Заполните каждую соответствующую закладку с соответствующим 'значением wd.Selection.Goto What:=wdGoToBookmark, Name:="Покупатель" wd.Selection.TypeText Text:=txtFullname wd.Selection.Goto What:=wdGoToBookmark, Name:="Адрес" wd.Selection.TypeText Text:=txtAddress wd.Selection.Goto What:=wdGoToBookmark, Name:="Город" wd.Selection.TypeText Text:=txtCity wd.Selection.Goto What:=wdGoToBookmark, Name:="Регион" wd.Selection.TypeText Text:=txtState wd.Selection.Goto What:=wdGoToBookmark, Name:="Индекс" wd.Selection.TypeText Text:=txtPostalCode wd.Selection.Goto What:=wdGoToBookmark, Name:="Имя" wd.Selection.TypeText Text:=txtFname 'Шаг 8: Очистить все оставшиеся закладки On Error Resume Next wdDoc.Bookmarks("Адрес").Delete wdDoc.Bookmarks("Покупатель").Delete wdDoc.Bookmarks("Город").Delete wdDoc.Bookmarks("Регион").Delete wdDoc.Bookmarks("Имя").Delete wdDoc.Bookmarks("Индекс").Delete 'Шаг 9: Перейти до конца, вставить новую страницу и начать со следующей 'ячейки wd.Selection.EndKey Unit:=wdStory wd.Selection.InsertBreak Type:=wdPageBreak Next MyCell 'Шаг 10: Установить курсор на начало и очистить память wd.Selection.HomeKey Unit:=wdStory wd.Activate Set wd = Nothing Set wdDoc = Nothing End Sub
Как этот код работает
- Шаг 1 объявляет четыре переменные:
- wd переменная объекта, которая выставляет объект Word Application,
- wdDoc является переменной объекта, которая выставляет объект Word Document,
- MyRange содержит диапазон, определяющий список контактов,
- MyCell используется для передачи значений ячеек в строковые переменные.
- Мы также объявляем шесть строковых переменных. Каждый из них имеет компонент — часть информации для каждого контакта в списке контактов.
- Этот шаг открывает Word с пустым документом. Обратите внимание, что мы устанавливаем свойство Visible приложения Word, значение True.
- Шаг 3 определяет каждый контакт в списке контактов. Обратите внимание, что этот диапазон выбирает только первый столбец в таблице контактов. Это происходит потому, что каждая ячейка в диапазоне должна быть передана в индивидуальном порядке к строковым переменным. Выбор только первого столбца дает нам одну ячейку в строке. С этой одной ячейке, мы можем легко настроить курсор вправо или влево, чтобы захватить ячейки вокруг него.
- Этот шаг запускает цикл по каждому контакту, как это определено в установленном диапазоне на шаге 3.
- Шаг 5 использует метод Offset в Excel, чтобы захватить значение каждого поля в конкретной строке. Начнем с диапазона, определенного на шаге 3 (первый столбец в списке
контактов). Затем мы используем Offset для перемещения курсора на определенное число столбцов вправо, чтобы захватить данные в каждом соответствующем поле. Как просмотрено каждое поле, мы относим их значения соответствующей переменной строки. - На шаге 6 мы вводим существующий шаблон в пустой документ в Word. Это равносильно копированию структуры нашего шаблона и вставки его в пустой документ.
- Шаг 7 присваивает значение каждой переменной строки в соответствующей закладке. Как видите в коде, этот шаг выбирает закладку по имени, а затем изменяет текст на значение назначенной переменной строки.
- Цель в шаге 8 удалить любые беспризорные закладки. Если какие-либо закладки задерживаются, мы получаем дубликаты закладок процедура перебирает каждую ячейку.
- На данный момент в коде, мы создали документ для одного контакта в нашем списке контактов. Идея состоит в том, чтобы создать новый пустой документ, чтобы мы могли выполнить ту же процедуру для следующего контакта. Вставка разрыва страницы эффективно создает новый пустой документ. Затем возвращаемся обратно к шагу 5, где мы собираем контактную информацию для следующей строки в списке. Затем на шаге 6, вставьте чистый шаблон (в комплекте с закладками) в новую страницу. И, наконец, мы присваиваем значения в закладки и очищаем. For … Next цикл гарантирует, что этот цикл повторится для каждой строки в списке контактов.
- Шаг 10 очищает память
Как использовать
Для реализации этого макроса, вы можете скопировать и вставить его в стандартный модуль:
- Активируйте редактор Visual Basic, нажав ALT + F11.
- Щелкните правой кнопкой мыши имя проекта / рабочей книги в окне проекта.
- Выберите Insert➜Module.
- Введите или вставьте код.
Добавил:
Upload
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
02.MS_Word.Макросы,слияние.docx
Скачиваний:
13
Добавлен:
12.05.2015
Размер:
57.08 Кб
Скачать
11
-
ПРАКТИЧЕСКОЕ ЗАНЯТИЕ №2
Создание макросов.
Слияние
документов
Цель
работы:
Изучить:
-
Создание макросов
-
Создание слияния
в документе Word
Теоретическая
часть
Макросы
Иногда одни и те
же последовательности действий приходится
выполнять достаточно часто. Такие
операции можно автоматизировать с
помощью макрокоманд (макросов).
Макрос – это
последовательность команд Word,
записанная на языке программирования
Visual
Basic.
Макрос записывается
в шаблоне документа и доступен во всех
документах, созданных на его основе или
может записываться в шаблон Normal,
в таком случае он будет доступен во всех
документах Word.
Самый простой
способ создания макроса – запись
последовательности действий пользователя.
Для этого выполняют
следующие действия:
-
Панель инструментов
Вид / Макросы
/ Макросы / Запись макроса.
На экране появится диалоговое окно. -
Вводится имя
макроса, в поле Макрос
доступен для:
выбирается <имя рабочего файла>.
Можно назначить макросу кнопку на
панели инструментов. -
Нажать кнопку ОК.
-
Указатель мыши
изменяет вид (кассета), на экране
появилась панель с двумя кнопками:
Остановить
запись и
Пауза.
Теперь все действия будут запоминаться
в макрос. Для перерыва во время записи
макроса нажать кнопку Пауза.
При записи макроса мышь нельзя
использовать для выделения, копирования,
вставки и перетаскивания элементов в
окне документа. Для записи этих действий
следует использовать клавиатуру. -
Нажать кнопку Вид
/ Макросы
/ Макросы / Остановить запись.
Создание макроса закончено.
Созданный макрос
можно отредактировать уже в виде
программы выбрав меню Вид
/ Макросы
/ Макросы / Изменить.
6. Для выполнения
макроса: Вид
/ Макросы
/ Макросы / выбрать
название своего макроса / Выполнить.
(если макрос не назначен ни клавишам,
ни кнопке).
Слияние
Слияние используется
для создания тиража похожих писем,
создания каталогов, конвертов, наклеек
и т.п.
Принцип слияния
прост: вы готовите два документа, основной
документ
содержит общую для всех документов
часть, источник
данных
содержит список различий. В качестве
источника
данных (это
второй документ) может служить не только
документ Word,
но и база данных или электронная таблица.
Порядок работы:
-
Сначала нужно
создать источник данных. Можно составить
новый список: Рассылки / Начать слияние
/ Выбрать получателей /Ввести новый
список. Для задания необходимых полей
воспользоваться кнопкойНастройка
столбцов. Далее необходимо заполнить
поля данными. Для ввода новой строки
использовать кнопкуСоздать запись.
Источник данных сохраняется в отдельном
документе и может быть использован для
слияния с различными основными
документами..
Можно воспользоваться
уже созданным источником:Рассылки /
Начать слияние / Выбрать получателей
/:Использовать существующий список.
-
Далее удобно
воспользоваться мастером слияния:
Рассылки/Начать слияние/Начать
слияние/Пошаговый мастер слияния.
Этап 1. Выбор типа
документа (письмо, конверты, наклейки
и т.д.)
Этап 2. Выбор
получателей (можно воспользоваться
кнопкой Выбор
списка для
открытия файла с данными и Изменить
список для
редактирования полей).
Этап 3. Создание
документа с текстом. В
текст вставляются поля с помощью:
Рассылки /
Составление документа и вставка полей
/ Вставить поле слияния.
Этап 4. Просмотр
писем. Кнопками
›› и ‹‹
просмотреть
значения полей.
Этап 5. Завершение
слияния. Можно нажать кнопку
Слияние в новый документ,
при этом на каждой новой странице будет
создан документ, вместо полей в нем
будут вставлены данные из источника
данных.
Варианты заданий
Варианты заданий
для выполнения работы приведены в
таблицах 1 и 2.
Таблица 1
Варианты заданий для создания макросов
Номер |
Задания для |
1 |
Создайте
Работу Работу |
2 |
Создайте
|
3 |
Создайте Исходный Студентам, Полученный Студентам, |
4 |
Создайте Исходный Ориентация Полученный Ориентация |
5 |
Создайте
|
6 |
Создайте Исходный Ориентация Полученный Ориентация |
7 |
Создайте Исходный Ориентация Полученный Ориентация |
Таблица 2
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
- #
- #
- #
Всем привет!
всю историю описывать не буду…
но на текущем этапе у меня есть файл в экселе (ДБ) к нему методом слияния подключено 3 файла word (Договор, Акт, Накладная). Есть макрос в word, который выполняет слияние и сохраняет документы (слитые) в необходимую папку под необходимым именем. За раз обрабатывается одна запись слияния — так и задумано.
Получается процедура щас такая. Заполняем данные в строке excel, далее открываем три файла ворд и оттуда запускаем макрос (3 раза соответственно). Я хочу объединить эти три (исходные) документа в 1, и чтобы мой макрос ещё и его резал документ на три заданные части и сохранял в 3 документа под теми же адресамиименами что и сейчас.
Меняться в этом «общем» доке будут только данные полей слияния, т.е. кол-во листов, форматирование и т.д. остаётся неизменным.
Проблема с нарезкой файла (резать разделами и использовать Sections.Count — не вариант), т.к. разделов больше чем документов для уникального форматирования колонтитулов.
В настоящий момент код выглядит так:
Visual Basic | ||
|
Для имени файла используется одно из значений полей слияния — DataSource.DataFields(«contract») — номер договора (оно же и для названия папки), и закладка doctype, выделяющая кусок текста «Договор», «Акт», «Накладная» в соответствующих документах.
Если резать 1 документ на 3, то закладка уже не прокатит, но эти слова можно и вручную прописать в коде.
Помогите пожалуйста, люди добрые. Уж очень хочется, чтоб всё было немного лучше чем есть)
Luna2903 Пользователь Сообщений: 44 |
Добрый день! Создала в Word документ («Заявление.doc) c использованием данных из таблицы Excel в режиме слияния. Следующий шаг — макросом каждый полученный документ сохранила в отдельном файле. Все работает, если в режиме слияния обрабатываются ВСЕ строки таблицы — на каждого человека, указанного в таблице с исходными данными формируется «именное» заявление (это сделано для уменьшения объема работы пользователям и снижения кол-ва ошибок). |
БМВ Модератор Сообщений: 21385 Excel 2013, 2016 |
#2 27.04.2020 14:08:13
а может сделать фильтр встроенными средствами слияния? По вопросам из тем форума, личку не читаю. |
||
Luna2903 Пользователь Сообщений: 44 |
Да, встроенными получается. В результате все сформированные документы формируются в один файл, а мне хотелось бы сформировать «именные» файлы. Если запускаю макрос, то этот фильтр не виден. Макрос, который получился — ниже. Изменено: Luna2903 — 27.04.2020 14:23:06 |
Luna2903 Пользователь Сообщений: 44 |
#4 27.04.2020 14:17:34
Изменено: Luna2903 — 27.04.2020 14:49:04 |
||
Wild.Godlike Пользователь Сообщений: 616 |
#5 27.04.2020 14:19:35 Luna2903, Сегодня прям фестиваль
|
||
Luna2903 Пользователь Сообщений: 44 |
Объясните, пожалуйста, что я не так сформулировала/написала. Какие правила форума нарушила? |
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
Luna2903, оформите код, как это делают другие. |
vikttur Пользователь Сообщений: 47199 |
А название темы не нужно уточнить? Предложите новое, модераторы заменят |
Luna2903 Пользователь Сообщений: 44 |
Тему обозначила, как я ее вижу. Если Вы считаете по-другому, подскажите. Сама изменить формулировку затрудняюсь. |
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
#10 28.04.2020 14:33:10
Вы не знаете, в чём заключается Ваша задача? |
||
Luna2903 Пользователь Сообщений: 44 |
Мне кажется, что я описАла задачу и проблему с которой встретилась достаточно подробно. И не понимаю, что я должна переформулировать. Изменено: Luna2903 — 28.04.2020 14:51:04 |
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
Чисто для примера,: «Как при слиянии в Word исключить строки с нулевыми значениями?» |
БМВ Модератор Сообщений: 21385 Excel 2013, 2016 |
#13 28.04.2020 16:08:02 Luna2903, По вопросам из тем форума, личку не читаю. |
WORD Макросы для сохранения слияния и рассылки в отдельные файлы формата DOC или PDF
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sub ToTranslitDoc() | |
Dim i As Long | |
Dim oMerge As MailMerge | |
Dim oData As MailMergeDataSource | |
Set oMerge = ActiveDocument.MailMerge | |
Set oData = oMerge.DataSource | |
Application.ScreenUpdating = False | |
For i = 1 To oData.RecordCount | |
With oData | |
.FirstRecord = i | |
.LastRecord = i | |
.ActiveRecord = i | |
End With | |
With oMerge | |
.Destination = wdSendToNewDocument | |
.Execute Pause:=False | |
End With | |
With ActiveDocument | |
.SaveAs («d:TMP» & oData.DataFields(«Translit»).Value & «.doc») | |
.Close | |
End With | |
Next i | |
Set oData = Nothing | |
Set oMerge = Nothing | |
Application.ScreenUpdating = True | |
End Sub | |
Sub ToTranslitPdf() | |
Dim i As Long | |
Dim oMerge As MailMerge | |
Dim oData As MailMergeDataSource | |
Set oMerge = ActiveDocument.MailMerge | |
Set oData = oMerge.DataSource | |
Application.ScreenUpdating = False | |
For i = 1 To oData.RecordCount | |
With oData | |
.FirstRecord = i | |
.LastRecord = i | |
.ActiveRecord = i | |
End With | |
With oMerge | |
.Destination = wdSendToNewDocument | |
.Execute Pause:=False | |
End With | |
With ActiveDocument | |
.SaveAs FileName:=«d:TMP» & oData.DataFields(«Translit»).Value & «.pdf», FileFormat:=wdFormatPDF | |
.Close (False) | |
End With | |
Next i | |
Set oData = Nothing | |
Set oMerge = Nothing | |
Application.ScreenUpdating = True | |
End Sub |