Welcome to the Word VBA Tutorial. VBA is a great tool not only to be leveraged in MS Excel. Often it is worth to save some time doing repeatable tasks by adopting some VBA macros in Word or PowerPoint too. Today I wanted to focus a little bit on starting you off in Word VBA macro programming.
When moving to macro programming in Word VBA you will stumble upon issues you would normally not expect in Excel. Lets take the example of moving around the Word file – in Excel you have spreadsheets which are easy to navigate around. In Word, however, you have a lot of different content e.g. text, objects like images and charts, tables etc. Navigating around Word file in VBA is the greatest challenge you will face. Today I would like to focus on that and other frequently used features in Word VBA. So let’s kick off this Word VBA Tutorial.
Starting your journey with programming in Visual Basic for Applications (VBA)? Start with my VBA Tutorial.
Word VBA is identical to Excel VBA – be sure to leverage the VBA Cheat Sheet
VBA Word Navigating
Let’s start with adding content to the most common places the start and end of a Word document in VBA. Know if you Google for this you will get tons of non-sense methods of navigating around Word files. I was truly amazed at how poorly it is documented.
Beginning and End of the Word Document
Go to the Beginning of a Word Document:
'Start - add text to the beginning of the Word Document Dim startMark As Range Set startMark = ActiveDocument.Range(0, 0) startMark.Text = "This is the start of the document"
Go to the End of a Word Document:
'End - add text to the end of the Word Document Dim endMark As Range Set endMark = ActiveDocument.Range(Len(ActiveDocument.Range)) endMark.Text = "This is the end of the document"
Finding and replacing text in a Word Document with VBA
Finding and replacing text are basic functions that you will probably need to leverage every now and then.
'Find and print text in MsgBox Dim selectText As Range Set selectText = ActiveDocument.Content selectText.Find.Execute "Hello" If selectText.Find.Found Then MsgBox selectText.Text End If
'Find and replace all instances of a specific text Dim replaceText As Range Set replaceText = ActiveDocument.Content replaceText.Find.Execute FindText:="Hello", ReplaceWith:="Goodbye", Replace:=wdReplaceAll
VBA Word Text formatting
One of the first things you would want to do is probably text formatting in Word VBA.
Let’s start by adding some text to our document:
'Select the beginning of the document ActiveDocument.Range(0).Select 'Type "Hello World!" Selection.TypeText Text:="Hello World!"
Bold & Italic
To change the font weight to bold see below:
'Select the word "Hello" ActiveDocument.Range(0, 5).Select 'Toggle the bold property Selection.Font.Bold = wdToggle
To change the text decoration to italic see below:
'Select the word "World" ActiveDocument.Range(0, 5).Select 'Toggle the bold property Selection.Font.Bold = wdToggle
Below the final result of the code above:
Font size and name
Using the “Hello World!” example above we can similarly change the text font name and font size as shown below:
'Change font size Selection.Font.Size = 20 'Size: 20 Selection.Font.Grow 'Size: 22 Selection.Font.Shrink 'Size: 20 'Change font name to "Aharoni" Selection.Font.Name = "Aharoni"
VBA Word Tables
When editing Word files you might want to leverage tables as it is much easier to navigate around them in an automated way. My approach is to insert/modify tables in Word without and borders (invisible). This way you can guarantee a consistent and easy to navigate structure in Word. Let’s go through some of the basic functions around tables.
Add a table
Let’s add a table to the beginning of the Word document:
Dim begin As Range Set startMark = ActiveDocument.Range(0, 0) 'range as Range, NumRows as Long, NumColumns as Long Call ActiveDocument.Tables.Add(startMark, 3, 6) 'add to beginning of doc, 3 rows, 6 cols
Edit cell text
'Modify cell (1,3) to "Hello World!" With ActiveDocument.Tables(1) .Cell(1, 3).Range.Text = "Hello World!" End With
Working on rows and columns
With ActiveDocument.Tables(1) ' Modify height of row 1 .Rows(1).Height = CentimetersToPoints(0.65) ' Modify width of column 1 .Columns(1).Width = CentimetersToPoints(2.54) 'Merge cell (1,3) with cell (1,4) - cells must be next to each other .Cell(1, 3).Merge .Cell(1, 4) End With
Formatting borders
'Modify row 1 border, single, black and 100pt With ActiveDocument.Tables(1).Rows(3).Borders(wdBorderBottom) .LineStyle = wdLineStyleSingle .LineWidth = wdLineWidth100pt .Color = wdColorBlack End With
In progress…
Здравствуйте дорогие читатели блога scriptcoding.ru. Сегодня мы рассмотрим работу с классом Range, который относится к объектном модели Word. Данный класс отвечает за работу с текстом в ворде, а точнее, за его выбор.
В отличии от Selection, Range позволяет не выделить, а выбрать заданный диапазон текста в ворде. Использовать Range более выгодно, чем Selection, так как получить выбор можно только программно, это работает нам на руку, так как пользователь не сможет повлиять на работу макроса или программного кода. Поясню: допустим, мы хотим обработать текст в ворде с помощью объекта Selection, выделив нужный диапазон. Если пользователь во время обработки щелкнет мышью и снимет выделение, то наш макрос потерпит поражение. В случае с Range такой неприятности не произойдет, поэтому и рекомендуется использовать вместо Selection.
Получить доступ к объекту можно несколькими способами:
Одноименный метод объекта Document – данный метод принимает два необязательных параметра, которые задают начальное и конечное значение выбора при работе с текстом в Word. Если вызвать метод без параметров, то будет выбрано содержимое всего документа, например:
' Выбираем весь текст set oRange = oDoc(1).Range() 'Делаем шрифт жирным oRange.Bold = true
Или такой вариант:
'Выбираем первые 10 символов
set oRange = oDoc(1).Range(0,10)
Одноименное свойство – данное свойство предусмотрено для большинства классов Word (Bookmark, Selection, Table, Row, Cell, Paragraph и так далее). В данном случае мы получаем Range для заданного класса, автоматически произойдет выбор содержимого данного класса (абзац, выделение, закладка и так далее).
Метод SetRange() – Данный метод предоставляет сам объект Range, и он позволяет переопределить выбор текста в ворде, например:
set oRange1 = oDoc(1).Range() oRange1.SetRange 1,10 oRange1.Bold = true
Содержание
- Класс Range – выбираем текст в ворде
- Свойства – работа с текстом в ворде
- Методы – работа с текстом в Word
Класс Range – выбираем текст в ворде
Свойства – работа с текстом в ворде
Свойства, которые позволяет задать или получить значение константы:
Case– Регистр текста в ворд, константа WdCharacterCase:
- wdNextCase — -1 – Как в предложении
- wdLowerCase — 0 — Нижний регистр
- wdUpperCase — 1 — Верхний регистр
- wdTitleWord — 2 – Начало слова с заглавной буквы
- wdTitleSentence — 4 — в режиме ввода предложения
- wdToggleCase — 5 – Инвертировать регистр
CharacterWidth — Ширина символов, константа WdCharacterWidth:
- wdWidthFullWidth — 7 – Полная ширина.
- wdWidthHalfWidth — 6 – Половина ширины (нормальный режим).
HorizontalInVertical– Расположение текста в ворде, константа WdHorizontalInVerticalType:
- wdHorizontalInVerticalNone — 0 – Форматирование отсутствует
- wdHorizontalInVerticalFitInLine — 1 – Горизонтальное направление
- wdHorizontalInVerticalResizeLine — 2 – Вертикальное направление
Orientation— Направление ворд текста, константа WdTextOrientation:
- wdTextOrientationHorizontal — 0 – Горизонтально, по умолчанию.
- wdTextOrientationVerticalFarEast — 1 – Вертикально вниз от верхней части, справа налево.
- wdTextOrientationUpward — 2 — Вверх под углом.
- wdTextOrientationDownward — 3 – Вниз под углом.
- wdTextOrientationHorizontalRotatedFarEast — 4 — Горизонтально, но справа налево (только для языков с данным типом письма).
- wdTextOrientationVertical — 5 — Вертикально вниз от верхней части, слева направо.
HighlightColorIndex– Цвет выделения текста в ворде, константа WdColorIndex.
LanguageIDOther– Язык текста в ворд, константа, WdLanguageID.
Style– Стиль, константа WdBuiltinStyle.
Underline– Тип подчеркивания, константа WdUnderline.
Свойства, которые позволяют задать или получить логическое значение:
Bold– Делает шрифт жирным (true).
Italic— Делает шрифт курсивом (true).
GrammarChecked– Проверка грамматики.
LanguageDetected– Определение языка.
Прочие свойства (чтение и запись), только последнее доступно только для чтения.
Startи End– Начальная и конечная позиция для выбора.
FitTextWidth— Ширина текста в текущих единицах измерения.
ID— Имя идентификатора (строковое значение) для указанного диапазона.
Text– Позволяет вставить (в место, где находится курсор), заменить (выбранную область), или получить текст в ворде для заданного диапазона.
Information(type) — Информация об указанном диапазоне (параметр type содержит значение константы WdInformation. Только чтение.
Методы – работа с текстом в Word
CheckGrammar() — Начинает проверку орфографии и грамматики для указанного диапазона.
Set Range2 = Documents("MyDocument.doc").Sections(2).Range Range2.CheckGrammar
CheckSynonyms() — Отображает диалоговое окно «Тезаурус«.
Collapse(Direction) — Убирает выделение.
Direction – Дополнительный параметр, который задает направление от позиции курсора. Может быть одним из следующих значений константы WdCollapseDirection: wdCollapseEnd — 0 или wdCollapseStart — 1. Значение по умолчанию wdCollapseStart.
ComputeStatistics(Statistic) – Позволяет получить статистику для заданного выбора. Параметр Statistic содержит значения константы WdStatistic.
Copy(), Delete(), Cut() – Копирование, удаление и вырезание выбранного диапазона.
Paste() – Вставка содержимого буфера обмена.
CopyAsPicture() – Копирование текста в ворде как изображения.
Select() – Выделение текущего выбора.
SetRange(Start, End) – Позволяет задать начальную и конечную позицию для выбора, вернет новый объект Range.
Relocate(Direction) — Переставляет местами абзацы в выбранном диапазоне.
Direction – Обязательный параметр, который задает направление, содержит значение константы WdRelocate:
- wdRelocateDown — 1 — Ниже следующего видимого абзаца.
- wdRelocateUp — 0 — Выше предыдущего видимого абзаца.
Методы с префиксом Insert…и Move… и метод ConvertToTable() используются также классом Selection, поэтому я не стал их описывать, просто ознакомьтесь со статьей «Объект Word Selection — выделение фрагмента текста в ворде, методы #1»
Ниже я привел два примера программного кода на языке VBScript и JScript, в них я просто выбираю каждый символ в тексте и задаю для него цвет выделения. Работа с текстами в Word. Причем так, что бы цвета периодически менялись.
Программный код на языке VBSCRIPT:
' ---------------------------------------------------------------------------- ' Работа с текстом в ворде ' Выделение разными цветами ' Range1.vbs ' ---------------------------------------------------------------------------- Option Explicit dim oWord, oDoc, oSel, i, oPars, MyText, oRange, j Set oWord = CreateObject("Word.Application") Set oDoc = oWord.Documents oDoc.Add() Set oSel = oWord.Selection Set oPars = oSel.Paragraphs oWord.Visible = True MyText = "Работа с текстом в Word " ' Вставляем текст For i=0 to 4 oSel.TypeText MyText & MyText & MyText & MyText & MyText & MyText & MyText oSel.TypeParagraph Next ' Создаем ссылку ' Заодно выбираем весь текст в ворде set oRange = oDoc(1).Range() i = 1:j = 0 ' Обрабатываем каждый символ Do While i <= oRange.End With oRange ' выбираем один символ .SetRange i, i+1 ' если выбран последний цвет if j = 17 then j = 0 ' Меняем цвет выделения .HighlightColorIndex = j j = j + 1 else .HighlightColorIndex = j j = j + 1 end if i = i + 1 End With Loop
Программный код на языке JSCRIPT:
// ---------------------------------------------------------------------------- // Работа с текстом в ворде // Выделение разными цветами // Range1.js // ---------------------------------------------------------------------------- var oWord1, oDoc1, oSel1, oPars1, MyText1 = "Работа с текстом в Word. ", oRange1; oWord1 = WScript.CreateObject("Word.Application"); oDoc1 = oWord1.Documents; oDoc1.Add(); oSel1 = oWord1.Selection; oPars1 = oSel1.Paragraphs; oWord1.Visible = true; // Вставляем текст for (i=0; i<=4; i++){ oSel1.TypeText(MyText1 + MyText1 + MyText1 + MyText1 + MyText1 + MyText1 + MyText1); oSel1.TypeParagraph(); } // Создаем ссылку // Заодно выбираем весь текст в ворде oRange1 = oDoc1(1).Range(); var i = 1, j = 0; // Обрабатываем каждый символ while (i <= oRange1.End){ with(oRange1){ // выбираем один символ SetRange(i, i+1); // если выбран последний цвет if (j == 17){ j = 0; // Меняем цвет выделения HighlightColorIndex = j; j++; }else{ HighlightColorIndex = j; j ++; } i++ } }
Хорошо, с программированием закончили, теперь можно дать некоторые пояснения. И так, оба примера работают с текстом в Word одинаково. Имена переменных практически идентичны, только для JSCRIPT я к имени переменных добавил 1. В самом начале происходит подключение основных классов для доступа к приложению Microsoft Word, создание нового документа — «Коллекция Documents«, делаем документ видимым. Далее в цикле FOR — «Урок 9 по JScript — оператор цикла for» и «Урок 6 по VBScript: Циклы for…next и for each…next» происходит работа с текстом в ворд, а именно – добавление несколько раз содержимого переменной MyText.
Переменная oRange будет содержать ссылку н6а класс, используя цикл WHILE — «Урок 7 по VBScript: Циклы do…loop и while…wend» и «Урок 10 по JScript: Цикл while и do…while«, мы начинаем обрабатывать каждый символ и менять его цвет, естественно, что количество возможных цветов ограничено. Поэтому нам приходится дополнительно добавить переменные i и j. Ну и все, результат работы можно увидеть на рисунке выше.
I’d go as follows:
Dim BMRange As Range
Dim tbl1 As Table
With ActiveDocument
Set tbl1 = .Tables(1)
Set BMRange = .Range(Start:=tbl1.Cell(2, 2).Range.Start, _
End:=tbl1.Cell(2, 2).Range.End)
BMRange.MoveEnd Unit:=wdCharacter, count:=-1
.Bookmarks.Add name:="ExampleBookmark", Range:=BMRange
End With
With tbl1.Cell(2, 3).Range
.Collapse (wdCollapseStart)
.InsertCrossReference ReferenceType:="Bookmark", ReferenceKind:= _
wdContentText, ReferenceItem:="ExampleBookmark", InsertAsHyperlink:=True, _
IncludePosition:=False, SeparateNumbers:=False, SeparatorString:=" "
End With
or, with a different stylistic choice:
Dim BMRange As Range
With ActiveDocument
With .Tables(1)
Set BMRange = .Parent.Range(Start:=.Cell(2, 2).Range.Start, _
End:=.Cell(2, 2).Range.End)
End With
BMRange.MoveEnd Unit:=wdCharacter, count:=-1
.Bookmarks.Add name:="ExampleBookmark", Range:=BMRange
With .Tables(1).Cell(2, 3).Range
.Collapse (wdCollapseStart)
.InsertCrossReference ReferenceType:="Bookmark", ReferenceKind:= _
wdContentText, ReferenceItem:="ExampleBookmark", InsertAsHyperlink:=True, _
IncludePosition:=False, SeparateNumbers:=False, SeparatorString:=" "
End With
End With
На одном из проектов столкнулась с ситуацией, когда построение отчета, в котором заполняются таблицы, занимало слишком много времен. Проанализировав код расчета отчета, поняла, что очень много времени тратится на заполнение таблиц с помощью функции
ListMergeTableWord, таким образом, я попыталась исключить использование данной функции в расчете. Решением данной ситуации было внесение данных в таблицы Excel, а затем вставка заполненных таблиц Excel в документ отчета и дальнейшем форматированием
документа с помощью IS-Builder, таким образом, удалось сократить время построения отчета в несколько раз. Это скорее не единичный случай использования объектной модели MS Office для решения задач для генерации документов, а постоянно выполняемая задача.
Например, в рамках другого проекта была поставлена одна из задач: формировать версии документов без возможности их редактирования. Для решения данной задачи был выбран вариант преобразования документов в формате docxls в формат pdf, хотя, возможен и другой
формат, в который возможно преобразование документа в MS Office. Существует 2 способа преобразования документа: 1) с помощью службы преобразования; 2) с помощью объектной модели MS Office (с 2007 версии). Мною был выбран 2 способ так, как исключается промежуточное
звено (служба преобразования), соответственно уменьшается нагрузка на сервер, увеличивается скорость преобразования и нет необходимости настраивать службу. Ниже будет приведен способ преобразования документа формата doc в формат pdf (35-й пункт).
В данной статье хотелось описать наиболее востребованные способы форматирования документа в формате doc с помощью
IS—Builder.
Word = CreateObject("Word.Application") Doc = Word.Documents.Open(Path) где Path - путь к документу, с которым работаете.
- Установка единицы измерения размера таблицы
Doc.Tables(1).PreferredWidthType = 2
Единица измерения |
Константа в Word |
Значение в ISBL |
Сантиметры |
wdPreferredWidthPoints |
3 |
Проценты |
wdPreferredWidthPercent |
2 |
- Установка ширины таблицы
Doc.Tables(1).PreferredWidth = 100 // ширина таблицы в процентах Doc.Tables(1).PreferredWidth = Word.CentimetersToPoints(17.5) // ширина таблицы в сантиметрах
- Автоподбор размера ячейки таблицы
Doc.Tables(1).AutoFitBehavior(2)
Режим выравнивания |
Константа в Word |
Значение в ISBL |
Фиксированная ширина |
wdAutoFitFixed |
0 |
По содержимому |
wdAutoFitContent |
1 |
По ширине окна |
wdAutoFitWindow |
2 |
- Установка высоты ячеек
Doc.Tables(1).Rows.HeightRule = HeightRule // указывает на способ изменения высоты Doc.Tables(1).Rows.Height = RowHeigh // RowHeight указывает на новую высоту строки в пунктах.
Значение константы HeightRule
Способ изменения высоты |
Константа в Word |
Значение в ISBL |
Размер, указанный в параметре RowHeigh, является точным |
wdRowHeightAuto |
2 |
Размер, указанный в параметре RowHeigh, является минимальным |
wdRowHeightAtLeast |
1 |
Автоматический подбор высоты строк (параметр RowHeigh игнорируется) |
wdRowHeightExactly |
0 |
- Установка интервала абзаца (перед и после) в таблице
Doc.Tables(1).Range.ParagraphFormat.SpaceBefore = 6 //интервал перед Doc.Tables(1).Range.ParagraphFormat.SpaceAfter = 6 //интервал после Единица измерения интервала пт.
- Установка интервалов перед и после абзаца
Doc.Paragraphs(1).Format.SpaceBefore = 12 // интервал перед Doc.Paragraphs(1).Format.SpaceAfter = 12 // интервал после
- Межстрочный интервал
Doc.Paragraphs(1).Format.LineSpacingRule = 0.5 // одинарный интервал 1 – полуторный интервал и 1.5 – двойной интервал.
- Установка стиля таблицы
Doc.Tables(1).Style = ИмяСтиляТаблицы
- Установка отступа слева
Doc.Tables(1).Rows.LeftIndent = 0
- Абзацный отступ (красная строка) абзаца
Doc.Paragraphs(1).Format.FirstLineIndent = Значение в пунктах
Для перевода сантиметров в пункты можно воспользоваться функцией
CentimetersToPoints, тогда абзацный отступ в 1,5 см можно задать следующим образом:
Doc.Paragraphs(1).Format.FirstLineIndent = Word.CentimetersToPoints(1.5)
- Установка левой и правой границ текста абзаца:
Doc.Paragraphs(1).Format.LeftIndent = 10 // отступ слева Doc.Paragraphs(1).Format.RightIndent = 10 // отступ справа
- Установка значений полей ячеек по умолчанию
Doc.Tables(1).TopPadding = 0 // верхнее Doc.Tables(1).BottomPadding = 0 // нижнее Doc.Tables(1).LeftPadding = 0 // левое Doc.Tables(1).RightPadding = 0 // правое
- Выравнивание текста в таблице по горизонтали
Doc.Tables(1).Range.ParagraphFormat.Alignment = 3 // по ширине
Режим выравнивания |
Константа в Word |
Значение в ISBL |
По левому краю |
wdAlignParagraphLeft |
0 |
По центру |
wdAlignParagraphCenter |
1 |
По правому краю |
wdAlignParagraphRight |
2 |
По ширине |
wdAlignParagraphJustify |
3 |
- Выравнивание текстового абзаца:
Doc.Paragraphs(1).Format.Alignment = 0 // выравнивание по левому краю
Значения констант выравнивания такие же как в предыдущем пункте.
- Выравнивание текста в ячейке по вертикали
Doc.Tables(1).Rows(НомерСтроки).Cells(НомерСтолбца).VerticalAlignment = 1
Режим выравнивания |
Константа в Word |
Значение в ISBL |
По верхнему краю |
wdCellAlignVerticalTop |
0 |
По центру |
wdCellAlignVerticalCenter |
1 |
По нижнему краю |
wdCellAlignVerticalBottom |
3 |
- Установка размера шрифта таблицы
Doc.Tables(1).Range.Font.Size = 7
- Установка цвета текста в ячейке
Doc.Tables(1).Cell(НомерСтроки; НомерСтолбца).Range.Font.Color = 255
- Выделение всего текста таблицы (жирным, курсивом, подчеркиванием)
Doc.Tables(1).Range.Font.Bold = True // жирным Doc.Tables(1).Range.Font.Italic = True // курсивом Doc.Tables(1).Range.Font.Underline = True // подчеркивание
- Установка цвета подчеркивания
Doc.Tables(1).Cell(НомерСтроки; НомерСтолбца).Range.Font.UnderlineColor = 255
- Установка темы шрифта таблицы
Doc.Tables(1).Range.Font.Name = "Arial"
- Объединение ячеек
// объединение первой и второй ячеек первой строки Cell = Doc.Tables(1).Cell(1; 1) Cell.Merge(Doc.Tables(1).Cell(1; 2))
- Вставка Excel таблицы
в Word
SelectionWord = Doc.Paragraphs(Paragraph).Range SelectionWord.PasteExcelTable(True; False; False)
Paragraph
– номер параграфа, куда будет вставлена таблица из Excel.
- Разрыв связь
Doc.Fields.Unlink
- Удаление абзаца
Doc.Paragraphs(Paragraph).Range.Delete
Paragraph
– номер параграфа, который нужно удалить.
- Удаляем строку в таблице
Doc.Tables(1).Rows(НомерСтроки).Select Doc.Tables(1).Rows(НомерСтроки).Delete
- Установка границ таблицы
Table = Doc.Tables(1) Table.Borders(WdBorderType).LineStyle = 4
Расположение линии |
Значение в Word |
Константа в ISBL |
Линия, обрамляющая диапазон сверху |
wdBorderTop |
-1 |
Линия, обрамляющая диапазон слева |
wdBorderLeft |
-2 |
Линия, обрамляющая диапазон снизу |
wdBorderBottom |
-3 |
Линия, обрамляющая диапазон справа |
wdBorderRight |
-4 |
Все горизонтальные линии внутри диапазона |
wdBorderHorizontal |
-5 |
Все вертикальные линии внутри диапазона |
wdBorderVertical |
-6 |
Линия по диагонали сверху – вниз |
wdBorderDiagonalDown |
-7 |
Линия по диагонали снизу – вверх |
wdBorderDiagonalUp |
-8 |
- Закрасить всю таблицу
цветом
Doc.Tables(1).Shading.BackgroundPatternColor = 255 // заливка красным цветом
- Закрасить ячейку цветом
Cell = Doc.Tables(1).Cell(1; 1) Cell.Shading.BackgroundPatternColor = -687800525 // заливка желтым цветом
- Установка ориентации страницы
Doc.Application.Selection.PageSetup.Orientation = 1 // альбомная Doc.Application.Selection.PageSetup.Orientation = 0 // книжная
- Установка полей страницы
Word.Application.Selection.PageSetup.LeftMargin = Word.CentimetersToPoints(2) // левое поле Word.Application.Selection.PageSetup.RightMargin = Word.CentimetersToPoints(2) // правое поле Word.Application.Selection.PageSetup.TopMargin = Word.CentimetersToPoints(2) // верхнее поле Word.Application.Selection.PageSetup.BottomMargin = Word.CentimetersToPoints(2) // нижнее поле
- Добавление таблицы в документ
Doc.Tables.Add(Doc.Paragraphs(1).Range; 3; 5) // добавление таблицы из 5 столбцов и 3 строк в 1 абзац
- Добавление строки в таблицу
Doc.Tables(1).Rows.Add
- Добавление колонки в таблицу
Doc.Tables(1).Columns.Add
- Добавление текста в ячейку
Doc.Tables(1).Cell(1;3).Range.Text = 'Текст, который добавляется в ячейку'
- Сохранение документа в pdf формат
Doc.ExportAsFixedFormat(Path; 17; openAfterExport; CreateBookmarks)
где
- Path — полный путь и имя нового файла формата PDF;
- 17 — значение Microsoft.Office.Interop.Word.WdExportFormat, указывающие, что сохранять документ в формате PDF;
- openAfterExport — Значение True используется, чтобы автоматически открыть новый файл; в противном случае используется значение False.
- CreateBookmarks — значение указывает, следует ли экспортировать закладки и тип закладки. Значение константы WdExportCreateBookmarks:
- wdExportCreateHeadingBookmarks = 1 — Создание закладки в экспортируемом документе для всех заголовком, которые включают только заголовки внутри основного документа и текстовые поля не в пределах колонтитулов, концевых сносок, сносок или комментариев.
- wdExportCreateNoBookmarks = 0 — Не создавать закладки в экспортируемом документе.
- wdExportCreateWordBookmarks = 2 — Создание закладки в экспортируемом документе для каждой закладки, которая включает все закладки кроме тех, которые содержатся в верхнем и нижнем колонтитулах.
P.S.: Аналогичная статья для Excel
Несколько способов форматирования и обработки данных в Excel документах с помощью IS-Builder.
Редактирование документов Word из кода VBA Excel. Добавление и форматирование текста. Объект Word.Range, свойство Text, методы InsertAfter и InsertBefore.
Работа с Word из кода VBA Excel
Часть 3. Редактирование документов Word
[Часть 1] [Часть 2] [Часть 3] [Часть 4] [Часть 5] [Часть 6]
Добавление текста в новый документ
Основные объекты, использующиеся в VBA Word для определения места вставки, добавления и форматирования текста – это Selection (выделение), Range (диапазон) и Bookmark (закладка).
Selection и Range позволяют заполнять текстом новые документы или редактировать существующие. Закладки можно использовать для вставки изменяемых реквизитов в шаблоны различных документов: договоры, акты, справки.
Объект Range имеет преимущество перед объектом Selection, так как он может быть создан только программно и не зависит от действий пользователя. Если для вставки и форматирования текста будет использоваться объект Selection, а пользователь во время работы программы просто поставит курсор в другое место документа, результат будет непредсказуем.
Word.Range кардинально отличается от объекта Range в Excel. В приложении Word он представляет из себя набор из одного или множества символов. А также он может вообще не содержать ни одного символа, а быть указателем ввода текста (виртуальным курсором).
Объект Range возвращается свойством Range других объектов приложения Word: Document, Selection, Bookmark, Paragraph, Cell (объект Table).
Вставка текста без форматирования
Если текст вставляется без форматирования, достаточно одной строки кода (myDocument – это переменная):
- Вставка текста с заменой имеющегося:
myDocument.Range.Text = "Вставляемый текст"
- Добавление текста после имеющегося:
myDocument.Range.InsertAfter "Добавляемый текст"
- Добавление текста перед имеющимся:
myDocument.Range.InsertBefore "Добавляемый текст"
Методами InsertAfter и InsertBefore можно вставить текст и на пустую страницу, также, как с помощью свойства Text. Перейти на новый абзац и начать предложение с красной строки можно с помощью ключевых слов vbCr (vbNewLine, vbCrLf) и vbTab.
Вставка текста с форматированием
Для форматирования отдельных участков текста необходимо указать диапазон символов, входящих в этот участок. Здесь нам также поможет объект Range, которому можно задать любой набор символов, содержащихся в документе Word.
Синтаксис присвоения диапазона символов объекту Range:
myDocument.Range(Start:=n, End:=m) ‘или без ключевых слов Start и End myDocument.Range(n, m) |
- myDocument – переменная;
- n – номер точки перед начальным символом;
- m – номер точки после конечного символа.
Счет точек вставки начинается с нуля. Знаки переноса строки, возврата каретки и табуляции учитываются как отдельные символы. 0 – это для объекта Word.Range виртуальная точка вставки на пустом документе, 1 – точка между первым и вторым символом, 2 – точка между вторым и третьим символом и т.д.
На пустом документе объекту Range можно присвоить только виртуальную точку вставки:
myDocument.Range(Start:=0, End:=0)
Первый символ в документе с текстом:
myDocument.Range(Start:=0, End:=1)
Диапазон с 11 по 20 символ:
myDocument.Range(Start:=10, End:=20)
Реальная точка вставки (курсор) принадлежит объекту Selection, который создается вручную или программно с помощью метода Select.
Вставка курсора в начало документа:
myDocument.Range(Start:=0, End:=0).Select
Эта строка вставит курсор между пятым и шестым символами:
myDocument.Range(Start:=5, End:=5).Select
Вставка курсора в конец документа:
myDocument.Range(.Range.Characters.Count - 1, .Range.Characters.Count - 1).Select
Ссылку на объект Range можно присвоить переменной, но при форматировании ее придется каждый раз переопределять и код получится длиннее. Пример присвоения ссылки объектной переменной:
Dim myRange As Word.Range Set myRange = myDocument.Range(Start:=0, End:=20) |
Для Range(Start:=0, End:=20)
в документе должно быть как минимум 20 символов.
Однострочные примеры редактирования и форматирования текста
Вставка дополнительного текста внутри имеющегося после заданной точки:
myDocument.Range(Start:=10, End:=10).InsertAfter "Вставляемый текст"
Новый абзац с красной строки (предыдущая строка должна заканчиваться символом возврата каретки или переноса строки):
myDocument.Range.InsertAfter vbTab & "Красная строка"
Присвоение шрифту заданного диапазона зеленого цвета:
myDocument.Range(Start:=10, End:=65).Font.ColorIndex = wdGreen
Меняем обычное начертание на курсив:
myDocument.Range(Start:=10, End:=65).Font.Italic = True
Указываем размер шрифта:
myDocument.Range(Start:=10, End:=65).Font.Size = 22
Применение стандартных стилей:
myDocument.Range(Start:=0, End:=16).Style = "Заголовок 1"
Если вас заинтересуют другие команды форматирования текста, запишите их макрорекордером в VBA Word и примените к объекту Range.
Пример 1
Добавление текста в новый документ без форматирования:
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 Primer1() On Error GoTo Instr Dim myWord As New Word.Application, _ myDocument As Word.Document Set myDocument = myWord.Documents.Add myWord.Visible = True With myDocument .Range.Text = «Заголовок по центру» & vbCr .Range(Start:=0, End:=19).ParagraphFormat.Alignment _ = wdAlignParagraphCenter .Range.InsertAfter _ vbTab & «Первый абзац с красной строки» & vbCr & _ «Второй абзац не с красной строки» & vbCr & _ vbTab & «Третий абзац с красной строки» 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 |
Пример 2
Добавление текста в новый документ с форматированием:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
Sub Primer2() On Error GoTo Instr Dim myWord As New Word.Application, _ myDocument As Word.Document Set myDocument = myWord.Documents.Add myWord.Visible = True With myDocument .Range.Text = «Заголовок по центру» & vbCr .Range(Start:=0, End:=19).Style = «Заголовок» .Range(Start:=0, End:=19).ParagraphFormat.Alignment _ = wdAlignParagraphCenter .Range.InsertAfter «Заголовок 1 не по центру» & vbCr .Range(Start:=20, End:=44).Style = «Заголовок 1» .Range.InsertAfter vbTab & «Шрифт по умолчанию « _ & «с красной строки» & vbCr .Range.InsertAfter «Зеленый курсив, размер 20» .Range(Start:=82, End:=107).Font.Italic = True .Range(Start:=82, End:=107).Font.Size = 20 .Range(Start:=82, End:=107).Font.ColorIndex = wdGreen 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 на своем компьютере и посмотреть результаты.