Использование vba при решении задач в Word. Создание приложений VBA в Word, типичные ситуации

Эта книга поможет освоить интегрированную среду разработки VBA и научиться программировать в VBA с использование объектов, их свойств, методов и событий. Обсуждаемые приемы программирования иллюстрируются примерами, которые можно сразу же опробовать на практике. Полученные знания вы сможете применить как для настройки и усовершенствования популярный офисных приложений, включая приложения Office XP, так и для создания собственных приложений.

Книга рассчитана на тех, кто собирается быстро и без лишних усилий научиться программировать для Windows, используя VBA.

Книга:

Работа с текстом в Word VBA

Работа с текстом в Word VBA

Объекты Range и Selection являются отправными точками для практически любых операций, которые вы сможете выполнять с текстом с помощью Word VBA. Некоторые из этих действий можно применять к документам в целом, но в общем случае вам необходим диапазон или выделенная область, прежде чем вносить изменения.

У объектов Range и Selection достаточно много общего, но есть и несколько ключевых отличий. Оба объекта представляют непрерывные последовательности символов, над которыми вы сможете выполнять различные операции. Оба объекта имеют много общих свойств и методов. Однако некоторые свойства и методы уникальны для выделенных областей, а другие - для диапазонов. Значительные различия состоят и в том, что объект Selection соответствует выделению в области окна: тексту, графическому изображению или любому другому объекту, в то время как объекты Range существуют независимо от выделенной области и всегда содержат текст.

Используйте объект Selection в том случае, если ваша процедура зависит от пользователя, например, он должен указать текст, с которым будут проведены определенные действия, или в том случае, если вам необходимо показать пользователю, какой именно текст будет изменен. В других ситуациях намного лучше подходят объекты Range. Они обеспечивают большую скорость выполнения программ и меньше отпугивают пользователя: Word обновляет содержимое экрана при каждом изменении содержимого выделенной области, а при изменении диапазона содержимое экрана не обновляется. Кроме того, изменения диапазонов не отражаются на выделенных областях, созданных пользователем.

Несмотря на их различия, объекты Selection и Range можно создавать один из другого. Эта возможность оказывается чрезвычайно важной, так как многие функции редактирования работают только с диапазонами. В противоположность этому, единственный способ отобразить содержимое диапазона пользователю- выделить его. Используйте следующие простые приемы.

* Для выделения диапазона используется его метод Select. Например, для объекта RangeR команда имеет вид RangeR. Select.

* Для получения доступа к диапазону, представляющему то же содержимое, что и выделенная область, используется свойство Range.

Помните: если метод, относящийся к текстовым данным, вызывается для диапазона, а вы хотите применить его к выделенной области, просто включите в свой код инструкцию Selection . Range . ИмяМетода.

Word VBA предлагает целый ряд методов для перемещения и изменения размеров диапазонов и выделенных областей. В настоящем разделе я рассматриваю только самые важные из них; для знакомства с другими методами вам придется обращаться к справочной системе.

Метод Expand увеличивает существующий диапазон или выделенную область, добавляя блок текста в их конец. Блок может представлять собой символ, слово, абзац или что-нибудь другое. Вы можете добавить только один заранее определенный блок; кроме того, добавление подобных блоков в начале диапазона или выделенной области не допускается.

Для добавления к выделенной области слова, которое будет следовать сразу за ней, используйте такую инструкцию:

Selection.Expand(wdWord)

Вы можете использовать любую из следующих констант для расширения объекта; wdCharct er, wdWord, wdSent ence, wdParagraph, wdSection, wdStory, wdCell, wdColumn, wdRow, wdTable и (только для объектов Selection) wdLine. По умолчанию используется константа wdWord.

Теперь нам следует остановиться на одном щекотливом моменте: объекты Selection (но не диапазоны) также содержат метод Expand. Этот метод включает соответствующее средство Word, которое позволяет расширять выделенную область при перемещении указателя мыши. Каждый раз, когда программа вызывает метод Extend, выделенная область увеличивается на блок текста, который следует сразу за точкой вставки: текущее слово, предложение, абзац, выделенный фрагмент пли целый документ. Если вы указали аргумент в виде одного символа, например, Selection.Expand ("С"). выделенная область будет расширена вплоть до первого встретившегося указанного символа.

