Применение закладок для заполнения различных бланков на основе документов Word из кода VBA Excel. Объект Bookmark и его свойство Range.
Работа с Word из кода VBA Excel
Часть 5. Bookmarks – закладки в документе Word
[Часть 1] [Часть 2] [Часть 3] [Часть 4] [Часть 5] [Часть 6]
Добавление закладок в шаблон
Закладки (Bookmarks) являются удобным средством для вставки изменяющихся реквизитов в шаблоны документов. К закладкам можно обращаться по имени и не заморачиваться подсчетом количества символов до того места, где должен быть вставлен текст.
Вставляются закладки в шаблон документа вручную. Например, для следующего шаблона
Шаблон договора аренды с закладками
это можно сделать так:
- Вставляем в макет шаблона в места вставки изменяемых реквизитов поясняющий текст. В нашем шаблоне это – <Город>, <Дата>, <Наименование арендатора> и <Наименование арендодателя>. Реквизиты <Город> и <Дата> добавлены в ячейки таблицы, чтобы их можно было разместить в одной строке, а выровнять по разным краям. Границы ячеек оставлены для наглядности.
- Выделяем текст <Город> и вставляем закладку под именем Bookmark1 через меню: Вставка ⇒ Закладка. Добавляем остальные закладки: <Дата> – Bookmark2, <Наименование арендатора> – Bookmark3, <Наименование арендодателя> – Bookmark4.
- Сохраняем бланк документа как шаблон Word. Полный путь для нашего примера: «C:ТестоваяДокумент1.dotx».
Создание и заполнение бланка
Реквизиты, добавляемые в места вставки, отмеченные закладками, обычно хранятся в таблицах Excel. Но мы вставим их напрямую в код процедуры:
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 |
Sub Primer() On Error GoTo Instr Dim myWord As New Word.Application, myDocument As Word.Document ‘Создаем новый документ по шаблону Set myDocument = myWord.Documents.Add(«C:ТестоваяДокумент1.dotx») myWord.Visible = True With myDocument ‘Замещаем текст закладок .Bookmarks(«Bookmark1»).Range = «г. Омск» .Bookmarks(«Bookmark2»).Range = Format(Now, «DD.MM.YYYY») .Bookmarks(«Bookmark3»).Range = «Каев Кай Гердович (ИП)» .Bookmarks(«Bookmark4»).Range = «ООО «Снежная королева»» ‘Удаляем границы ячеек .Tables(1).Borders.OutsideLineStyle = wdLineStyleNone .Tables(1).Borders.InsideLineStyle = wdLineStyleNone End With ‘Освобождаем переменные Set myDocument = Nothing Set myWord = Nothing ‘Завершаем процедуру Exit Sub ‘Обработка ошибок Instr: If Err.Description <> «» Then MsgBox «Произошла ошибка: « & Err.Description End If If Not myWord Is Nothing Then myWord.Quit Set myDocument = Nothing Set myWord = Nothing End If End Sub |
В результате работы кода VBA Excel получаем заполненный бланк документа на основе шаблона Word:
Заполненный бланк договора аренды
Я уже писал заметку о создании закладок в документе.
Закладки очень помогают при работе с документом, позволяя быстро отмечать нужные места в тексте и так же быстро их находить и перемещаться.
Однако стандартный метод создания закладки не слишком быстр и удобен. Здесь на помощь приходят макросы.
В замечательной книге Microsoft Word: комфортная работа с помощью макросов авторы описывают создание такого специальных макросов для работы с закладками.
Когда необходимо в процессе чтения или редактирования документа отметить для себя какой-то фрагмент текста, вы нажимаете кнопку на панели инструментов или назначенное сочетание клавиш и в текст вставляется закладка. Чтобы вернуться позже к этому фрагменту достаточно нажать другое сочетание клавиш.
В этой заметке я опишу процесс создания макросов своими словами с опорой на источник.
- Выделите слово или фразу в тексте, к которым вы хотите позже вернуться.
- В меню Сервис (Tools) перейдите на команду Макрос (Macro) и из открывшегося дополнительного списка выберите команду Начать запись (Record New Macro). В появившемся окне в поле шмя (Macro name) введите имя макроса (лучше латинскими буквами), например, Marker. Остальные поля можете оставить без изменения. Только проследите, чтобы в поле Макрос доступен для (Store macro in) была выбрана опция Всех документов Normal.dot.
- В группе Назначить макрос (Assign macro to) нажмите кнопку с изображением клавиатуры, чтобы назначить вашему макросу определенное сочетание клавиш, по которому он будет вызываться.
- В окне «Настройка клавиатуры» задайте сочетание клавиш для макроса, пусть это будет как в книге: ALT + A, и нажмите кнопку Назначить (Assign). Закройте окно.
- На экране появится панелька с управляющими кнопками для записи макроса:
- В меню Вставка (Insert) выберите команду Закладка (Bookmark). Откроется диалоговое окно.
- В поле Имя закладки (Bookmark name) введите какое-нибудь подходящее имя для вашей закладки (имя закладки не может содержать пробелы или начинаться с цифры). Пусть снова будет — Marker.
- Нажмите кнопку Добавить (Add). Окно закроется.
- На панели с управляющими кнопками нажмите кнопку с квадратиком, чтобы остановить запись макроса.
- Макрос создания закладки создан.
Теперь создадим макрос, позволяющий мгновенно перейти к закладке. Основные шаги создания макросов в автоматическом режиме практически одинаковые, поэтому при некотором повторении они легко вам запомнятся на будущее.
- В меню Сервис (Tools) перейдите на команду Макрос (Macro) и из открывшегося дополнительного списка выберите команду Начать запись (Record New Macro). В появившемся окне в поле Имя (Macro name) введите имя макроса (лучше латинскими буквами), например, GoToMarker. Остальные поля можете оставить без изменения. Только проследите, чтобы в поле Макрос доступен для (Store macro in) была выбрана опция Всех документов Normal.dot.
- В группе Назначить макрос (Assign macro to) нажмите кнопку с изображением клавиатуры, чтобы назначить вашему макросу определенное сочетание клавиш, по которому он будет вызываться.
- В окне «Настройка клавиатуры» задайте сочетание клавиш для макроса, пусть это будет как в книге: ALT + Q, и нажмите кнопку Назначить (Assign). Закройте окно.
- На экране появится панелька с управляющими кнопками для записи макроса.
- В меню Вставка (Insert) выберите команду Закладка (Bookmark). Откроется диалоговое окно.
- В большом поле под полем Имя закладки (Bookmark name) выберите имя вашей закладки.
- Нажмите кнопку Перейти (Go To), а затем кнопку Закрыть (Close).
- На панели с управляющими кнопками нажмите кнопку с квадратиком, чтобы остановить запись макроса.
Таким образом, мы создали два макроса, позволяющие быстро работать с закладками: по сочетанию клавиш ALT + A вы создаете закладку, а сочетанием ALT + Q вы выбираете и перемещаетесь к вашей закладке в тексте документа.
Добавить закладку
Этот макрос Word добавит закладку:
Sub AddBookmark () ActiveDocument.Bookmarks.Add "easyexcel_net_01" End Sub
Удалить закладку
Этот макрос VBA удалит закладку:
Sub DeleteBookmark () If ActiveDocument.Bookmarks.Exists ("easyexcel_net_01") Then 'нам нужно проверить, существует ли закладка с именем "easyexcel_net_01" в активном документе ActiveDocument.Bookmarks (Index: = "easyexcel_net_01"). Удалить End If End Sub
Перейти к закладке
Этот простой макрос перейдет к закладке:
Sub GoToBookmark () If ActiveDocument.Bookmarks.Exists ("easyexcel_net_01") Then 'нам нужно проверить, существует ли закладка с именем "easyexcel_net_01" в активном выборе документа. GoTo What: = wdGoToBookmark, Name: = "easyexcel_net_01" End If End Sub
Изменить закладку
Этот макрос изменяет содержимое закладки:
Sub ModifyBookmarkContent () 'изменить содержимое закладки' более сложно, потому что изменение содержимого диапазона закладок приведет к удалению закладки Dim oRangeBKM As Range If ActiveDocument.Bookmarks.Exists ("easyexcel_net_01") Затем 'нам нужно проверить, существует ли закладка с именем "easyexcel_net_01" в активной doc 'Определите текущий диапазон закладок и вставьте текст Set oRangeBKM = ActiveDocument.Bookmarks ("easyexcel_net_01"). Range oRangeBKM.Text = "easyexcel.net"' Снова сделайте закладку ActiveDocument.Bookmarks.Add "easyexcel_net_01", oRangeBKM End If End Sub
Это функция изменения закладки:
Sub UpdateBookmarkContent (strBookMarkName As String, strNewText As String) «пригодная для использования» процедура для добавления в Dim oRangeBKM As Range If ActiveDocument.Bookmarks.Exists (strBookMarkName) Затем «нам нужно проверить, существует ли закладка с именем« easyexcel_net_01 »в активном документе» Идентифицировать текущий диапазон закладок и вставьте текст Set oRangeBKM = ActiveDocument.Bookmarks (strBookMarkName) .Range oRangeBKM.Text = strNewText 'Сделайте снова закладку ActiveDocument.Bookmarks.Add strBookMarkName, oRangeBKM End If End Sub
Вы можете вызвать функцию, добавив имя закладки и новый текст в качестве аргументов:
Sub CallBookmarkFunction () Вызов UpdateBookmarkContent ("easyexcel_net_01", "easyexcel.net") End Sub
Вы поможете развитию сайта, поделившись страницей с друзьями
I am trying to create a Word document with a very simple word macro. The macro searches for a bookmark that I have placed in the text and then adds a date, 2 weeks into the future, at that location.
But when I create a new document from the template I keep getting bookmark not found. I have been through it loads of times and sometimes the bookmark is there, sometimes its there but not allowing you to click «Go to».
How can I get it to work? I have added a little piece of code to the Document_New()
event but that keeps reporting Bookmark not found.
I have the document in a rar-file since my webserver can’t handle .dotm extensions.
Document
How can I make it so that when a new document is produced from this template, the new document has the date, 2 weeks ahead, placed between the 2 bold sections?
Sub Two_Weeks_Ahead()
''# Two_Weeks_Ahead Makro
Selection.GoTo What:=wdGoToBookmark, Name:="TwoWeeks"
With ActiveDocument.Bookmarks
.DefaultSorting = wdSortByName
.ShowHidden = False
End With
Dim dt As Date
dt = DateAdd("d", 14, DateTime.Now)
Selection.TypeText Text:=Format(dt, "yyyy-MM-dd")
End Sub
Private Sub Document_New()
Selection.GoTo What:=wdGoToBookmark, Name:="TwoWeeks"
With ActiveDocument.Bookmarks
.DefaultSorting = wdSortByName
.ShowHidden = False
End With
Dim dt As Date
dt = DateAdd("d", 14, DateTime.Now)
Selection.TypeText Text:=Format(dt, "yyyy-MM-dd")
End Sub
Аватар-С 1 / 1 / 0 Регистрация: 03.02.2017 Сообщений: 102 |
||||||
1 |
||||||
15.02.2017, 14:49. Показов 12524. Ответов 14 Метки нет (Все метки)
Здравствуйте Коллеги!
Вложения
0 |
1508 / 478 / 56 Регистрация: 10.04.2009 Сообщений: 8,008 |
|
15.02.2017, 19:12 |
2 |
Вы не выделяете какой-то текст и закладки вставляются не как Вы ожидаете вида [], а вида I
1 |
Аватар-С 1 / 1 / 0 Регистрация: 03.02.2017 Сообщений: 102 |
||||
16.02.2017, 11:10 [ТС] |
3 |
|||
Здравствуйте Коллеги!
Извините, пожалуйста! Можно еще под сказочку? Пожалуйста…
0 |
Ципихович Эндрю 1508 / 478 / 56 Регистрация: 10.04.2009 Сообщений: 8,008 |
||||||||
16.02.2017, 12:10 |
4 |
|||||||
блин а колонтитулы тут при чем?
в Вашем случае нужно писать
— чтобы меньше памяти тратить
0 |
1 / 1 / 0 Регистрация: 03.02.2017 Сообщений: 102 |
|
16.02.2017, 12:23 [ТС] |
5 |
Ципихович Эндрю !
0 |
Ципихович Эндрю 1508 / 478 / 56 Регистрация: 10.04.2009 Сообщений: 8,008 |
||||
16.02.2017, 12:30 |
6 |
|||
мама родная — такая штука называется сетка-отметка об исполнителе
0 |
1 / 1 / 0 Регистрация: 03.02.2017 Сообщений: 102 |
|
16.02.2017, 12:43 [ТС] |
7 |
Ципихович Эндрю!
0 |
Step_UA 1588 / 661 / 225 Регистрация: 09.06.2011 Сообщений: 1,334 |
||||
16.02.2017, 16:01 |
8 |
|||
False — можно что то сделать? Вы присваиваете результат сравнения текста из выделенния со значением переменной, вместо присвоения выделению текста
0 |
Аватар-С 1 / 1 / 0 Регистрация: 03.02.2017 Сообщений: 102 |
||||||||
16.02.2017, 17:03 [ТС] |
9 |
|||||||
Спасибо Step_UA! первый код создает все как нужно.
а второй перезаписывает закладки, остается последняя
Что делать?
0 |
1588 / 661 / 225 Регистрация: 09.06.2011 Сообщений: 1,334 |
|
16.02.2017, 17:51 |
10 |
Что делать? 1) При полной замене текста закладки она удаляется
0 |
1 / 1 / 0 Регистрация: 03.02.2017 Сообщений: 102 |
|
16.02.2017, 18:10 [ТС] |
11 |
Извините диапазон имеется ввиду Range? Добавлено через 1 минуту
используйте диаппазоны Извините диапазон имеется ввиду Range?
0 |
Ципихович Эндрю 1508 / 478 / 56 Регистрация: 10.04.2009 Сообщений: 8,008 |
||||
16.02.2017, 18:13 |
12 |
|||
да —
0 |
Аватар-С 1 / 1 / 0 Регистрация: 03.02.2017 Сообщений: 102 |
||||||||||
01.03.2017, 17:03 [ТС] |
13 |
|||||||||
Здравствуйте Коллеги! Долго мучился но определенного результата добился. Задача была следующая создать колонтитул со следующими условиями:
Получился следующий код состоящий из двух процедур: ИСПОЛНИТЕЛЬ: Кликните здесь для просмотра всего текста
ПРОВЕРКА ИСПОЛНИТЕЛЯ: Кликните здесь для просмотра всего текста
Буду признателен за Ваши замечания! Вложения
0 |
1508 / 478 / 56 Регистрация: 10.04.2009 Сообщений: 8,008 |
|
01.03.2017, 17:23 |
14 |
а так-то лучше не закладка-так как её можно удалить а вариаблес-тоже можно удалить, но сложнее
0 |
1 / 1 / 0 Регистрация: 03.02.2017 Сообщений: 102 |
|
01.03.2017, 17:33 [ТС] |
15 |
Ципихович Эндрю
а так-то лучше не закладка-так как её можно удалить а вариаблес-тоже можно удалить, но сложнее Извините пожалуйста, не совсем понял почему вариаблес?
0 |
В статье «Урок 79. Смотри таблицу» я рассказала, как установить закладку в тексте документа:
Закладка в Word играет ту же роль, что и в обычной книге: это пометка в тексте, позволяющая легко найти нужный фрагмент снова. Вы можете создать в документе сколько угодно закладок и присвоить каждой из них уникальное имя, чтобы легко их опознавать.
Хорошо бы, чтобы в документе были бы закладки, лично нами назначенные и хорошо нам знакомые.
Но будьте готовы к тому, что:
- когда вы скачиваете документ из системы «КонсультантПлюс»
- когда вы распознаете документ, а потом передаете его в Word
то, закладки в документе будут в немалом количестве – 100 и больше.
Поэтому встанет вопрос: как организовать удаление всех закладок?
По окончании этого урока вы сможете:
- Использовать закладку для навигации по документу
- Написать макрос «Удаление всех закладок»
1. Навигация по документу при помощи закладок
Шаг 1. Лента Главная → группа команд Редактирование → команда Найти → команда Перейти из выпадающего меню:
Появляется рабочее окно «Найти и заменить»
Шаг 2. Кнопка выпадающего меню поля Найти имя закладки → выбор нужного имени в выпадающем меню:
Обратите внимание на это окно. В правой части находится поле «Объект перехода». Если вы пройдетесь по полосе прокрутки, то список объектов перехода будет таким:
- Страница
- Раздел
- Строка
- Закладка
- Примечание
- Сноска
- Концевая сноска
- Поле
- Таблица
- Рисунок
- Уравнение
- Объект
- Заголовок
С маленькими документами вы обойдётесь без переходов по этим объектам. Но с документом в 50 страниц и выше команда «Перейти» помогает мне даже очень. Например: мне надо убедиться, что я не пропустила ни одной таблицы для форматирования. Или: все ли рисунки стоят на своих местах?
2. Макрос «Удаление всех закладок» в документе
А теперь рассмотрим ситуацию: документ с большим количеством закладок (я работаю со своим документом).
Шаг 1. Лента Вставка → группа команд Ссылки → команда Закладка:
Теперь вы можете поочередно выбирать имя закладки в списке и нажимать ЛМ команду «Удалить». И так 250 раз. По моим прикидкам именно такое количество закладок есть в этом документе.
Скачайте документ тут и откройте его. Посмотрите, сколько там закладок:
Вроде и немного, но удалять поодиночке все равно надоест. Так что приступим к созданию макроса «Удаление всех закладах» в документе.
Скопируйте целиком текст в рамке:
Sub delAllbookmarks()
Dim oBkm As Bookmark
For Each oBkm In ActiveDocument.Range.Bookmarks
oBkm.Delete
Next
End Sub
В статье «Урок 60. Макрос для таблицы» я показала, как извлечь ленту «Разработчик». Так как я много работаю с полями для того, чтобы делать автоматизированные шаблоны (статья «Урок 89. Шаблон договора»), то эта лента у меня всегда под рукой.
Шаг 2. Лента Разработчик → группа команд Код → команда Макросы:
Шаг 3. В диалоговом окне «Макрос» введите имя макроса → только тогда команда «Создать будет активна и позволит вам создать новый макрос:
Имя для макроса должно быть уникальным. К имени макроса предъявляются два требования:
- Имя должно начинаться с буквы!
- Имя не должно содержать пробелов!
После нажатия ЛМ команды «Создать» появляется окно «Microsoft Visual Basic for Applications»:
Сразу хочу признаться, что я не специалист в Visual Basic, могу написать только простые макросы. Но даже это заметно облегчает мою рабочую жизнь.
Шаг 4. Удалите в поле «Normal — NewMacros (Code)» все содержимое кнопкой Delete с клавиатуры.
Шаг 5. Вставьте содержимое буфера обмена в поле «Normal — NewMacros (Code)» нажатием сочетания клавиш Ctrl+V:
Закройте окно «Microsoft Visual Basic for Applications» нажатием ЛМ по крестику в правом верхнем углу.
Шаг 6. Теперь выполняем макрос (лента Разработчик → группа команд Код → команда Макросы → команда Выполнить):
Обратите внимание, что в поле «Имя» нет имени, который мы вводили. Объяснение простое: на шаге 4 мы его удалили. И еще один вывод:
Sub delAllbookmarks() | Имя макроса |
Dim oBkm As Bookmark For Each oBkm In ActiveDocument.Range.Bookmarks oBkm.Delete Next |
|
End Sub | Окончание работы макроса |
Оставьте заметочку в памяти – эта информация еще пригодиться
В статье «Урок 60. Макрос для таблицы» я рассказала, как поместить кнопку запуска макроса на Панель быстрого доступа.
Макрос «Удаление всех закладок» в документе будет доступен вам при работе любым документом.
Теперь вы сможете:
- Использовать закладку для навигации по документу
- Написать макрос «Удаление всех закладок»
Add Bookmark
This Word macro will add a bookmark:
Sub AddBookmark()
ActiveDocument.Bookmarks.Add "automateexcel_com_01"
End Sub
Delete Bookmark
This VBA macro will delete a bookmark:
Sub DeleteBookmark()
If ActiveDocument.Bookmarks.Exists("automateexcel_com_01") Then 'we need to check if bookmark named "automateexcel_com_01" exists in active doc
ActiveDocument.Bookmarks(Index:="automateexcel_com_01").Delete
End If
End Sub
Go To Bookmark
This simple macro will go to a bookmark:
Sub GoToBookmark()
If ActiveDocument.Bookmarks.Exists("automateexcel_com_01") Then 'we need to check if bookmark named "automateexcel_com_01" exists in active doc
Selection.GoTo What:=wdGoToBookmark, Name:="automateexcel_com_01"
End If
End Sub
Modify Bookmark
This macro will modify a bookmark’s content:
Sub ModifyBookmarkContent()
' change bookmark contents
' more complicated, because changing bookmark range content will delete bookmark
Dim oRangeBKM As Range
If ActiveDocument.Bookmarks.Exists("automateexcel_com_01") Then 'we need to check if bookmark named "automateexcel_com_01" exists in active doc
'Identify current Bookmark range and insert text
Set oRangeBKM = ActiveDocument.Bookmarks("automateexcel_com_01").Range
oRangeBKM.Text = "automateexcel.com"
'Make again the bookmark
ActiveDocument.Bookmarks.Add "automateexcel_com_01", oRangeBKM
End If
End Sub
This is a modify bookmark function:
Sub UpdateBookmarkContent(strBookMarkName As String, strNewText As String)
' "usable' procedure for add in
Dim oRangeBKM As Range
If ActiveDocument.Bookmarks.Exists(strBookMarkName) Then 'we need to check if bookmark named "automateexcel_com_01" exists in active doc
'Identify current Bookmark range and insert text
Set oRangeBKM = ActiveDocument.Bookmarks(strBookMarkName).Range
oRangeBKM.Text = strNewText
'Make again the bookmark
ActiveDocument.Bookmarks.Add strBookMarkName, oRangeBKM
End If
End Sub
You can call the function by adding the bookmark name and new text as arguments:
Sub CallBookmarkFunction()
Call UpdateBookmarkContent("automateexcel_com_01", "automateexcel.com")
End Sub