Применение закладок для заполнения различных бланков на основе документов 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:
Заполненный бланк договора аренды
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
I need to process a Word document and change (the text of) a bookmark.
I exported my Word document to flat xml format to help establish the structure of the document — here is a fragment
<w:bookmarkStart w:id="0" w:name="CustomerName"/>
<w:r w:rsidRPr="001E4487">
<w:rPr>
<w:rFonts w:ascii="MyTypeRegular"
w:hAnsi="MyTypeRegular"
w:cs="MyType V2 Regular"/>
<w:szCs w:val="22"/>
</w:rPr>
<w:t>[CustomerName]</w:t>
</w:r>
<w:bookmarkEnd w:id="0"/>
The bit I need to change is <w:t>[CustomerName]</w:t>
which should then become, for example <w:t>Some Punter</w:t>
so in my VBA i am hoping to be able to do something like this …
Dim bkm As Bookmark
For Each bkm In ActiveDocument.Bookmarks
bkm.Text = "Some Punter"
Next bkm
only BookMark
does not have a Text
property
How do Access that little data item in the square Brackets?
asked Feb 12, 2015 at 17:03
A word bookmark doesn’t have a text property, but its range property does.
Use bkm.Range.Text = «Some Punter»
Note that once you change the text, the bookmark will be removed from the Word Document. In order to keep the bookmark you need to do:
Dim bkm As Bookmark
Dim bkmName As String
Dim bkmRng As Range
Dim NewText As String
NewText = "Some Punter"
For Each bkm In ActiveDocument.Bookmarks
Set bkmRng = bkm.Range
bkmName = bkm.Name
bkm.Range.Text = NewText
bkmRng.End = bkmRng.Start + Len(NewText)
Bookmarks.Add(Name:=bkmName, Range:=bkmRng)
Next bkm
Hope this helps.
answered Feb 12, 2015 at 17:30
OpiesDadOpiesDad
3,3452 gold badges16 silver badges31 bronze badges
I have a workaround for this that is not perfect but is less complicated: In place of the bookmark, use ActiveX text box and in place of cross-reference use ActiveX label. Then make change event (or LostFocus Event) for the text box: LabelName.Caption = TextboxName.Text. Formatting can be as desired. Alignment of text outside controls may be needed using Font> Advanced > Position > Raised. This may not be acceptable in all instances, but it often can be. Requires no update of field.
answered Jul 23, 2019 at 1:10
Аватар-С 1 / 1 / 0 Регистрация: 03.02.2017 Сообщений: 102 |
||||||
1 |
||||||
15.02.2017, 14:49. Показов 12516. Ответов 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 |
title | keywords | f1_keywords | ms.prod | api_name | ms.assetid | ms.date | ms.localizationpriority |
---|---|---|---|---|---|---|---|
Bookmark object (Word) |
vbawd10.chm2408 |
vbawd10.chm2408 |
word |
Word.Bookmark |
be6b0c7b-60ca-97e7-ef19-6de335da3197 |
06/08/2017 |
medium |
Bookmark object (Word)
Represents a single bookmark in a document, selection, or range. The Bookmark object is a member of the Bookmarks collection. The Bookmarks collection includes all the bookmarks listed in the Bookmark dialog box (Insert menu).
Remarks
Using the Bookmark Object
Use Bookmarks (index), where index is the bookmark name or index number, to return a single Bookmark object. You must exactly match the spelling (but not necessarily the capitalization) of the bookmark name. The following example selects the bookmark named «temp» in the active document.
ActiveDocument.Bookmarks("temp").Select
The index number represents the position of the bookmark in the Selection or Range object. For the Document object, the index number represents the position of the bookmark in the alphabetical list of bookmarks in the Bookmarks dialog box (click Name to sort the list of bookmarks alphabetically). The following example displays the name of the second bookmark in the Bookmarks collection.
MsgBox ActiveDocument.Bookmarks(2).Name
Use the Add method to add a bookmark to a document range. The following example marks the selection by adding a bookmark named «temp.»
ActiveDocument.Bookmarks.Add Name:="temp", Range:=Selection.Range
Remarks
Use the BookmarkID property with a range or selection object to return the index number of a Bookmark object in the Bookmarks collection. The following example displays the index number of the bookmark named «temp» in the active document.
MsgBox ActiveDocument.Bookmarks("temp").Range.BookmarkID
Use predefined bookmarkswith the Bookmarks property. The following example sets the bookmark named «currpara» to the location marked by the predefined bookmark named «Para».
ActiveDocument.Bookmarks("Para").Copy "currpara"
Use the Exists method to determine whether a bookmark already exists in the selection, range, or document. The following example ensures that the bookmark named «temp» exists in the active document before selecting the bookmark.
If ActiveDocument.Bookmarks.Exists("temp") = True Then ActiveDocument.Bookmarks("temp").Select End If
Methods
- Copy
- Delete
- Select
Properties
- Application
- Column
- Creator
- Empty
- End
- Name
- Parent
- Range
- Start
- StoryType
See also
- Word Object Model Reference
[!includeSupport and feedback]