Word VBA позволяет вам повторно определять начало и конец диапазона или выделенной области. Только имейте в виду, что методы, в имени которых присутствует слово Move, изменяют расположение диапазона или выделенной области: они не перемещают текст, который содержится в указанном объекте.

Метод Move изменяет диапазон или выделенную область, начиная с их сжатия, отмечая их расположение, а в них уже нет никакого текста. Расположение совпадает с началом исходного объекта. После этого метод Move перемещает "сжатый" объект в соответствии с вашими инструкциями. По окончании перемещения вы можете использовать методы Expand и Mover,nd для наполнения объекта текстом.

Приведенный ниже пример перемещает именованный диапазон в документе на два абзаца назад. Обратите внимание на то, что вы используете именованную константу в качестве значения аргумента Uni t (список всех допустимых именованных констант приведен в разделе

"Расширение диапазонов и выделенных областей" раньше в этой главе). Аргумент Count представляет собой целое положительное число, если вы хотите перемешать объект вперед по документу (т.е. к его концу), или отрицательное, если вы хотите перемещать объект назад по документу. В приведенном ниже примере аргументы не заключены в скобки, поскольку возвращенное методом значение (количество перемещенных элементов) здесь не используется:

oTheRange .Move Unit: = waParagraph, Count, : = -2

Методы MoveStart. и MoveEnd работают практически так же, как и метод Move, только они изменяют начальную или конечную точку диапазона или выделенной области соответственно. Приведенная ниже инструкция перемешает начало выделенной области на три слова ближе к концу документа:

Select-on.KoveStart Unit: = wdWord, Count:= 3

Обратите внимание на то, что если вы перемещаете начальную точку объекта в конец, Word сожмет диапазон или выделенную область и переместит их в соответствии с указанными инструкциями.

Еще одна пара методов, Start Of или EndOf, перемешает или расширяет начало или конец диапазона или выделенной области. Метод Start Of перемещает начало объекта обратно к началу текущего блока, в то время как метод EndOt перемешает конец объекта вперед к концу текущего блока.

Вы можете использовать аргумент Extend с любым методом для контроля над действиями Word. Если перемешаемая сторона объекта уже находится с того края, к которому вы пытаетесь ее переместить, ничею не происходит. Используйте константу wdMove для сжимания объекта или константу wdExtend для перемещения только указанной стороны. Ниже приведен соответствующий пример:

Selection. Start Of Unit:= wdSentence, Extend:= wdMove

Очень часто вам необходимо сжать диапазон или выделенную область в точку, которая не содержит никакого текста. С технической точки зрения свернутые диапазон или выделенная область - это такие диапазон или выделенная область, начальная и конечная точки которых совпадают. Сжатие подобных объектов оказывается важным в тех ситуациях, когда вам необходимо вставить поле, таблицу или другой элемент до или после выделенной области или диапазона, обойдясь без замены текста. (Вы можете вставить обычный текст, новые абзацы, а также некоторые другие элементы в "несжатые" диапазон или выделенную область).

Используйте метод Collapse для сжатия диапазона или выделенной области. Вы можете сжать объект к его начальной или конечной точке, используя необязательный аргумент Direction. Приведенная ниже инструкция сжимает выделенную область к ее начальной точке:

Selection.Collapse

А этот пример сжимает выделенную область к ее конечной точке:

Selection.Collapse(Direction:=wdCollapseEnd)

Если вы сожмете диапазон, который заканчивается знаком абзаца, к его конечной точке (используя константу wdCollapseEnd), Word разместит сжатый диапазон после знака абзаца (это означает, что сжатый диапазон будет находиться в следующем абзаце). Если же вы хотите разместить что-то перед знаком абзаца исходного диапазона, вы должны сначала переместить диапазон обратно с помощью метода MoveEnd, используя инструкцию, подобную этой:

Диапазон.MoveEnd Unit:= wdCharacter, Count:= -1

Удалить весь текст в диапазоне или выделенной области совсем несложно: просто используйте метод Delete соответствующего объекта. Вы можете использовать и метод Cut, если хотите удалить текст и поместить его в буфер обмена. Конечно же, метод Сору копирует текст в буфер обмена, не оказав влияния на текст в диапазоне или выделенной области.

