Содержание
- VBA PDF (бесплатные загрузки)
- Примеры Word VBA «Шпаргалка»
- Учебное пособие по макросам Word VBA
- Пример простого макроса Word
- Объект документа Word
- Документы
- Диапазон, выделение, абзацы
- Примеры макросов Word
Добро пожаловать в наше мега-руководство по Word VBA / макросам!
Эта страница содержит:
-
- Учебное пособие по Word VBA в формате PDF (бесплатная загрузка)
- Word VBA «Шпаргалка», содержащая список наиболее часто используемых фрагментов кода Word VBA.
- Полное руководство по Word VBA / Macro.
- Список всех наших руководств по макросам 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 is a Microsoft application used for word processing. VBA is embdedded within the Word application and can be used to programmatically work with Word. The Word Object Library contains classes that make working with Word in VBA possible. The classes in the Word Object Library are collectively referred to as the Word Object Model. When using VBA in Word, a reference is included to the Word Object Library.
Word Object Model
The Word Object Model contains classes that make it possible to work with Word in VBA. The Word Object Model contains many classes but the general overview of the model is Application → Document → Range.
-
Application-
Documents-
Document- Range
- Sentences
-
Paragraphs- Paragraph
-
Bookmarks- Bookmark
-
Tables- Table
-
ContentControls- ContentControl
-
Comments- Comment
- MailMerge
-
-
Windows- Window
- Selection
-
Context
The place where VBA code is written determines the implied context when referring to classes. For example, when using VBA in Word and referring to the Application object, it is implied that Application and Word.Application are the same object. However, when using VBA in another application to work with Word, it is necessary to qualify references to avoid naming collisions with classes in the other application. Using qualified references requires that a reference is set to the library where the classes are defined. If a reference cannot be set, late-binding can be used instead.
Public Sub Example()
'''In Word
Debug.Print Application Is Word.Application 'Prints: True
End Sub
Public Sub Example()
'''In Excel
'Requires a reference to the Word Object Library
Debug.Print Application Is Word.Application 'Prints: False
Debug.Print Application Is Excel.Application 'Prints: True
End Sub
To retrieve the Word Application object from another application, attempt to retrieve the running application and if that fails start a new instance of the application.
Public Function GetWordApp() As Object
On Error Resume Next
Set GetWordApp = GetObject(, "Word.Application")
On Error GoTo 0
If GetWordApp Is Nothing Then
Set GetWordApp = CreateObject("Word.Application")
End If
End Sub
Application
The Application object represents the Word application itself. The Application object is the top-level object and provides access to the rest of the Word Object Model. The Application object can be used to access functionality and properties of the Word application.
Options
The Application.Options property contains a number of options that can be set for the Word application.
Public Sub Example()
Word.Application.Options.DisplayGridLines = True
End Sub
Validation Methods
The Application object has methods which facilitate validating and cleaning text:
- Application.CheckGrammar
- Application.CheckSpelling
- Application.CleanString
Public Sub Example()
Debug.Print Word.Application.CheckGrammar("Hello my name is Peter.")
Debug.Print Word.Application.CheckGrammar("Hello, my name is Peter.")
Debug.Print Word.Application.CheckSpelling("Helllo, how are you?")
Debug.Print Word.Application.CheckSpelling("Hello, how are you?")
Dim S As String
S = "Hello," & Chr(0) & "World!"
S = Word.Application.CleanString(S)
Debug.Print Asc(Mid$(S, 7, 1)) 'Null character replaced with Space
End Sub
Documents
The Document class represents a Word document. The Documents collection object represents all open Word documents and can be accessed from the Application.Documents property.
Iterate Documents
To iterate over all open documents use a For Each loop with the Documents collection object.
Public Sub Example()
Dim D As Word.Document
For Each D In Word.Application.Documents
Debug.Print D.Name
Next D
End Sub
Add Document
To add a document use the Documents.Add method.
Public Sub Example()
Dim D As Word.Document
Set D = Word.Application.Documents.Add
End Sub
Save Document
To save a document use the SaveAs2 method and the Save method. To save a document in a specific file format supply the SaveAs2 method with a FileFormat argument from the WdSaveFormat enum.
Public Sub Example()
Dim D As Word.Document
Set D = Word.Application.Documents.Add
D.SaveAs2 Environ$("USERPROFILE") & "DesktopExample.docx", wdFormatDocumentDefault
D.Content.InsertAfter "Hello, World!"
D.Save
End Sub
Open and Close Document
To open a document use the Documents.Open method. To close a document use the Close method.
Public Sub Example()
Dim D As Word.Document
Set D = Word.Application.Documents.Open(Environ$("USERPROFILE") & "DesktopExample.docx")
D.Content.InsertAfter "Hello, World!"
D.Save
D.Close
End Sub
Check Spelling and Grammar
The CheckSpelling method can be used to check a Document for spelling mistakes. The CheckGrammar method can be used to check a Document for grammar issues.
Public Sub Example()
Dim D As Word.Document
Set D = Word.Application.Documents(1)
D.CheckSpelling
D.CheckGrammar
End Sub
Ranges
The Range object represents an area of a Word document. Working with Ranges is important for using VBA with Word. There are different ways to retrieve a Range object.
Range Method
The Range method can be used to get a Range object using a starting character and ending character number.
Public Sub Example()
Dim D As Word.Document
Set D = Word.Application.Documents(1)
Dim R As Word.Range
Set R = D.Range(0, 10)
End Sub
Range Property
Certain objects in Word have a Range property which can be used to return a Range object.
Public Sub Example()
Dim D As Word.Document
Set D = Word.Application.Documents(1)
Dim R As Word.Range
Set R = D.Paragraphs(1).Range
End Sub
Content Property
The Content property of a Document object returns a Range object that represents all the content in the document.
Public Sub Example()
Dim D As Word.Document
Set D = Word.Application.Documents(1)
Dim R As Word.Range
Set R = D.Content
End Sub
StoryRanges Property
The StoryRanges collection object contains Range objects that represent «stories». The types of stories are defined in the WdStoryType enum.
Public Sub Example()
Dim D As Word.Document
Set D = Word.Application.Documents(1)
Dim R As Word.Range
Set R = D.StoryRanges(wdMainTextStory) 'Same as Document.Content
End Sub
Sentences
The Document.Sentences property and the Range.Sentences property return a Sentences collection object containing a the sentences within a Document or Range. Each sentence is a Range object.
Public Sub Example()
Dim D As Word.Document
Set D = ThisDocument
Dim Ss As Word.Sentences
Set Ss = D.Range.Sentences
Dim S As Word.Range
For Each S In Ss
Debug.Print S.Text
Next S
End Sub
Paragraphs
The Paragraph object can be used to retrieve a Range object representing a paragraph. Paragraphs can be accessed from the Paragraphs collection object. Use the Document.Paragraphs property to retrieve the Paragraphs collection object for a Document.
Public Sub Example()
Dim D As Word.Document
Set D = Word.Application.Documents(1)
Dim R As Range
Set R = D.Paragraphs(1).Range
End Sub
Words
The Document.Words property and the Range.Words property return a Words collection object containing a collection of all the words within a Document or Range. Each word in the collection is a Range object.
Public Sub Example()
Dim D As Word.Document
Set D = Word.Application.Documents(1)
Dim R As Word.Range
For Each R In D.Words
Debug.Print R.Text
Next R
End Sub
Check Spelling, Grammar, and Synonyms
The Range.CheckGrammar method can be used to check a Range for Grammar issues.
The Range.CheckSpelling method can be used to check a Range for spelling mistakes.
The Range.CheckSynonyms method can be used to check for synonyms of a word.
Public Sub Example()
Dim D As Word.Document
Set D = Word.Application.Documents(1)
D.Content.CheckSpelling
D.Content.CheckGrammar
D.Content.Words(1).CheckSynonyms
End Sub
Basic Methods
Basic methods of the Range object include Copy, Cut, Delete, Move, Paste, InsertAfter, and InsertBefore.
Basic Properties
Basic properties of the Range object include Bold, Font, Italic, Style, Text, And Underline.
Paragraphs
The Paragraph object represents a paragraph. The Paragraphs collection object contains a collection of Paragraph objects. Use the Document.Paragraphs property or the Range.Paragraphs property to get a Paragraphs collection containing all paragraphs in a Document or Range. The Paragraph object and the Paragraphs collection object have many of the same properties and methods. It may not be necessary to loop over all Paragraph objects in the collection, but instead call a particular method on the entire collection.
Public Sub Example()
Dim D As Word.Document
Set D = Word.Application.Documents(1)
D.Paragraphs.IndentFirstLineCharWidth 4
End Sub
Bookmarks
The Bookmark class represents a Bookmark. The Bookmarks collection object contains a collection of Bookmark objects. Use the Document.Bookmarks property to get a Bookmarks collection containing all Bookmarks in a Document. Bookmarks can be used to locate part of a document.
Public Sub Example()
Dim D As Word.Document
Set D = Word.Application.Documents(1)
Dim B As Word.Bookmark
Set B = D.Bookmarks.Add("Test", D.Range(0, 0))
End Sub
Tables
The Table object represents a table with rows and columns. The Tables collection object contains a collection of Table objects. Use the Document.Tables property to get a Tables collection containing all Table objects in a Document.
Add Table
To add a Table use the Tables.Add method. The Add method takes a Range where the table will be added, the number of rows, the number of columns, the default table behavior as a member of the WdDefaultTableBehavior enum, and the auto fit behavior as a member of the WdAutoFitBehavior enum.
Public Sub Example()
Dim D As Word.Document
Set D = Word.Application.Documents(1)
Dim T As Word.Table
Set T = D.Tables.Add(D.Range(0, 0), 10, 3)
With T.Borders
.OutsideLineStyle = wdLineStyleSingle
.OutsideLineWidth = wdLineWidth025pt
.InsideLineStyle = wdLineStyleSingle
End With
T.Cell(1, 1).Range.Text = "Header1"
T.Cell(1, 2).Range.Text = "Header2"
T.Cell(1, 3).Range.Text = "Header3"
T.Rows(1).Range.Bold = True
T.Range.ParagraphFormat.Alignment = wdAlignParagraphCenter
T.Rows(1).Cells.VerticalAlignment = wdCellAlignVerticalCenter
End Sub
ContentControls
The ContentControl object represents a control. The ContentControls collection object contains ContentControl objects. Use the Document.ContentControls property to get a ContentControls collection containing all ContentControl objects in a Document.
Add ContentControl
To add a ContentControl use the ContentControls.Add method with a member of the WdContentControlType enum and provide a Range object for where the control will be added.
Public Sub Example()
Dim D As Word.Document
Set D = Word.Application.Documents(1)
Dim CC As Word.ContentControl
Set CC = D.ContentControls.Add(wdContentControlDropdownList, D.Range(0, 0))
CC.DropdownListEntries.Add "List Entry 1", "Value 1", 1
CC.DropdownListEntries.Add "List Entry 2", "Value 2", 2
CC.DropdownListEntries.Add "List Entry 3", "Value 3", 3
End Sub
Comments
The Comment object represents a comment. The Comments collection object contains a collection of Comment objects. Use the Document.Comments property to get a Comments collection containing all Comment objects in a Document.
Add Comment
To add a Comment use the Comments.Add method and provide a Range object and the comment text.
Public Sub Example()
Dim D As Word.Document
Set D = Word.Application.Documents(1)
Dim C As Word.Comment
Set C = D.Comments.Add(D.Range(0, 0), "Test Comment")
End Sub
MailMerge
The MailMerge object provides the ability to use the MailMerge feature in VBA.
Public Sub Example()
Dim D As Word.Document
Set D = Word.Application.Documents(1)
Dim SourcePath As String
SourcePath = "C:ExampleMailingList.xlsx"
D.MailMerge.Fields.Add Range:=D.Range(0, 0), Name:="Name"
D.MailMerge.OpenDataSource _
Name:=SourcePath, _
ConfirmConversions:=False, _
ReadOnly:=False, _
LinkToSource:=True, _
AddToRecentFiles:=False, _
PasswordDocument:="", _
PasswordTemplate:="", _
WritePasswordDocument:="", _
WritePasswordTemplate:="", _
Revert:=False, _
Format:=wdOpenFormatAuto, _
Connection:= _
"Provider=Microsoft.ACE.OLEDB.12.0;" & _
"User ID=Admin;" & _
"Data Source=" & SourcePath & ";" & _
"Mode=Read;" & _
"Extended Properties=""HDR=YES;IMEX=1;"";" & _
"Jet OLEDB:System database="""";" & _
"Jet OLEDB:Registry Path="""";" & _
"Jet OLEDB:Engine Type=37;" & _
"Jet OLEDB:Database ", _
SQLStatement:="SELECT * FROM `Sheet1$`", _
SQLStatement1:="", _
SubType:=wdMergeSubTypeAccess
With D.MailMerge
.Destination = wdSendToNewDocument
.SuppressBlankLines = True
With .DataSource
.FirstRecord = wdDefaultFirstRecord
.LastRecord = wdDefaultLastRecord
End With
.Execute Pause:=False
End With
End Sub
Find
The Find object represents the find operation. The Find object contains properties and methods to conduct a specific find operation.
Find
To find text set the Text property and use the Execute method. The Execute method returns True if the text was found. The Found property will be set to True if the text was found after Execute is called.
Public Sub Example()
Dim D As Word.Document
Set D = Word.Application.Documents(1)
Dim F As Word.Find
Set F = D.Content.Find
With F
.Text = "Hello, World!"
Debug.Print .Execute
Debug.Print .Found
End With
End Sub
Find and Replace
To replace text set the Text property of the Find object and the Text property of the Find object’s Replacement object property. Set the Replace parameter of the Execute method to a member of the WdReplace enum.
Public Sub Example()
Dim D As Word.Document
Set D = Word.Application.Documents(1)
Dim F As Word.Find
Set F = D.Content.Find
With F
.Text = "Hello, World!"
.Replacement.Text = "How's it goin'?"
Debug.Print .Execute(Replace:=wdReplaceAll)
End With
End Sub
Find and Highlight
To highlight found text use the HitHighlight method. To clear highlighted hits use the ClearHitHighlight method.
Public Sub Example()
Dim D As Word.Document
Set D = Word.Application.Documents(1)
Dim F As Word.Find
Set F = D.Content.Find
With F
.ClearHitHighlight
.HitHighlight "Hello, World!"
End With
End Sub
Match Options
Various matching options can be set by setting certain properties to True:
- MatchAlefHamza
- MatchAllWordForms*
- MatchByte
- MatchCase
- MatchControl
- MatchDiacritics
- MatchFuzzy
- MatchKashida
- MatchPhrase
- MatchPrefix
- MatchSoundsLike
- MatchSuffix
- MatchWholeWord
- MatchWildcards
Certain properties render other properties useless. For example, using MatchWildcards or MatchAllWordForms renders the MatchCase property meaningless.
Only one of the MatchPhrase, MatchWildcards, MatchSoundsLike, MatchAllWordForms, or MatchFuzzy options can be set to True at a given time.
When using the MatchAllWordForms property, the search text should be lowercase. Using uppercase causes the text not to match when it should.
Public Sub Example()
'''Match and highlight forms of "run"
Dim D As Word.Document
Set D = Word.Application.Documents(1)
Dim F As Word.Find
Set F = D.Content.Find
With F
.MatchAllWordForms = True
.MatchWholeWord = True
'Search text must be lowercase. Matches with uppercase and lowercase
.HitHighlight "run"
End With
End Sub
ComputeStatistics
The Document.ComputeStatistics method or the Range.ComputeStatistics method can be used to retrieve information about the content of a Document or Range. Pass a member of the WdStatistic enum to retrieve a specific value.
Public Sub Example()
Dim D As Word.Document
Set D = Word.Application.Documents(1)
Debug.Print "Characters: " & D.ComputeStatistics(wdStatisticCharacters)
Debug.Print "CharactersWithSpaces: " & D.ComputeStatistics(wdStatisticCharactersWithSpaces)
Debug.Print "FarEastCharacters: " & D.ComputeStatistics(wdStatisticFarEastCharacters)
Debug.Print "Lines: " & D.ComputeStatistics(wdStatisticLines)
Debug.Print "Pages: " & D.ComputeStatistics(wdStatisticPages)
Debug.Print "Paragraphs: " & D.ComputeStatistics(wdStatisticParagraphs)
Debug.Print "Words: " & D.ComputeStatistics(wdStatisticWords)
End Sub
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…