Начало работы с VBA в Word 2010

Сводка: статья предназначена для программистов-новичков и посвящена расширению возможностей Microsoft Word 2010 с помощью программ на Visual Basic для приложений (VBA). В статье приведены общие сведения о языке VBA, инструкции по работе с VBA в Word 2010, подробное решение реальной задачи по программированию на VBA в Word и советы по программированию и отладке.

Дата последнего изменения: 11 мая 2015 г.

Применимо к: Office 2010 | Open XML | Visual Studio Tools for Microsoft Office | Word 2007 | Word 2010

В этой статье
Что такое макросы, зачем они нужны и как их создавать?
Часть 2. Написание более сложных макросов
Заключение
Дополнительные материалы
Об авторе

Дата публикации: апрель 2010 г.

Автор: Шона Келли (Shauna Kelly)

Содержание

  • Часть 1. Пример макроса для решения конкретной задачи

  • Часть 2. Написание более сложных макросов

  • Заключение

  • Дополнительные материалы

  • Об авторе

Что такое макросы, зачем они нужны и как их создавать?

Макрос позволяет поставить Word на автопилот.

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

В данной статье предполагается, что читатель является опытным пользователем Word. Также предполагается, что читатель абсолютно не знаком с программированием или разработкой программного обеспечения.

Статья разбита на две части.

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

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

Часть 1. Пример макроса для решения конкретной задачи

Одна из целей создания макросов — выполнение задач одним щелчком мыши или одним нажатием клавиши.

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

Рис. 1. Переход по гиперссылке с помощью клавиши CTRL и щелчка мыши

Вариант по умолчанию для перехода по гиперссылке

На приведенном ниже рисунке показан альтернативный способ перехода по гиперссылке простым щелчком мыши.

Рис. 2. Переход по гиперссылке простым щелчком мыши

Альтернативный вариант перехода по гиперссылке

Иногда удобен способ по умолчанию, а иногда я предпочитаю переходить по ссылкам простым щелчком мыши (рис. 2). Мне приходится настраивать этот параметр несколько раз в день. Для этого необходимо нажать кнопку Файл, а в разделе Справка — кнопку Параметры. В диалоговом окне Параметры Word необходимо перейти в раздел Дополнительно, после чего в разделе Параметры правки нужно установить (или снять) флажок CTRL + щелчок для выбора гиперссылки и нажать кнопку ОК. Необходимость постоянного выполнения этой последовательности щелчков раздражает. Хотелось настраивать этот параметр одним щелчком мыши.

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

  • Создание файла шаблона Word с поддержкой макросов (DOTM) для сохранения макроса в папке автозагрузки Word.

  • Запуск редактора Visual Basic, входящего в состав Word.

  • Написание макроса в редакторе Visual Basic.

  • Тестирование макроса.

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

  • Назначение сочетания клавиш для запуска макроса.

  • Сохранение файла, его загрузка в качестве надстройки и, если необходимо, передача файла коллеге либо перенос файла на другой компьютер.

В данном разделе рассматривается каждая из перечисленных выше задач.

Создание файла, где будет храниться макрос

Перед написанием макроса подумайте, как и где он будет храниться.

Приложение Word позволяет сохранять макросы в двух форматах Word: документ Word с поддержкой макросов (DOCM-файл) и шаблон Word с поддержкой макросов (DOTM-файл). Сохранять макросы в документе не рекомендуется. Макросы обычно хранятся в шаблонах Word с поддержкой макросов (DOTM-файлах).

Макросы также можно сохранять в шаблоне Normal (Normal.dotm), однако при этом возникают трудности с их упорядочиванием и совместным использованием. Обычно лучше создать собственный файл и сохранить макросы в нем.

Место сохранения файла шаблона зависит от того, как будут использоваться макросы. Необходимо решить, будут ли макросы использоваться со всеми документами или только с некоторыми.

Например, можно создать шаблон для ежемесячных отчетов о продажах и написать макросы для их форматирования. В этом случае файл шаблона необходимо сохранить в папке "Шаблоны пользователя" и использовать этот шаблон для создания новых документов. (Чтобы узнать, где находится папка "Шаблоны пользователя", откройте вкладку Файл и нажмите кнопку Параметры. В диалоговом окне Параметры Word перейдите в раздел Дополнительно и нажмите кнопку Расположение файлов.) Если макрос хранится в шаблоне, то этот макрос будет доступен только документам, к которым прикреплен соответствующий шаблон. Другие документы этот макрос "не видит".