Вы можете вставить текст, раньше помещенный в буфер обмена, в любой диапазон или выделенную область, воспользовавшись методом Paste этого объекта. Если объект назначения еще не сжат, вставленный текст просто заменит исходный текст в объекте, точно так же как это происходит после выполнения команды Вставить в Word.

Хотя использование буфера обмена для передачи текста из одного места в другое кажется вполне привычным, этот метод не всегда оказывается самым эффективным. Намного удобнее использовать свойства Text или FormattedText диапазона или выделенной области. Залайте эти свойства равными диапазону или выделенной области, содержащим текст, который вы хотите передать, и все. Объект назначения должен быть сжат до тех пор, пока передаваемый текст не должен будет заменить существующий текст в объекте.

Приведенный ниже фрагмент кода передает текст из выделенной области в сжатый диапазон, привязанный к закладке (операцию передачи проделывает четвертая строка кода). В новое место расположения попадает только сам текст; любое форматирование при этом теряется:

With ActiveDocument.Bookmarks("TheBookmark")

ActiveDocument.Range(Start:=.Start, End=.Start)

RangeY.Text = Selection.Text

Для передачи вместе с текстом и его форматирования просто замените свойство Text свойством FormattedText.

Простейшим для запоминания приемом добавления текста является задание свойства Text диапазона или выделенной области равным тексту, который вы решили вставить. Это проиллюстрировано на примере, показанном ниже:

Range2.Text = "Эй, эй! А ведь дома-то никого нет!"

Просто запомните, что использование свойства Text приводит к замене любого существующего в объекте. Во избежание этого (если только вы действительно не хотите заменить существующий текст), сначала сожмите объект.

Используйте методы Insert Before или Insert After объектов Range или Selection для вставки текста в определенном месте документа, не затрагивая при этом существующий текст. Эти методы позволяют вставить новый текст непосредственно перед или после указанного объекта соответственно. Word включает вставленный текст в выделенную область или диапазон.

При использовании любого из методов единственным аргументом является текст, который вы хотите вставить. Приведенный ниже фрагмент кода вставляет новый абзац, содержащий слова Dairy Entry в начало выделенной области (обратите внимание на использование такой константы VBA, как vbCr, для добавления знака абзаца). После этого в конец добавляется новый абзац, который начинается с текущей даты. Если вы выделили целый абзац до выполнения этого кода, абзац, содержащий текущую дату, появится после знака абзаца в выделенной области.

Определение 1

Microsoft Office – одна из самых популярных программных систем, используемых во всем мире.

Трудно найти компьютер, на котором не был бы установлен текстовый редактор Word. Представляя собой систему приложений, тесно связанных друг с другом, MS Office открывает перед своими пользователями самый широкий спектр возможностей.

Мощнейшим средством создания приложений в MS Office стал язык Visual Basic for Application (VBA). Он пришел на смену языкам макропрограммирования, которые обычно включались в приложения.

Определение 2

VBA - высокоэффективное средство разработки приложений, поскольку принадлежит к объектно-ориентированным языкам программирования и обладает простотой макроязыков. Начинающие программировать в офисных пакетах пользователи могут записать свои действия с помощью макрорекордера и создавать макросы без изучения особенностей языка. Такая запись действий, а затем просмотр записанного кода являются простейшим способом для самостоятельного изучения VBA.

Замечание 1

Сейчас с помощью VBA можно легко и быстро создавать различные приложения, используя единую для всех офисных программ среду и язык. Разработчикам приложений очень пригодятся дополнительные возможности и средства VBA для управления пользовательским интерфейсом, оперирования событиями, обработки ошибок и другие средства, которые позволят создавать эффективные приложения с дружеским интерфейсом.

Остановимся на вопросах разработки VBA-приложений для MS Word. С помощью VBA вы можете автоматизировать любые операции, выполняемые в Word интерактивно (то есть вручную): создание документов, добавление в них текста или других графических элементов, форматирование, редактирование, сохранение и т.д. VBA выполнит все эти операции быстрее, точнее и с меньшими затратами, чем человек.

