Содержание
- 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», чтобы запустить макрос.
Время на прочтение
7 мин
Количество просмотров 8.1K
Картинка pch.vector, freepik
Практически каждый из читателей, наверняка не раз (а кто-то и на постоянной основе), имеет потребность в написании и редактировании документов в среде Word.
Однако если подобная деятельность производится с некоторой периодичностью, пытливый ум сразу начинает думать о способах оптимизации своего труда. Одним из таких способов является программирование в среде Visual Basic for Applications,- среде разработки, которая встроена в известные офисные продукты: Word, Excel, PowerPoint и т.д. Статья больше вводная, для тех, «кто совсем не в теме» :-).
Следует сразу оговориться, что любое программирование требует для изучения достаточных временных ресурсов и, в ряде случаев, подобные трудозатраты могут быть неоправданными.
Поэтому, в этих случаях имеет смысл просто — напросто записать макрос. Которой представляет собой записанную последовательность ваших действий, которая должна быть повторена многократно для некой, часто повторяющейся обработки.
Макрос
Тут следует сказать, что по умолчанию, меню для записи макроса скрыто и его необходимо явным образом включить. Для этого нужно пройти по пути: Файл-Параметры
В открывшемся окне перейти в настройку ленты:
Далее, в правом окне, под названием «Основные вкладки», поставить галочку рядом с опцией «разработчик»:
В результате этих действий на ленте сверху у вас появится вкладка «разработчик»:
Войдя в которую, в левой части, вы как раз и сможете найти две интересующие нас опции: «Visual Basic» и «Макросы»:
Соответственно, далее если мы нажимаем на кнопку «Запись макроса», то мы сможем записать нашу последовательность действий:
Созданный макрос можно сохранить либо в конкретном документе, либо сделать его доступным для всех документов (если сохраним его в шаблоне normal.dotm):
После чего, записанный макрос может быть воспроизведён, если мы перейдём, нажав на кнопку «Макросы»:
Для многих достаточно тривиальных задач, этого бывает достаточно. Однако бывают ситуации, когда нам необходимо применить программирование.
Здесь существуют 2 опции:
- правка кода уже имеющегося макроса
- написание кода с нуля.
Для первого случая, нам нужно перейти нажав на «макросы», для того чтобы открылась окно выбора макроса и нажать на кнопку «отладка»:
Это приведёт к запуску среды разработки, где вы сможете увидеть свой записанный макрос в виде кода. Кстати говоря, это является одним из интересных лайфхаков, когда недостаточное знание программирования на VBA вы подменяете сгенерированным кодом макроса и реверс-инжинирингом, с попыткой вникнуть, «а как оно там внутри устроено?»:
Чуть выше, мы произвели ряд манипуляций, для того чтобы вынести вкладку «разработчик» на ленту. Однако если вы хотите не писать макросы, а писать код сразу, совершенно необязательно добавлять эту вкладку на ленту.
Среду разработки можно вызвать нажатием сочетания клавиш Alt+F11, после чего, написав нужный код, запустить его прямо из среды разработки.
Список готовых макросов можно вызвать нажатием сочетания клавиш ALT+F8.
Visual Basic for Applications(VBA)
Как мы уже говорили, разработка кода для приложений Office ведётся с использованием специального кода, который является версией интерпретируемого языка Visual Basic (несколько упрощённой его версией).
Благодаря использованию объектной модели компонентов (COM), могут применяться компоненты, используемые в ряде программ одновременно, для этого используется технология OLE (Object Linking and Embedding), суть которой заключается передаче части работы от одной программы к другой (в рамках среды Windows), и получение обратно результата.
Это означает, что теоретически, вы можете на VBA написать программу, которая будет использовать, например, средства Photoshop или Corel Draw, если конечно они установлены у вас на компьютере (однако, есть подозрение, что для этого потребуется более расширенная версия языка, чем тот, который идёт в комплекте с пакетом Office).
В рамках VBA объекты представлены в виде иерархии: Application/Document/Paragraph и т.д., то есть, как можно видеть в этой строке, каждый предыдущий — содержит последующий.
Получается своего рода «матрёшка», где одно вложено в другое и, если задуматься, это достаточно логично.
Например, главным объектом является Application. Создание этого объекта, другими словами, означает просто запуск Word. Но программа сама по себе никому не интересна, необходимо, чтобы внутри этой программы был создан или открыт некий документ (объект Document). В свою очередь, этот объект содержит целый ряд других элементов иерархии, которые служат для задания его параметров и оформления.
Согласно этому источнику, несмотря на то, что Word содержит множество объектов, по большому счёту, для успешной работы достаточно понимания всего лишь 5 объектов:
- Application
- Document
- Selection
- Range
- Bookmark
Логика здесь следующая:
- мы запустили Word (Application),
- создали или открыли в нём документ(Document),
- дальнейшие манипуляции в этом документе происходят либо с постановкой курсора в определенное место, либо с выделением определённого места в документе(Range).
Последний же объект (Bookmark) имеет смысл изучить для создания удобной навигации по документам, так как он просто управляет созданием удобных закладок.
Каждый из перечисленных выше объектов, имеет свой набор свойств и методов.
Более подробно о их сути вы можете почитать вот здесь.
В свою очередь, наиболее полный список всех объектов, с их описанием вы можете найти вот здесь.
Вкратце, любая программа на Visual Basic представляет собой сочетание приложения (в нашем случае Word), среды разработки и модулей.
Под модулями понимаются процедуры, которые содержат в себе программный код.
Для создания модуля, всего лишь нужно перейти в соответствующий шаблон (например, если мы создаём модуль, который должен быть доступен для всех документов, мы создаём его в шаблоне Normal). Для этого нажимаем на папке Microsoft Word Objects — правой кнопкой мыши и проходим по пути:
Модули могут быть представлены двумя видами:
- подпрограммы
- функции (предназначены для вычисления конкретного значения).
Структура типичной подпрограммы выглядит следующим образом:
Sub имя_подпрограммы ([Параметры])
Тело подпрограммы
End Sub
Структура функции выглядит следующим образом:
Sub имя ([Параметры])
Тело функции
имя=выражение
End Sub
Например, если у нас существует некая функция которая должна возвращать определённое значение, она может выглядеть следующим образом:
Sub TextFinder ([Параметры])
Тело функции
TextFinder=Selection.Find.found
End Sub
На примере тех же самых макросов, если у нас их более 1, они открываются в среде разработки, разделённые на отдельные подпрограммы, располагаясь друг за другом:
Для более полного ознакомления с языком Visual Basic для приложений, следует обратиться к официальному справочнику по языку.
Visual Basic for Applications является объектно-ориентированном языком программирования и полностью поддерживает постулаты этой концепции.
Типичная команда выглядит как разделённая точками в стиле ООП, где мы спускаемся по иерархии в самый низ, — до конкретного действия:
Application.ActiveDocument.PageSetup.Orientation = wdOrientLandscape
Например, приведённая выше команда, служит для того, чтобы установить альбомную ориентацию листа.
В редакторе кода присутствует система автодополнения кода: после того как вы ввели первый уровень объектной модели и поставили после него точку, система сама предлагает вам доступные варианты следующего уровня:
Весьма полезной является и справочная система, встроенная в редактор:
для получения справки необходимо всего лишь поставить курсор на нужную команду или место кода и нажать F1. Такая оперативность получения справки существенно облегчает самостоятельное изучение программирования в этой среде:
Достаточно интересным является режим отладки программы. Для этого, вам необходимо
записать какой-либо макрос, далее, войти в режим его отладки:
В этом режиме вы увидите, что та команда, которая будет выполнена следующей, — окрашена жёлтым цветом. В этом режиме исполнение команд производится построчно, что позволяет отловить ошибку, закравшуюся на каком-либо из этапов.
Для того чтобы исполнить следующую команду, следует каждый раз нажимать на клавишу F8:
Если параллельно с редактором кода вы откроете документ Word, на примере которого вы отрабатываете этот макрос, то вы будете сразу визуально видеть, что делает каждая построчно выполняемая команда (например, если это переход в некую ячейку таблицы и её выделение, — вы будете видеть этот процесс пошагово).
Но тут есть один нюанс: как вы могли видеть выше, программа начинает исполняться с самого начала. Но программа может быть достаточно длинной! Как сделать так, чтобы можно было провести, условно говоря, «юнит-тест» участка программы, который находится не в самом начале?
Для этого нужно всего лишь кликнуть в серую зону слева от программы — и там появится красная метка. Она означает то место, с которого стартует выполнение кода. Теперь, если мы нажмём на F8, — начало исполнения перескочит на эту метку:
Вообще говоря, программирование на VBA может быть достаточно мощной штукой, так как позволяет не только писать некие простые макросы, но даже и создать свой программный продукт, для генерации каких-либо отчётов или форм (и не только). Да, конечно, я сам имею такую слабость, — не желая изучать имеющиеся у продукта инструменты, пытаюсь решить проблему собственными знакомыми костылями (ну, знаю я, например, Java, — значит, буду решать проблему в рамках этого языка, игнорируя встроенные возможности Word). Однако, это не совсем правильный подход, так как «ученье — свет» :-).
Кто к этому так подходит, имеет и неплохие плюшки: совсем недавно на хабре вышла статья «как я с помощью VBA оплатил себе университет», которая наглядно показывает, что программирование на этом языке, в среде Office ещё рано списывать и может быть к этому стоит присмотреться повнимательней.
P.S. Вот мы тут гоняемся за интеллектуальными IDE, модными актуальными языками… А может вот оно, а?
Будет очень интересно почитать в комментах, если кто то из читателей использовал неким интересным образом программирование под word в VBA и какие результаты это дало!
В двух словах изложу свой опыт: приходилось использовать достаточно продвинутые макросы для написания документации по компьютерному железу. Макросы позволяли «одним кликом» форматировать гигантскую таблицу с параметрами (регистры, поля регистров и их описание и т.д.). Форматировать хитро: первую строку выделить, первый столбец — искать в каждой строке диапазон битов регистра, вида [12:0], если найдено — применить стиль; такая же сложная логика форматирования по всей таблице (поиск определённых участков и их оформление. Скажем, таблица на 50 строк форматировалась… Секунд 15-20. Вручную — до бесконечности (в зависимости от лени и загруженности работой). Так что, макросы имеют право на жизнь!
Аннотация: Лекция посвящена описанию практических примеров программирования на VBA для MS Office.
12.1. Групповая обработка файлов
12-01-Групповая обработка файлов.docm — пример к п. 12.1.
12.1.1. Условие
Предположим, у вас есть несколько сотен файлов в формате .docx и . docm. Например, с ними вы работали дома. Очевидно, что дома у вас установлен Office 2007. И вот, приходит время перенести эти материалы на рабочий компьютер. Вы обнаруживаете, что MS Office на рабочем месте так и не обновили, а на вопросы об обновлении отвечают неопределенно. К тому же, некоторые из ваших документов предназначаются для других пользователей с устаревшими версиями Office — поэтому локальная самостоятельная установка конвертера на вашем ПК проблему не решает. А раз так — у вас есть два пути. Первый — заниматься конверсией файлов в формат .doc вручную, и второй — поручить это дело Microsoft Word.
12.1.2. Решение
Добавим в Microsoft Word кнопку, обработчик нажатия которой содержит следующий код (листинг 12.1)
'Переменная для имени очередного файла Dim var_Doc As Variant 'Для хранения ссылки на открытый файл Dim obj_File As Document 'Для формирования нового имени файла Dim str_FileName As String 'Для подсчета количества обработанных файлов Dim var_FileCount 'Для хранения пути к папке с исходными файлами Dim str_In As String 'Папка с выходными файлами Dim str_Out As String 'Инициализируем переменные str_In = "C:Документы" str_Out = "C:ДокументыОбработано" 'Изменяем текущую директорию на заданную ChDir (str_In) 'Ищем первый файл в директории var_Doc = Dir("*.doc?") Do While var_Doc <> "" 'До тех пор, пока есть файлы 'Открываем найденный файл в невидимом окне Set obj_File = _ Documents.Open( _ FileName:=str_In + "" + var_Doc, _ Visible:=False) 'Формируем имя нового файла str_FileName = str_Out + "" + _ Mid(var_Doc, 1, Len(var_Doc) - 4) + _ "doc" 'Сохраняем файл в формате Word 97-2003 obj_File.SaveAs FileName:=str_FileName, _ FileFormat:=wdFormatDocument97 'Закрываем файл obj_File.Close 'Увеличиваем на 1 счетчик файлов var_FileCount = var_FileCount + 1 'Находим следующий подходящий файл в папке var_Doc = Dir() Loop MsgBox ("Обработано" + Str(var_FileCount) + " файлов")
Листинг
12.1.
Групповая обработка файлов
Как видите, алгоритм работы программы выглядит так:
- Найти файл
- Открыть его
- Сохранить в новом формате
- Закрыть
Эти шаги повторяются для каждого из файлов. Конструкции, использованные при решении этой задачи, мы рассматривали выше, поэтому у вас не должно возникнуть сложностей при разборе кода. Обратите внимание на то, что директории, пути к которым использованы в программе, должны быть созданы до ее запуска.
Вы можете доработать эту программу. Например, добавить сюда обработчик ошибок, дать пользователю возможность выбирать места для поиска исходных файлов и сохранения новых и т.д. Когда файл открыт, вы можете обрабатывать его любыми средствами Microsoft Word, то есть эта программа может послужить основой для множества программ, направленных на групповую работу с файлами.
12.2. Копирование материалов нескольких документов в один
12-02-Копирование текстов.docm — пример к п. 12.2.
12.2.1. Условие
Предположим, у вас есть несколько документов, материалы которых вы хотели бы скопировать в новый документ. Ядром этой задачи можно сделать описанную выше программу для конверсии файлов. Но здесь мы поступим по-другому. Предположим, что вы открыли все эти файлы и хотите быстро сбросить их содержимое в новый файл.
12.2.2. Решение
Для решения этой задачи напишем макрос, который должен храниться в глобальном шаблоне. При запуске макроса будет создаваться новый документ, в который будут скопированы материалы всех остальных открытых документов. Эту операцию можно реализовать множеством способов, мы избрали копирование материалов через буфер обмена Windows (листинг 12.2.)
'Переменная для хранения ссылки на 'целевой документ Dim obj_TargetD As Document 'Для хранения ссылки на очередной 'обрабатываемый документ Dim obj_CurDoc As Document Set obj_TargetD = Documents.Add For Each obj_CurDoc In Documents If obj_CurDoc.Name <> _ obj_TargetD.Name Then 'Выделяем содержимое очередного документа obj_CurDoc.Content.Select 'Копируем в буфер обмена Selection.Copy 'Активируем целевой документ obj_TargetD.Activate 'Вставляем в текущую позицию курсора 'материалы из буфера обмена Selection.Paste End If Next
Листинг
12.2.
Добавление материалов различных файлов в один файл
Здесь мы создаем новый документ, в который копируем содержимое остальных открытых документов. Цикл обхода всех объектов коллекции Documents, то есть открытых документов, позволяет получить доступ к каждому открытому документу. Однако, здесь не обойтись без проверки — мы должны обработать все открытые документы кроме того, в который копируем данные. Для этого прежде чем начать обработку, сравниваем имя целевого и текущего документа.
12.3. Разбиение одного документа на несколько
12-03-Разбиение документа.docm — пример к п. 12.3.
12.3.1. Условие
Задача, противоположная предыдущей. Один открытый документ нужно разбить на несколько, руководствуясь каким-либо признаком, после чего сохранить все документы, дав им соответствующие имена, в папку, заданную пользователем.
Разобъем активный документ на части, по 10 абзацев каждая, и сохраним каждую из частей в отдельном документе с именем такого вида:
Имя исходного документа+ "часть №"+номер части.docx
12.3.2. Решение
Напишем макрос (листинг 12.3.), который имеет смысл хранить в глобальном шаблоне. Этот макрос будет работать с активным документом.
'Переменная для хранения ссылки на 'активный документ Dim obj_Doc As Document 'Для ссылки на новый документ Dim obj_NewDoc As Document 'Ссылка на абзац документа Dim obj_Par As Paragraph 'Строка для хранения пути сохранения 'файлов Dim var_Path As String 'Счетчик для подсчета обработанных 'абзацев Dim var_Counter 'Переменная для сборки имен 'новых файлов Dim var_FileName As String 'Переменная для хранения номера 'очередного файла, который используется 'при создании имени файла Dim var_Part 'Записываем 0 в счетчики количества 'абзацев и файлов и инициализируем 'другие переменные var_Counter = 0 var_Part = 0 Set obj_Doc = ActiveDocument var_Path = "C:Документы" 'Цикл для каждого абзаца в документе For Each obj_Par In obj_Doc.Paragraphs 'Если в предыдущем сеансе обработано '10 абзацев - создается новый файл 'для записи в него очередных 10 If var_Counter = 0 Then Set obj_NewDoc = Documents.Add 'Это - номер файла, который будет 'отражен в его имени var_Part = var_Part + 1 End If 'Увеличиваем на 1 счетчик обработанных 'абзацев var_Counter = var_Counter + 1 'Активируем новый документ obj_NewDoc.Activate 'Добавляем в него текст текущего абзаца 'из исходного документа Selection.TypeText (obj_Par.Range.Text) 'Если обработано 10 абзацев If var_Counter = 10 Then 'Сбрасываем счетчик обработанных абзацев var_Counter = 0 'Собираем имя нового файла var_FileName = var_Path + "" + _ obj_Doc.Name + _ " часть № " + Str(var_Part) + ".docx" 'Сохраняем новый файл obj_NewDoc.SaveAs FileName:=var_FileName 'Закрываем его obj_NewDoc.Close 'Очищаем объектную переменную Set obj_NewDoc = Nothing End If Next 'Если в объектной переменной, представляющей 'новый файл, хранится ссылка 'это значит, что исходный файл имеет 'количество абзацев, не кратное 10, 'то есть он не будет сохранен в основном цикле 'сохраняем этот файл If obj_NewDoc Is Nothing = False Then var_FileName = var_Path + "" + _ obj_Doc.Name + _ " часть № " + Str(var_Part) + ".docx" obj_NewDoc.SaveAs FileName:=var_FileName obj_NewDoc.Close Set obj_NewDoc = Nothing End If 'Выводим сообщение об окончании работы MsgBox ("Файл " + obj_Doc.Name + _ " обработан, получено " + _ Str(var_Part) + " файлов, которые" + _ " хранятся в: " + var_Path)
Листинг
12.3.
Разбиваем документ на части
Здесь мы работаем с исходным документом, поабзацно копируя его содержимое в новый документ. В программе использована пара переменных-счетчиков. Одна служит для подсчета количества обработанных абзацев — она используется как индикатор для сохранения или создания очередного файла, а вторая выступает счетчиком номеров созданных файлов и участвует в создании имени файла.
Возможно, у вас есть ощущение, что тема макросов в Ворде достаточно маргинальная. Кто ими может пользоваться-то вообще? Ну, малварь делают иногда… Да и пишутся они на давно забытом VBA (Visual Basic for Applications, он же несколько урезанный Visual Basic 6 в интерпретируемом виде), фу!
Но на самом деле у многих ведь возникает потребность то какой-нибудь отчётик в ворде написать, то курсовую оформить, то резюме перед отправкой в компанию вашей мечты подправить… А у некоторых работа напрямую связана с Word. Часто различные системы документации предлагают экспорт в форматы doc или docx, которые нужны вашим заказчикам. И бывает, что документы после экспорта выглядят фигово, приходится их исправлять.
Работа в ворде нередко подразумевает выполнение каких-то однообразных повторяющихся действий, которые иногда (но далеко не всегда!) решаются грамотной настройкой стилей и их применением, а также использованием шаблонов. Как же автоматизировать всё остальное? Тут-то нам на помощь приходят те самые макросы.
Что же в них такого хорошего? Ну, например, они автоматически и достаточно быстро выполняют за вас однообразные действия. Могут что-то подсчитать, переформатировать документ, пометить аннотациями подозрительные места, — словом, всё, что запрограммируете. Могут даже в режиме реального времени что-то исправлять и о чем-то предупреждать, пока вы пишете документ. VBA в Word позволяет автоматизировать практически все действия, которые вы можете выполнить с документом вручную.
Макросы можно прикрепить как к конкретному документу (в чём для нас мало пользы, а для писателей троянов это единственная опция), так и к самому ворду, что позволяет применять макросы к любому документу, с которым вы работаете.
Макросы работают в любой версии Word и требуют минимум правок при переносе с одной версии на другую (а чаще всего вообще не требуют). На макросах можно даже реализовать полноценный пользовательский интерфейс с формами!
Давайте же занырнём в Visual Basic и напишем что-нибудь полезное! В качестве первого примера я покажу, как сделать макрос, который заменит два и более последовательных перевода строки на единственный. Это часто требуется при исправлении документов после экспорта из систем документации, или если вы хотите удалить случайно проставленные лишние переводы строк в собственноручно написанном документе. Макрос сделаем добротный, с пользовательским интерфейсом и прогрессом выполнения операции.
Чтобы начать писать или использовать макросы, сначала требуется убедиться, что в Word’е отображается панель «Разработчик» («Developer»). Если она у вас не отображается, следует зайти после создания нового документа в меню «Файл» («File») -> «Параметры» («Options») -> «Настроить ленту» («Customize Ribbon»), после чего найти там и установить флажок «Разработчик» («Developer»).
После этого нужно зайти на вкладку «Разработчик» и выбрать меню «Visual Basic».
В открывшемся окне слева вы увидите два проекта: «Normal» и проект, относящийся к текущему открытому документу. Возможно, в проекте «Normal» у вас уже будет какой-то файл в каталоге «Modules». В любом случае, создайте новый модуль, кликнув правой кнопкой по проекту «Normal» и выбрав «Insert» -> «Module».
Созданный модуль представляет из себя файл, куда мы и будем писать код макросов. Можно переименовать модуль (по умолчанию его имя будет «Module1») в окне «Properties» -> «Name». Я назову свой модуль «AllMacros». Теперь откроем код модуля, дважды кликнув по его имени, и приступим к созданию макроса. Напомню, что наша цель — заменить два и более последовательных перевода строки на единственный, произведя замены по всему документу. Очевидно, нам потребуется функция, которая осуществляет поиск по тексту, ведь мы хотим найти несколько последовательных переводов строки. В Word это эквивалентно началу нового параграфа. Вы могли бы осуществить поиск начала нового параграфа через обычное окно поиска, введя в поле поиска ^p
, ^13
или ^013
(что соответствует ASCII-коду перевода строки). Функция поиска будет выглядеть так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Private Function FindNextText(text As String, useWildcards As Boolean) Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = text .Forward = True .Format = False .MatchCase = False .MatchWholeWord = False .MatchKashida = False .MatchDiacritics = False .MatchAlefHamza = False .MatchControl = False .MatchWildcards = useWildcards .MatchSoundsLike = False .MatchAllWordForms = False .Wrap = wdFindStop End With Selection.Find.Execute FindNextText = Selection.Find.Found End Function |
Давайте разберём, что тут происходит. Мы объявляем функцию с двумя параметрами. Первый имеет тип String
— это текст для поиска, а второй Boolean
говорит о том, нужно ли использовать символы подстановки (wildcards). Про них я поговорю позже. В следующих двух строках 2 и 3 мы очищаем форматирование для строки поиска и строки замены, если оно было задано пользователем. Word позволяет задать форматирование строки поиска/замены, а для нашей задачи это не требуется. Далее мы задаём набор параметров для объекта Selection.Find
: выставляем неинтересные нам параметры в False
, параметр Text
— это текст, который мы хотим найти, а параметр MatchWildcards
указывает на использование символов подстановки. Параметр Wrap
говорит о том, следует ли продолжать поиск, когда мы дошли до той точки, с которой поиск начали, и у нас его значение установлено в wdFindStop
, так как мы хотим остановиться, когда дойдём до конца документа, и не зацикливать поиск.
Вообще, всё это обилие свойств и объектов из объектной модели Word, Excel и PowerPoint (да, там тоже есть макросы) хорошо описано в MSDN. Например, вот тут перечислены свойства и методы объекта Find. Есть русская документация (скажем, эта страница), но она выполнена совершенно кринжовым машинным переводом, невозможно читать:
Есть совершенно смехотворные страницы:
В общем, лучше читайте на английском.
Кроме того, все доступные объекты, их свойства и методы можно посмотреть прямо в редакторе VBA в самом Word’е. Для этого нужно нажать F2
или выбрать меню «View» -> «Object browser», что приведет к открытию браузера объектов (Object browser), в котором можно пролистать или поискать то, что вам доступно.
Но вернёмся к нашей функции. На строке 19 мы непосредственно выполняем поиск заданного текста с указанными параметрами. Строка 20 — эта конструкция, аналогичная return
в си-подобных языках, указывает возвращаемое значение функции. Мы возвращаем булевое значение Selection.Find.Found
, которое говорит о том, было ли что-то найдено.
Хочу заметить, что использование объекта Selection.Find
и изменение его свойств заменит их значения и для пользователя. Например, если вы в Word искали что-то хитроумное с конкретно заданными параметрами, то выполнение макроса заменит ваши параметры поиска на те, которые мы задали в макросе. В идеале, их можно запомнить, а потом вернуть, но мы не будем так сильно заморачиваться, а просто всё за собой подчистим. Сделаем функцию, которая сбрасывает параметры в значения по умолчанию:
Private Sub ClearFindAndReplaceParameters() With Selection.Find .ClearFormatting .Replacement.ClearFormatting .Text = «» .Replacement.Text = «» .Forward = True .Wrap = wdFindStop .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With End Sub |
Обратите внимание, что это уже Sub
, а не Function
, потому что мы не хотим из этой процедуры возвращать никакое значение. Это аналог функции void
в си-подобных языках.
Теперь нужно определить, как нам найти два или более последовательных перевода строки. Для этого нам и потребуются упомянутые ранее wildcards. Word поддерживает символы подстановки при поиске, и по своей функциональности они напоминают регулярные выражения. Кстати, вы можете ими пользоваться и без макросов из окна расширенного поиска:
Хорошее описание символов подстановки я нашел здесь, правда, на английском языке. Составим регулярное выражение для поиска двух и более последовательных переводов строки: [^013]{2,}
. Это очень похоже на классическое регулярное выражение Perl или PCRE, но в квадратных скобках в уникальном стиле Word мы задаем символ перевода строки. Фигурные скобки указывают, что символов перевода подряд должно быть два или более. Тут, кстати, есть нюанс: не во всех версиях/локализациях Word такая регулярка заработает. В некоторых случаях вместо запятой потребуется указать точку с запятой (да, в Microsoft иногда делают крайне странные вещи). Чтобы сделать наш макрос более универсальным, напишем функцию, которая вернёт регулярное выражение, пригодное для поиска в той версии Word, в которой эту функцию запустили:
Private Function GetLineBreakSearchRegExp() On Error GoTo Err FindNextText «[^013]{2,}», True GetLineBreakSearchRegExp = «[^013]{2,}» Exit Function Err: GetLineBreakSearchRegExp = «[^013]{2;}» End Function |
Здесь мы сначала пытаемся осуществить поиск с помощью wildcard’а [^013]{2,}
. Если всё окей, то вернём из функции этот самый wildcard как рабочий (строка 4). В противном случае произойдёт ошибка, но мы готовы её обработать: мы установили обработчик всех ошибок в строке 2. Нас перекинет на метку Err
, и тут мы вернём wildcard, который пригоден для других ревизий Word (в котором запятая внутри фигурных скобок заменена на точку с запятой).
Далее напишем функцию, которая будет заменять несколько последовательных переводов строки на единственный:
Private Sub RemoveNextEnters() Selection.MoveStart wdWord, 1 If Selection.Range.Start <> Selection.Range.End Then Selection.Delete End Sub |
Эта функция подразумевает, что вызывать её будут тогда, когда объект Selection
указывает на найденные несколько переводов строки. В строке 2 перемещаем начало выделения (а в выделены у нас будут все найденные последовательные переводы строки) на один символ вперед, а затем в строке 3, если начало выделения не совпадает с его концом, удаляем его содержимое. Таким образом, если было выделено три перевода строки, мы отступаем вперед на 1 символ (оставляя один перевод строки нетронутым), а затем удаляем оставшиеся два.
Осталось написать последнюю функцию, которая будет всем управлять.
Sub RemoveExcessiveEnters() Dim lineBreakSearchRegExp As String lineBreakSearchRegExp = GetLineBreakSearchRegExp() Selection.HomeKey Unit:=wdStory While FindNextText(lineBreakSearchRegExp, True) = True RemoveNextEnters Wend ClearFindAndReplaceParameters End Sub |
Здесь мы оперируем ранее написанными функциями. Сначала получаем текст регулярного выражения (wildcard’а) для поиска нескольких переводов строки подряд, затем вызовом HomeKey
в строке 5 переходим в самое начало документа (перемещаем туда курсор), а затем в цикле ищем все интересующие нас места и удаляем излишние переводы строки. В конце сбрасываем параметры поиска на значения по умолчанию.
Вот и всё, макрос можно запускать! Обратите внимание, что все функции, кроме последней, мы пометили Private
. Мы не хотим, чтобы их вызывали напрямую. Доступной для вызова снаружи будет только функция RemoveExcessiveEnters
. Перед запуском макроса стоит убедиться, что макросы включены. Если вылазит такая панель, то нужно нажать «Включить содержимое» («Enable content»):
Если такой панели нет, то можно зайти в меню «Файл» («File») -> «Сведения» («Info») и включить макросы уже оттуда:
Вы можете включить макросы на время одного сеанса Word (это по умолчанию и происходит, если нажимаете «Включить содержимое»), так что после перезапуска Word макросы снова будут отключены. Для запуска макроса возвращаемся в Word на панель «Разработчик» и нажимаем кнопку «Макросы» («Macros»), выбираем наш макрос RemoveExcessiveEnters
и нажимаем «Выполнить» («Run»). Разумеется, у вас должен быть открыт какой-нибудь подопытный документ, где имеются лишние переводы строк. В качестве бонуса наш макрос ещё и удалит пустые элементы списков, потому что они представляют из себя точно такие же несколько переводов строки подряд.
Макрос выполняется достаточно быстро. Его действие можно отменить (каждый шаг независимо), открыв меню выполненных действий:
Макросы можно отлаживать через окно VBA, в котором мы писали макрос. Кликнув слева от строки кода, можно, как и в других средах разработки, поставить точку останова, а потом запустить макрос кнопкой «Run». Запустится та функция, на которой у вас находится курсор. Если вы поставите курсор на функцию с параметрами, то появится обычный запрос на выбор макроса для запуска, как при нажатии на кнопку «Макросы» в Word.
Думаю, что материала для одной статьи уже вполне достаточно. Я, конечно, пообещал горы функционала в виде интерфейса пользователя, отслеживания прогресса выполнения, и всё это обязательно будет, но в следующей публикации.
Код макроса можно скачать тут. Вы сможете его импортировать к себе в Word, кликнув правой кнопкой на «Normal» -> «Import file…» и выбрав загруженный файл.
P.S. Кстати, рекомендую создавать бэкапы своих макросов, экспортируя их куда-нибудь на диск. Даже лицензионный Word имеет свойство их иногда по какой-то причине удалять из шаблона Normal, в котором мы их создавали.
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…