В этой статье описывается создание макросов, которые можно использовать в любом документе. Для этого необходимо создать файл шаблона с поддержкой макросов. Закройте все открытые файлы Word. Чтобы создать файл для хранения макросов, нажмите кнопку Файл, затем — кнопку Создать и выберите пункт Мои шаблоны. В диалоговом окне Создание выберите параметр Шаблон и нажмите кнопку ОК. Сохраните файл в папке автозагрузки Word как шаблон с поддержкой макросов под именем MyWordTools.dotm. (Чтобы узнать, где находится папка автозагрузки Word, откройте вкладку Файл и нажмите кнопку Параметры. В диалоговом окне Параметры Word перейдите в раздел Дополнительно и нажмите кнопку Расположение файлов.)

Работа в редакторе Visual Basic

Макросы для Word пишутся на языке программирования Visual Basic для приложений (VBA).

Макросы создаются в компоненте Word, который большинство пользователей никогда не видят, — в редакторе Visual Basic (VBE). Открыть редактор Visual Basic можно одним из указанных ниже способов.

  • Нажмите сочетание клавиш ALT + F11

  • Нажмите кнопку Visual Basic на вкладке Разработчик. Для этого откройте вкладку Файл и нажмите кнопку Параметры. В диалоговом окне Параметры Word нажмите кнопку Настройка ленты. В правой части диалогового окна выберите вкладку Разработчик. Нажмите кнопку ОК, чтобы вернуться к документу, а затем нажмите на вкладке Разработчик кнопку Visual Basic.

  • Добавление команды Visual Basic на панель быстрого доступа.

Перед тем как приступить к работе с редактором Visual Basic, выберите в меню Сервис пункт Параметры. В диалоговом окне Параметры установите на вкладке Редактор все флажки.

В левом верхнем углу редактора Visual Basic расположено Окно проекта. В нем отображаются все файлы, открытые в Word в настоящий момент. Там должны отображаться файлы Normal (соответствующий шаблону Normal.dotm) и MyWordTools (только что созданный файл).

На приведенном ниже рисунке показан проект MyWordTools в окне проекта редактора Visual Basic.

Рис. 3. Окно проекта редактора Visual Basic

Обозреватель проектов редактора Visual Basic

В файле макросы хранятся в виде модулей. Чтобы добавить в файл модуль, выберите в окне проекта файл MyWordTools (рис. 3). В меню Вставка выберите пункт Модуль. После добавлении модуля в файл этот модуль появится в окне проекта и в расположенном под ним окне свойств (рис. 4). В окне свойств модуль можно переименовать. Оставьте имя по умолчанию Модуль1.

На приведенном ниже рисунке показан Модуль1 в окне проекта редактора Visual Basic.

Рис. 4. Окно проекта редактора Visual Basic

Окно свойств редактора Visual Basic

Наконец, вы увидите, что запись для вашего файла называется ПроектШаблона. Хотя это и необязательно, рекомендуется выбрать более осмысленное имя. Для этого щелкните запись файла MyWordTools правой кнопкой мыши и выберите в контекстном меню пункт Свойства: ПроектШаблона (рис. 5).

На приведенном ниже рисунке показан пункт меню Свойства: ПроектШаблона…

Рис. 5. Пункт меню "Свойства"

Выбор пункта "Свойства проекта" во всплывающем меню

В диалоговом окне Проект шаблона — свойства проекта измените имя проекта на MyWordTools.

Написание макроса

Большая белая область в правой части редактора Visual Basic предназначена для написания кода макроса. Если она не отображается, выберите в меню Вид пункт Код, чтобы вывести окно кода. Приложение Word автоматически вставит в начало кода оператор Option Explicit. Не удаляйте его.

Нам нужен макрос для переключения между двумя способами перехода по гиперссылке в Word. Он будет работать так же, как и другие кнопки, предназначенные для переключения между значениями параметра в Word. Кнопка Полужирный на вкладке "Главная", например, выделяет текст полужирным шрифтом, если он не был выделен, и отменяет полужирное начертание в противном случае.

Скопируйте и вставьте через буфер обмена приведенный ниже пример кода макроса в окно кода.

    Sub ToggleHyperlinkCtrlClick()
        Options.CtrlClickHyperlinkToOpen = Not Options.CtrlClickHyperlinkToOpen
    End Sub

Это короткий макрос ToggleHyperlinkCtrlClick, состоящий только из одной строки кода. Эта строка означает "Изменить текущее значение параметра Word, определяющего необходимость использования сочетания CTRL + щелчок для перехода по гиперссылке, на противоположное (Not)" (рис. 6).

На рисунке ниже приведено построчное объяснение работы метода ToggleHyperLinkCtrlClick.