В MS Word создается много документов типа справка, расписка, докладная записка и так далее. Эти документы имеют постоянную и переменную части. Создание таких документов можно упростить, используя язык программирования VBA.

Создание текстового документа

Рассмотрим пример создания справки в MS Word 2007.

Создадим документ Word и сохраним его с именем spravka.docx.

Замечание 2

В случае отсутствия на ленте вкладки Разработчик создайте её с помощью команды - Параметры Word-Личная настройка. В группе Основные параметры работы с Word установите флажок в пункте Показать вкладку Разработчик на ленте.

Создать макрос1 с помощью макрорекордера. Макрос1 создает текст документа «СПРАВКА»:

  • выполнить команду Разработка, Макрос, Запись макроса;
  • в поле Имя макроса оставить Макрос1. В поле Макрос доступен для: выбрать имя данного документа spravka.docx. Нажать кнопку ОК;
  • набрать текст документа «СПРАВКА» с нужными параметрами абзаца и шрифта;
  • остановить запись макроса кнопкой Останов в закладке Код-Разработчик.

Проверить работу макроса запустив его на исполнение командой: Разработчик, Макросы, Макрос1, Выполнить.

Текст документа:

Создадим Макрос2 с помощью макрорекордера. Макрос2 выполняет очистку содержимого документа (Выделить все ${Ctrl+A}$, клавиша Delete).

Создадим панель быстрого доступа для spravka.docx с кнопками для запуска макросов.

Для этого необходимо:

  • выбрать пункт меню Параметры Word-Настройка;
  • в окне Настройка панели быстрого доступа и сочетаний клавиш на вкладке Выбрать команду из выбрать пункт Макросы, а на вкладке Настройка панели быстрого доступа выбрать пункт Для Spravka;
  • в том же диалоговом окне команд Макросы выделить команду Макрос1 и добавить в панель быстрого доступа для документа Spravka. Аналогично добавить команду Макрос2;
  • изменить надпись или значок на кнопке, назначенной макросу Изменить…, изменить кнопку и отображаемое имя (например, Справка), выбрать новый значок для кнопки, несколько изменить его и назначить макрос (Макрос1) этой кнопке;
  • аналогично изменить надпись и кнопку для вызова еще одного макроса (Макрос2), например Очистка документа.

Выполнить макросы, используя кнопки панели быстрого доступа для Spravka.

Для выхода из Word выберите из меню Выход из Word.

Использование VBA при решении задач в Word

VBA поддерживает набор объектов, соответствующих элементам Word. Используя свойства и методы этих объектов можно автоматизировать все операции в Word. Однако целесообразно автоматизировать выполнение тех операций, для реализации которых нет стандартных средств в Word или их выполнение стандартными средствами является трудоемкой или рутинной работой. Рассмотрим наиболее важные объекты.

Объект Document представляет собой новый или созданный ранее открытый документ.

Основными свойствами объекта Document являются:

  • Count - количество открытых в данный момент документов;
  • ActiveDocument - активный документ.

Некоторые методы объекта Document и коллекции Documents:

  • Open - открывает файл, содержащий существующий документ и автоматически добавляет его в коллекцию;
  • Add - добавляет новый пустой документ;
  • Save - сохраняет изменения в существующем документе без закрытия;
  • Save As (только для объекта) - сохраняет активный вновь созданный документ в текущей папке;
  • Item - позволяет получить доступ к элементу коллекции;
  • Activate (только для объекта) - активизирует открытый документ;
  • PrintOut (только для объекта) - печать документа;
  • Close - закрывает документ.

Объекты Character (символ), Word (слово), Sentence (предложение), Paragraph (абзац), Section (раздел документа) задают структуризацию текста документа.

Все эти объекты имеют свойства:

  • Count - свойство возвращает количество элементов в коллекции;
  • First - свойство возвращает объект, являющийся первым элементом коллекции;
  • Last - свойство возвращает объект, являющийся последним элементом.

Коллекции Characters, Words, Sentences имеют единственный метод Item(Index).

Коллекция Paragraphs имеет все вышеперечисленные для данной группы коллекций свойства и множество свойств, значения которых определяют формат абзаца.

Формат абзаца может быть определен и с помощью методов. Приведем некоторые методы коллекции Paragraphs:

  • Item - определяет элемент коллекции;
  • Add - добавляет новый пустой абзац (параметр метода указывает точку вставки, задается объектом Range);
  • InsertParagraph, InsertParagraphAfter, InsertParagraphBefore - осуществляют вставку пустого абзаца вместо текста или после, или перед текстом, задаваемым объектом Selection или Range;
  • Reset - удаляет форматирование, сделанное вручную, применяя к абзацу формат, заданный стилем абзаца;
  • Indent, Outdent - увеличивают, уменьшают отступ абзаца от края листа;
  • TabHangingIndent(Count), TabIndent(Count) - увеличивают (Count>0), уменьшают (Count
  • Space1, Space2, Space15 - устанавливают межстрочный интервал (одинарный, двойной, полуторный).

Объекты Range (диапазон) и Selection (выделение) представляют части документа.

Определение 3

Объект Range позволяет задать произвольный диапазон, представляющий собой последовательность индексированных элементов и может быть получен через метод Range или свойство Range других объектов.

Свойствами объекта Range являются:

  • Start - начальная символьная позиция диапазона;
  • End - конечная символьная позиция диапазона;
  • Text - позволяет получить или изменить содержимое объекта.

Определение 4

Объект Selection задает выделенную в документе область (фрагмент). Выделенный в документе фрагмент задает непрерывную область элементов, но не является диапазоном, заданным своим началом и концом. Выделить можно только один фрагмент, поэтому один объект Selection может быть активен в данный момент времени, он может быть получен с помощью свойства Selection или метода Select других объектов.

Ниже приведены некоторые методы присущие объектам Selection и Range:

  • Move - метод перемещения точки вставки;
  • MoveStart, MoveEND - методы изменения значения свойств Start и End;
  • Collapse - сворачивает диапазон к его началу или концу;
  • Next - метод получения ссылки на очередной элемент коллекции объектов в диапазоне или выделенном фрагменте;
  • Delete - удаляет текст, входящий в диапазон;
  • InsertAfter , InsertBefore вставляет текст до или после текста, входящего в диапазон.
  • Copy - копирует объект в буфер обмена;
  • Cut - перемещает объект в буфер обмена;
  • Paste - позволяет поместить содержимое буфера в область, заданную объектом Range или Selection.

10. Программирование в Word

10.1 Зачем программировать в Word

Создание приложений VBA в Word, типичные ситуации

Word - старейшее и самое популярное приложение, входящее в состав Microsoft Office. В большинстве организаций пользователи готовят документы именно в Word.

С точки зрения программирования Word - это прежде всего средство для изготовления отчетов к базам данных. При этом отчет - это любой документ, который формируется на основе информации из базы данных, например, договор, акт приемки-передачи, приходный кассовый ордер, объявление на взнос наличными, распоряжение в бухгалтерию, накладная и т.п. Конечно же, к отчетам, которые можно формировать в Word, относятся и документы со сводными данными - отчеты за период, ведомости и т.п.

Автору приходилось создавать приложения с отчетами, разработанными в самых разных программных продуктах - Microsoft Access, Crystal Reports, Microsoft Reporting Services и т.п. Если ваше приложение генерирует отчеты к базам данных в Microsoft Word, то, скорее всего, такие отчеты будут не самыми быстрыми с точки зрения их формирования и не самыми простыми с точки зрения программирования. Зато совершенно точно они будут самыми дружелюбными по отношению к конечному пользователю. Почему?

Очень часто на предприятии возникает необходимость исправить в форме отчета всего пару строк - например, вместо "Директор" поставить "И.О. Директора". Если отчет создан в Crystal Reports или Microsoft Reporting Services, придется срочно обращаться к разработчику. А через какое-то время И.О. утвердят в должности директора, и разработчику придется править отчет снова.

Если же отчет изначально создается в документе Word, то пользователь всегда может сам внести в созданный документ необходимые изменения - подавляющее большинство пользователей на предприятии умеют работать в Word. Срочно разыскивать разработчика уже не нужно.

У изготовления отчетов в Word есть и другие преимущества. Как правило, при изготовлении отчетов в Word значения из базы данных подставляются в шаблон отчета, который хранится в базе данных или файловой системе (в файле *.dot). Если формат отчета сложный, с большим количеством специфического оформления (пример - объявление на взнос наличными), то намного проще подготовить его шаблон в Word, чем, к примеру, в Crystal Reports или Reporting Services.

Еще одно программное применение Word - работа с разными форматами документов. Word умеет работать с документами самых разных форматов. Эти его возможности вполне можно применить для массовой обработки документов.

Случай из практики: в каталоге на диске у нас собралось несколько сотен "разнокалиберных" документов разных пользователей. Часть из них создана в Word разных версий, часть - просто текстовые файлы, некоторые документы в - форматах HTML, XML или EML (сообщения электронной почты). На предприятии внедрена система документооборота на основе SharePoint Portal Server и нам необходимо привести все эти документы к единому формату (Word 2003) и загрузить их на SharePoint Portal Server. Конечно же, без автоматизации в такой ситуации возиться придется очень долго.

Третье программное применение Word - форматирование документов, например, программное применение стилей, поиск и замена участков текста сразу во многих документах, работа со структурой документа и т.п. Обычно такие задачи ставятся в издательствах, например, при подготовке рукописей.

На странице документа Word можно организовать работу с доста- точно сложной программой, даже не создавая для этого отдельных Win- dows-форм, запускающихся, например, при открытии документа или при нажатии на кнопку на странице документа, а просто разместив на нем поля ввода данных и показывая программно на той же странице результаты по- сле изменения данных.

Однако, многие математические расчеты проще выполнить в системе Excel, при хранении информации в базах данных очень большие возмож- ности обработки этой информации имеет Access. При работе с базами дан- ных в крупных информационных системах может быть предусмотрено формирование отчетов с выводом их в Word или Excel, при этом разработ- ку таких программ может выполнить лишь специалист, хорошо знакомый как с архитектурой базы данных информационной системы, так и с языком VBA.

Некоторые принципы работы с объектами Word можно освоить, если записать некоторую последовательность своих действий с помощью сред- ства Word Запись макроса, которое присутствует на вкладке ленты Разра- ботчик. Данная вкладка присутствует, если в Параметрах Word на стра- нице Основные стоит галочка у пункта Показывать вкладку Разработчик на ленте.

Выполним следующие действия:

1) нажмем на кнопку Запись макроса, ни кнопку, ни клавиши макросу можно не назначать, зададим, где будет сохраняться текст макроса: Макрос доступен для текущего документа;