Рис. 6. Объяснение работы метода ToggleHyperLinkCtrlClick

Код в окне кода редактора Visual Basic

Тестирование макроса

Чтобы протестировать макрос, выполните указанные ниже действия.

Тестирование макроса

  1. Разместите окна Word и редактора Visual Basic рядом друг с другом.

  2. Щелкните главное окно Word. Введите в документ MyWordTools.dotm несколько абзацев текста. Включите в текст несколько гиперссылок (рис. 7).

    На приведенном ниже рисунке показан документ MyWordTools и код ToggleHyperLinkCtrlClick в редакторе Visual Basic в расположенных рядом окнах.

    Рис. 7. Окна документа и редактора Visual Basic, расположенные рядом друг с другом

    Разделенный экран документа и редактор Visual Basic

  3. В редакторе Visual Basic щелкните в любом месте макроса. Чтобы запустить макрос, выберите в меню Выполнить команду Выполнить процедуру/форму пользователя или нажмите клавишу F5.

  4. Значение параметра, определяющего способ перехода по гиперссылке, изменится. Наведите указатель мыши на гиперссылку в главном окне Word и убедитесь, что подсказка изменилась.

  5. Чтобы переключить значение, запустите макрос повторно.

Макрос также можно запустить непосредственно в приложении Word. На вкладке Вид в группе Макросы нажмите кнопку Макросы. Откроется диалоговое окно Макрос, где в списке макросов будет и макрос ToggleHyperlinkCtrlClick. Чтобы запустить ваш макрос, щелкните его имя и нажмите кнопку Выполнить.

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

Чтобы запускать макрос одним щелчком мыши, можно добавить кнопку на панель быстрого доступа. Для этого выполните указанные ниже действия.

Создание кнопки на панели быстрого доступа

  1. Щелкните панель быстрого доступа правой кнопкой мыши и выберите в контекстном меню команду Настройка панели быстрого доступа.

  2. В разделе Настройка панели быстрого доступа выберите в списке Выбрать команды из пункт Макросы.

  3. В списке "Настройка панели быстрого доступа" выберите файл MyWordTools.dotm. (Это необходимо, чтобы приложение Word сохранило кнопку на панели быстрого доступа в файле MyWordTools.dotm. Если этого не сделать, при копировании файла на другой компьютер кнопка отображаться не будет.)

  4. Выберите макрос ToggleHyperlinkCtrlClick и нажмите кнопку Добавить.

  5. Нажмите кнопку Изменить, чтобы выбрать символ и изменить имя на ToggleHyperlinkCtrlClick.

Теперь макрос можно запустить в любой момент, нажав кнопку на панели быстрого доступа.

Назначение сочетания клавиш для запуска макроса

Для запуска макроса также можно назначить сочетание клавиш. Для этого выполните указанные ниже действия.

Назначение сочетания клавиш для запуска макроса

  1. Щелкните панель быстрого доступа правой кнопкой мыши и выберите в контекстном меню команду Настройка ленты. Нажмите кнопку Настройка рядом с надписью Сочетания клавиш.

    На приведенном ниже рисунке показано диалоговое окно Настройка клавиатуры

    Рис. 8. Диалоговое окно "Настройка клавиатуры"

    Диалоговое окно "Настройка клавиатуры"

  2. Выполните в диалоговом окне Настройка клавиатуры (рис. 8) указанные ниже действия.

    1. В списке Категории выберите пункт Макросы.

    2. В списке Макросы выберите свой макрос.

    3. Щелкните мышью внутри поля Новое сочетание клавиш и введите требуемое сочетание клавиш. Я использую сочетание ALT + H, которое легко запомнить, потому что оно используется для гиперссылок (hyperlink). В диалоговом окне также указывается, что это сочетание клавиш в настоящий момент не используется, поэтому конфликта с существующими сочетаниями клавиш не возникнет.

    4. В списке Сохранить изменения в выберите файл MyWordTools.dotm. (Это необходимо, чтобы приложение Word сохранило сочетание клавиш в файл MyWordTools.dotm. Если этого не сделать, при копировании файла на другой компьютер это сочетание клавиш работать не будет.)

    5. Нажмите кнопку Назначить.

Чтобы запустить макрос, нажмите сочетание клавиш ALT + H.

Завершение работы

Вы создали файл для хранения макроса (MyWordTools.dotm), добавили в него модуль (Модуль1), создали макрос (ToggleHyperlinkCtrlClick), разместили на панели быстрого доступа кнопку и назначили сочетание клавиш для запуска макроса. Сохраните файл MyWordTools.dotm (это можно сделать в редакторе Visual Basic или в главном окне Word).