2) переместимся в конец документа с текущей позиции (была не в конце), нажав клавиши Ctrl+End;

3) нажмем клавишу Enter и напишем слово «Привет!»;

4) еще раз повторим операцию пункта 3;

5) выделим последнее слово, нажав Shift+Home и нажмем клавишу Delete;

6) перейдем в начало первой строки «Привет!», нажмем Shift+End и затем клавишу Delete;

7) на вкладке Разработчик сначала нажмем кнопку Остановить запись, затем кнопку Visual Basic;

8) в открывшемся окне редактора Visual Basic слева на панели Project сделаем двойной щелчок мышкой на разделе Progect() - Modules - NewMacros и увидим справа окно с текстом программы на языке VBA, которое показано на рисунке 5.43.

При сохранении документа, в котором присутствуют программные модули, в системе Microsoft Office 2007 следует выбрать тип файла Доку- мент Word с поддержкой макросов, иначе текст программ не будет сохра- нен.

В тексте макроса на рисунке 5.43 Selection - один из основных объ- ектов, которые содержит главный объект Application - приложение Word.

Рисунок 5.43. Текст макроса на языке VBA


При написании текста программ можно использовать всплывающий список свойств и методов, который появляется для стандартных объектов в редакторе Visual Basic после написания имени объекта и нажатия после неё точки (см. рисунок 5.44), полное описание свойств и методов объектов присутствует в справочной системе.

Всплывающий список свойств и методов можно получить также, на- жав комбинацию клавиш Ctrl+пробел.


Кроме того, при написании текста программы для стандартный про- цедур и функций появляются всплывающие подсказки по их синтаксису (см. рисунок 5.45).

МsgВоА(Рrотрt [ШстеЛз VbМsgВохStуlе = vbОКОпlу], }