Так как работа в редакторе Visual Basic закончена, закройте его и вернитесь в Word. Для этого выберите в меню Файл редактора команду Закрыть и вернуться в Microsoft Word.

Чтобы протестировать макрос, нажмите кнопку на панели быстрого доступа. Убедившись, что макрос работает, сохраните и закройте файл.

Загрузка надстроек и управление ими

По нашему плану этот макрос должен быть доступен независимо от документа. Однако, если создать новый документ (с помощью сочетания клавиш CTRL + N), кнопка на панели быстрого доступа не отобразится. Макрос запустить невозможно.

Чтобы макрос, хранящийся в файле MyWordTools.dotm, был доступен в любом открытом документе, необходимо загрузить файл MyWordTools.dotm как надстройку. (Если DOTM-файл используется в качестве надстройки, его также называют "глобальным шаблоном".) DOTM-файл можно загрузить в качестве надстройки как вручную, так и автоматически:

  • Чтобы загрузить DOTM-файл вручную, закройте его, если он открыт. На вкладке Разработчик нажмите кнопку Надстройки. В диалоговом окне Шаблоны и надстройки нажмите кнопку Добавить, укажите DOTM-файл и нажмите кнопку Открыть.

  • Чтобы загрузить DOTM-файл автоматически, его необходимо сохранить в папке автозагрузки Word. Перезапустите приложение Word. Word загрузит надстройку автоматически.

Можно просмотреть все надстройки, загруженные в Word, для этого на вкладке Разработчик нажмите кнопку Надстройки.

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

При загрузке файла MyWordTools.dotm как надстройки текст, введенный в главном окне Word при редактировании этого файла, не отображается. В Word содержимое таких документов не используется, поэтому перед сохранением DOTM-файла, который будет использоваться в качестве надстройки, удалите текст, введенный в главном окне Word.

Важно понимать отличия между открытием файла надстройки (например, с помощью команды Открыть в меню Файл) и его загрузкой (например, с помощью кнопки Надстройки на вкладке Разработчик). Открытие файла выполняется для его редактирования и тестирования. Загрузка файла в качестве надстройки выполняется для его непосредственного использования.

Предупреждение

Никогда не загружайте в качестве надстройки файл, уже открытый в Word. Никогда не открывайте и не изменяйте файл, уже загруженный в качестве надстройки. Это может привести к непредсказуемым последствиям.

Использование макроса на другом компьютере

Для использования макроса необходимы указанные ниже компоненты.

  • Код макроса.

  • Кнопка на панели быстрого доступа для запуска макроса.

  • Сочетание клавиш для запуска макроса.

Все это было сохранено в файл MyWordTools.dotm. Таким образом, для использования макроса на другом компьютере или для передачи макроса другому пользователю достаточно просто скопировать файл MyWordTools.dotm в папку автозагрузки Word на другом компьютере. При запуске Word файл MyWordTools.dotm загрузится в качестве надстройки, после чего сам макрос, кнопка и сочетание клавиш станут доступны пользователю.

Часть 2. Написание более сложных макросов

В части 1 был приведен пример простого однострочного макроса. В части 2 показано, как расширить базовый процесс для создания более сложных макросов.

Добавление в файл MyWordTools.dotm дополнительных макросов

Файл, созданный в части 1, MyWordTools.dotm, теперь содержит один модуль (Модуль1), который, в свою очередь, содержит один макрос (ToggleHyperlinkCtrlClick).

Не изменяйте файл, загруженный в качестве надстройки. Чтобы добавить в файл дополнительные макросы, выполните указанные ниже действия.

  1. Выгрузите файл, загруженный в качестве надстройки. Для этого на вкладке Разработчик нажмите кнопку Надстройки, снимите флажок для надстройки и нажмите кнопку ОК.

  2. Откройте файл для редактирования. Для этого откройте вкладку Файл и в разделе Сведения нажмите кнопку Открыть. Найдите файл, щелкните его и нажмите кнопку Открыть.

В файле, открытом для редактирования, можно выполнить следующие действия:

  • добавить макрос в существующий модуль (Модуль1), введя код в окне кода, или

  • добавить в файл новый модуль и ввести код макроса в этом модуле.

Выбор конкретного способа зависит от степени сложности макросов. При наличии нескольких коротких макросов имеет смысл поместить их в один модуль. При наличии множества длинных макросов разумно сохранить из в отдельных модулях, присвоив этим модулям имена, по которым можно определить, какие макросы хранятся в модуле.

После добавления в файл нового макроса его можно протестировать, создать для него кнопку на панели быстрого доступа и назначить сочетание клавиш точно так же, как для нашего первого макроса.

Примечания

Профессиональные разработчики обычно включают в код комментарии, поясняющие назначение кода.

Чтобы добавить в макрос комментарий, поставьте в начале текста комментария апостроф. По умолчанию в редакторе Visual Basic комментарии выделяются зеленым цветом.

Написание надежного кода: макрос, предназначенный для сортировки текста

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

Надежный макрос никогда не выдает непредвиденных сообщений об ошибках и выполняет именно те задачи, для которых предназначен, — не больше и не меньше.

Чтобы продемонстрировать некоторые проблемы, связанные с написанием надежного кода, рассмотрим макрос, предназначенный для сортировки текста.

Для сортировки нескольких абзацев текста требуется несколько щелчков мышью. Если сортировать текст приходится часто, удобно создать отдельную кнопку для выполнения простой сортировки (для более сложной сортировки на вкладке "Главная" уже есть встроенная кнопка). Эта макрокоманда показана в приведенном ниже примере кода.

    Sub SortText1()
    ' A macro to sort the selected text
         Selection.Sort
    End Sub

Протестировать этот макрос можно точно так же, как и предыдущий. Разместите окна Word и редактора Visual Basic рядом друг с другом. В главном окне Word введите несколько абзацев текста и выделите их. В редакторе Visual Basic запустите макрос, щелкнув мышью в любом месте кода и нажав клавишу F5. Word отсортирует абзацы в алфавитном порядке.

Кажется, что наш макрос SortText1 работает хорошо. Однако этот макрос ненадежен. Чтобы нарушить его работу, вставьте в документ рисунок и сделайте его перемещаемым. Для этого выделите рисунок и на вкладке "Формат" в разделе Работа с рисунками в группе Упорядочить нажмите кнопку Положение. Выберите любой параметр из группы С обтеканием текстом.

Выделите рисунок и запустите макрос SortText1. Поскольку для приложения Word сортировка перемещаемого рисунка не имеет смысла, Visual Basic выдаст сообщение об ошибке. Такой макрос нельзя назвать надежным!

Единственная строка нашего кода, Selection.Sort, правильно работает только в том случае, если выделен обычный текст. Перед тем как устранить эту проблему, давайте рассмотрим еще одну.

Предупреждение

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

В приведенном ниже примере кода показано, как ограничить макрос таким образом, чтобы сортировка выполнялась только тогда, когда выделено два и более абзацев.

    Sub SortText2()
    ' A macro to sort the Selection if the user has selected more than one
    ' paragraph of text.
        If Selection.Paragraphs.Count > 1 Then
            Selection.Sort
        End If
    End Sub

Поэкспериментируйте с запуском макроса SortText2. В отличие от макроса SortText1 этот макрос не выдает сообщение об ошибке при выделении рисунка. Кроме того, этот макрос не позволит случайно отсортировать весь документ. Чтобы увидеть, что происходит, воспользуйтесь приведенной ниже процедурой, чтобы выполнить код по шагам.

Пошаговое выполнение VBA-кода

  1. Щелкните в любом месте главного окна Word и выделите рисунок.

  2. Щелкните в любом месте макроса SortText2.

  3. Нажмите клавишу F8. Приложение Word выделит первую строку макроса (Sub SortText2()).

  4. Нажимайте клавишу F8 последовательно, чтобы выполнять код строка за строкой.

С помощью клавиши F8, используемой для пошагового выполнения кода, можно увидеть, что делает код, и устранить неполадки. В данном случае можно увидеть, что при выделенном рисунке приложение Word обрабатывает оператор If, но пропускает оператор Selection.Sort.

В новый макрос SortText2 внесен ряд важных дополнений.

  • Операторы If и End If определяют, будет ли код обработан или пропущен приложением Word.

  • В конце строки If указывается ключевое слово Then.

  • Каждому оператору If должен соответствовать оператор End If.

  • Объект Selection используется в макросе дважды. Функция Selection.Paragraphs.Count предоставляет сведения о выделенных пользователем объектах. Функция Selection.Sort сортирует выделенный текст.

В приведенном ниже примере кода показано, как расширить этот макрос таким образом, чтобы предоставлять пользователю сведения с помощью ключевых слов Else и MsgBox.

    Sub SortText3()
        If Selection.Paragraphs.Count > 1 Then
            ' The user has selected more than one paragraph of text.
            ' Sort the selection.
            Selection.Sort
        Else
            ' Tell the user what to do.
            MsgBox "Please select two or more paragraphs and try again."
        End If
    End Sub

Из этого макроса можно узнать следующее.

  • Операторы If…Then, Else и End If определяют, будет ли код обработан или пропущен приложением Word.

  • Использовать оператор Else необязательно. Каждому оператору If может соответствовать один или ни одного оператора Else.

  • Если используется оператор Else, оператор End If обязателен.

  • Команда выводит на экран сообщение для пользователя. Введите текст сообщения после ключевого слова MsgBox, заключив его в двойные кавычки. Любой текст в макросе (например, текст этого сообщения) необходимо заключать в кавычки ("). Если кавычки не поставить, приложение Word попытается найти слово "Пожалуйста" в объектной модели Word. Поскольку Word не знает, что значит "Пожалуйста", макрос выдаст сообщение об ошибке.

Чтобы смоделировать проблему, выполните указанные ниже действия.

Тестирование макроса SortText3

  1. Создайте на панели быстрого доступа кнопку для запуска SortText3. Сохраните кнопку в файле MyWordTools.dotm.

  2. Убедитесь, что кнопка запускает макрос SortText3.

  3. Сохраните файл MyWordTools.dotm

  4. Закройте и перезапустите Word

  5. Если документ открыт, закройте его, чтобы не осталось открытых документов.

  6. Еще раз проверьте работу кнопки на панели быстрого доступа.

Должно появиться сообщение об ошибке. Это ошибка возникает потому, что в первой строке макрос ссылается на объект Selection. Надстройка загружена. Если в главном окне Word не открыто ни одного документа, объект Selection отсутствует. Без объекта Selection приложение Word не может выполнить код макроса.

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

Выгрузите надстройку и откройте файл для редактирования. Замените существующий макрос на приведенный ниже пример кода.

    Sub SortText()
    ' A macro to sort the selected text, if the user has selected 
    ' more than one paragraph
    
        If Documents.Count > 0 Then
            ' The user has at least one document open.
            
            If Selection.Paragraphs.Count > 1 Then
                ' The user has selected more than one paragraph
                ' of text, so sort it.
                Selection.Sort
            Else
                ' Tell the user what to do.
                MsgBox "Please select two or more paragraphs and try again."
            End If
        End If
    End Sub

В окончательной версии макроса SortText используются вложенные блоки If…End If. Важно выделять строки кода отступами, чтобы каждому оператору If соответствовал правильный оператор End If.

Ниже перечислены возможные последствия использования ненадежных макросов.

  • Сообщения об ошибках (например, при использовании объекта Selection, когда не открыто ни одного документа, а следовательно, объект Selection отсутствует).

  • Нежелательное поведение (например, когда в результате выполнения команды Selection.Sort непреднамеренно сортируется весь документ).

Ниже приведены советы по написанию надежных макросов.

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

  • Закройте файл, загрузите его в качестве надстройки и протестируйте макрос, чтобы убедиться в том, что он работает, если ни одного документа не открыто. Чтобы проверить, открыт ли документ, воспользуйтесь выражением If Documents.Count > 0.

Сведения об объектной модели Word

В созданных нами макросах используются три важных элемента Word.

  • Options. Этот объект ссылается на параметры настройки Word.

  • Documents. Этот объект ссылается на все документы, открытые в Word в настоящий момент. Для ссылки на активный документ используется ключевое слово ActiveDocument.

  • Selection. Этот объект ссылается на все объекты, выделенные пользователем в ActiveDocument. Это может быть отдельное слово, несколько абзацев, рисунок или любое другое содержимое.

В каждом из этих макросов использовались указанные ниже низкоуровневые элементы.

Эти элементы (Options, Documents и Selection) называются объектами. Они входят в объектную модель Word.

Объектная модель представляет собой иерархию. В эту иерархию входят все части Word, которые можно контролировать в макросах. Например, объект ActiveDocument ссылается на активный документ.

Если текущий документ содержит таблицу, в которой не менее 3 строк и 2 столбцов, приведенный ниже код выведет текст во второй ячейке третьей строки из первой таблицы в активном документе.

    MsgBox ActiveDocument.Tables(1).Rows(3).Cells(2).Range.Text

В макросах можно работать с объектами (например, с объектом Selection или ActiveDocument). Работать с объектами можно двумя способами: с помощью методов и свойств.

Методы аналогичны глаголам, они описывают действия. Пример:

  • ActiveDocument.PrintPreview

  • ActiveDocument.AcceptAllRevisionsShown

Свойства аналогичны существительным, они описывают объекты. Пример:

  • MsgBox ActiveDocument.Paragraphs(1).Range.Text

  • ActiveDocument.Paragraphs(1).Range.Text = "New text for Paragraph 1"

В первом примере приведен макрос, считывающий свойство Text и выводящий текст в окне сообщения. Во втором примере макрос записывает (или задает) свойство Text. При выполнении этой строки кода текст в первом абзаце будет заменен на "Новый текст абзаца 1".

В общем случае макрос может "считывать" или "записывать" свойства, однако некоторые свойства предназначены только для чтения. Например, объект Documents имеет свойство .Count. Рассмотрим следующий пример.

  • MsgBox Documents.Count ' Reports the number of currentlyopen documents.

  • Documents.Count = 4 ' Does not work: .Count is a readonly property.

Написание сокращенного кода: макрос для включения и отключения отображения границ текста

При редактировании большого документа мне хотелось бы видеть границы текста. При вычитке текста я предпочитаю отключить границы текста. Включать и отключить отображение границ текста мне приходится много раз в день. Для этого необходимо нажать кнопку "Файл" и в разделе "Справка" нажать кнопку "Параметры". В диалоговом окне Параметры Word необходимо перейти в раздел Дополнительно, после чего в разделе Показывать содержимое документа нужно установить (или снять) флажок Показывать границы текста и нажать кнопку ОК. Необходимость постоянного выполнения этой последовательности щелчков раздражает. Гораздо удобнее было бы выполнять эту операцию одним щелчком.

Ниже приведен пример макроса для включения и отключения отображения границ текста.

    Sub ToggleTextBoundaries1()
    ActiveDocument.ActiveWindow.View.ShowTextBoundaries = Not ActiveDocument.ActiveWindow.View.ShowTextBoundaries
    End Sub

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

    Sub ToggleTextBoundaries2()
        With ActiveDocument.ActiveWindow.View
            .ShowTextBoundaries = Not .ShowTextBoundaries
        End With
    End Sub

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

Каждому оператору With должен соответствовать оператор End With. Между операторами With и End With можно писать сокращенный код, начинающийся с точки.

    With ActiveDocument.ActiveWindow.View
            ' Between With and End With you can use 
            ' a period to begin shortcut code.
            ' The shortcut will refer to ActiveDocument.ActiveWindow.View.
        End With

Например, в данном блоке With-End With сокращение .ShowTextBoundaries соответствует ActiveDocument.ActiveWindow.View.ShowTextBoundaries.

Если в коде один и тот же объект используется несколько раз, с помощью операторов With и End With можно сократить объем вводимого кода и сделать его более удобочитаемым.

Этот макрос пока не является надежным, его окончательная стабильная версия приведена ниже.

    Sub ToggleTextBoundaries()
        If Documents.Count > 0 Then
            With ActiveDocument.ActiveWindow.View
                .ShowTextBoundaries = Not .ShowTextBoundaries
            End With
        End If
    End Sub

В окончательной версии макроса ToggleTextBoundaries используется блок With…End With, вложенный в блок If…End If. Благодаря отступам можно убедиться, что каждому оператору With соответствует оператор End With, а каждому оператору If — оператор End If.

Использование оператора With и объекта Selection: макрос для вставки раздела с альбомной ориентацией страниц

Ниже приведен более сложный пример использования ключевого слова With: макрос для вставки по месту положения курсора раздела с альбомной ориентацией страниц.

В этом макросе ключевое слово With используется с объектом Selection (With Selection). По мере накопления опыта в написании макросов вы все реже и реже будете работать с объектом Selection, поскольку зачастую более эффективно использовать объект Range. Изучение этого макроса позволит вам разобраться, как Word управляет объектом Selection. Расположите окна Word и редактора Visual Basic рядом друг с другом, щелкните в любом месте макроса и нажмите клавишу F8 несколько раз для пошагового выполнения макроса, чтобы увидеть, что происходит в главном окне Word.

В этом макросе также показано, что при наличии множества строк текста их лучше разбить на логические "абзацы", снабженные комментариями.

    Public Sub InsertLandscapeSectionHere()
    ' Purpose: Insert a landscape section at the insertion point, 
    ' and insert text to tell the user where the landscape section is.
        If Documents.Count > 0 Then
            ' The user has a document open, so insert a 
            ' landscape section.
            With Selection
                ' Do not accidentally over-write selected text
                .Collapse Direction:=wdCollapseStart
    
                ' Insert section breaks with blank paragraphs
                ' in the new section.
                .TypeParagraph
                .Style = ActiveDocument.Styles(wdStyleNormal)
                .InsertBreak Type:=wdSectionBreakNextPage
                .TypeParagraph
                .TypeParagraph
                .TypeParagraph
                .InsertBreak Type:=wdSectionBreakNextPage
                .MoveUp Unit:=wdLine, Count:=3
    
                ' Set the orientation of new section to landscape.
                .PageSetup.Orientation = wdOrientLandscape
    
                ' Provide guidance to the user.
                .TypeText Text:="Your landscape section starts here."
            End With
        Else
            ' Tell the user what to do.
            MsgBox "Please open a document and try again."
        End If
    End Sub

В этом макросе используются два вида синтаксиса.

  1. В синтаксисе первого типа используется знак равенства (=):Selection.PageSetup.Orientation = wdOrientLandscape

  2. В синтаксисе второго типа используется двоеточие и знак равенства (=):Selection.InsertBreak Type:=wdSectionBreakNextPage.

Дополнительные сведения о различиях между этими двумя типами синтаксиса см. в разделе "Общие сведения о синтаксисе Visual Basic" справки к редактору Visual Basic.

Дополнительные сведения о макросах Word и редакторе Visual Basic

Редактор Visual Basic (VBE) включает средства для написания собственных макросов. Ниже приведен ряд полезных рекомендаций.

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

  • При вводе имени объекта из объектной модели Word (например, Selection или ActiveDocument) с точкой (.) приложение Word выводит список всех свойств и методов этого объекта. Дополнительные сведения см. в статье, посвященной знакомству с основами VBA за 15 минут.

  • В окне интерпретации редактора Visual Basic можно получить дополнительные сведения об объектной модели Word и протестировать простые макросы. Дополнительные сведения см. в статье, посвященной расширению возможностей Word 2007, Excel 2007 и PowerPoint 2007 одной строкой кода на VBA.

  • Меню и панели инструментов редактора Visual Basic можно настроить. Одной из полезных возможностей настройки является возможность назначения комментариям сочетаний клавиш. Для этого щелкните правой кнопкой мыши пустую область рядом с меню или панелями инструментов и выберите в контекстном меню команду Настроить. В диалоговом окне Настройка на вкладке Панели инструментов выберите панель инструментов Правка. Оставьте диалоговое окно Настройка открытым. На панели инструментов Правка щелкните правой кнопкой мыши кнопку Закомментировать блок, измените имя на &Закомментировать блок, после чего выберите пункты Изображение и Текст. Повторите эту же процедуру для кнопки Раскомментировать блок, переименовав ее в &Раскомментировать блок. Теперь можно будет выделить несколько строк кода и воспользоваться сочетаниями клавиш ALT + З и ALT + Р соответственно, для того чтобы закомментировать или раскомментировать выделенный код.

  • Редактор Visual Basic снабжен большим объемом справочной информации. Справка является основным источником сведений об объектной модели Word.

    • Для получения общих сведений выберите в меню "Справка" редактора Visual Basic пункт Справка по Microsoft Visual Basic для приложений. Откройте Оглавление, щелкнув маленький значок книги на панели инструментов средства просмотра справки. Оглавление упрощает работу со справкой для разработчика. В частности, в разделе Основные понятия рекомендуется изучить Вопросы и ответы по Visual Basic.

    • Для получения справки по конкретному ключевому слову или объекту из объектной модели Word (например, ActiveDocument) щелкните это слово и нажмите клавишу F1 для перехода к соответствующему разделу справки.

Заключение

Макросы Word могут быть длинными, сложными и многофункциональными. Например, можно написать макрос для обращения к внешней базе данных, выполнения с полученными данными определенных вычислений и возврата результатов в Word. Также можно написать макрос Word для взаимодействия с Excel, PowerPoint или Outlook. В некоторых случаях и простые макросы могут оказаться полезными, позволяя сэкономить время.

Для форматирования текста больше подходят стили, чем макросы. Для изменения макета документа лучше создать новый шаблон. Кроме того, для выполнения поставленной задачи уже может существовать встроенная команда, которую можно добавить на панель быстрого доступа (при настройке панели быстрого доступа выберите в списке Выбрать команды из: пункт Все команды).

Желаю удачи в создании макросов, однако не пытайтесь изобретать велосипед, используя макросы для решения задач, которые решаются встроенными средствами Word.

Дополнительные материалы

Дополнительные сведения см. в следующих документах:

Об авторе

Шона Келли разрабатывает надстройки и шаблоны для Word, помогающие сотрудникам государственных и коммерческих организаций более эффективно работать с Word. Она получила статус специалиста MVP по Microsoft Word в 2002 г.