Управляющие конструкции VBA

Написать макрос, который гладко выполняется от начала до конца, прорабатывая строку за строкой, вплоть до самой последней — End Sub — поверьте, это не так просто, как кажется на первый взгляд! Подобная макрокоманда может сделать много, однако ее структура недостаточно гибка. Вы можете захотеть создать макрос, который выполняет любую из следующих операций.

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

* Выполняет одно или более заданий несколько раз.

*Знает достаточно, чтобы остановиться при достижении конца документа.

* Проверяет, лежат ли все значения таблицы в определенном диапазоне.

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

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

Вернемся к созданному нами выше "Чистящему" макросу

Теперь переходим в редактор Visual Basic (рис. 7.1) взгляните на записанный макрос.

1. Выполните команду Вид, Макрос, Макросы. Откроется диалоговое окно Макрос. Переименуйте чистящий макрос в StripSpacePara

2. 3. Щелкните на кнопке Макросы Откроется окно Редактора Visual Basic (рис. 7.1).

Рисунок 7.1

Как видите, окно Программа содержит довольно большое количество кода. Фактически кода так много, что необходимо как-то уменьшить его количество.

Замечание. Чтобы уменьшить или увеличить количество текста в окне Программа, выполните следующее.

1. В Редакторе Visual Basic выполните команду Tools, Options.

2. Щелкните на вкладке EditorFormat (рис. 7.2).

3. В раскрывающемся списке Размер установите размер шрифта.

4. Щелкните на кнопке ОК.

Рисунок 7.2

Поскольку вы не раз будете записывать макрокоманды типа Найти и заменить, наверное, стоит подробнее рассмотреть одну из них. Остановимся на записанном макросе для замены трех символов абзаца двумя:

Selection.Find.ClearFormatting

Selection.Find.Replacement.ClearFormatting

With Selection.Find

.Text = "^p^p^p''

.Replacement.Text = "^p^p"

.Forward = True

.Wrap = wdFindContinue

.Format = False

.MatchCase = False

.MatchWholeWord = False

.MatchWildcards = False

.MatchSoundsLike = False

.MatchAllWordForms = False

End With

Selection.Find.Execute Replace=wdReplaceAll

Первые два выражения играют весьма важную роль: они указывают VBA на необходимость отменить форматирование, которое вы использовали в предыдущем поиске. Другими словами, если запустить данный макрос сразу же после того, как произошла замена стиля Заголовок 1 стилем Заголовок 2, эти выражения предотвращают поиск искомого текста среди этих стилей. Без них ваша макрокоманда наверняка не найдет того текста, который вы хотите заменить, а после того как замена все-таки произойдет, вы поучите совсем не то, что было нужно.

Selection.Find.ClearFormatting

Selection.Find.Replacement.ClearFormatting

Основная часть макроса состоит из уже знакомого вам выражения With.

Замечание.

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

.Text = "^р^р^р" соответствует тексту, который вы ввели в поле Найти, а строка

.Replacement.Text = "^р^р" указывает на то, что вы ввели в поле Заменить на.

Следующие два выражения также очень важны:

.Forward = True

.Wrap = wdFindContinue

.Forward = True указывает программе Word, что поиск необходимо начать в точке вызова макроса и продолжать его до конца документа.

.Wrap =wdFindContinue указывает на то, что при достижении конца текста необходимо вернуться к началу документа и продолжить поиск до точки вызова.

Следующие шесть выражений (.Format,.MatchCase,.MatchWholeWord,.MatchWildcards, HatchSoundsLike,.MatchAllWordForms) не относятся к данной макрокоманде, поэтому их можно удалить.

Как вы уже знаете, данное выражение заканчивается оператором End With. Но макрос на этом не заканчивается. В нем есть еще одна строка:

Selection.Find.Execute Replace=wdReplaceAll

Она приказывает VBA перемещаться далее и выполнять команду Найти и заменить. (Помните, что вы могли бы просто закрыть диалоговое окно Найти и заменить, не выполняя поиск.)

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

Вышеописанный макрос очень полезен, однако, вы, возможно, уже заметили одну проблему: он ищет «нужные символы абзаца только один раз. Если кто-то поставит подряд пять символов абзаца в этом документе, после того, как вы запустите макрокоманду, четыре из них останутся. Вы можете записать одинаковую последовательность действий снова и снова — для черновых вариантов макроса это сгодится, и нет никаких причин поступать иначе. Однако более эффективный и гибкий подход — использовать циклы For...Next.

Рисунок 7.3.

3. Использование цикла For...Next

В цикле For...Next можно приказать VBA выполнить определенное задание необходимое вам количество раз. Кроме того, вы создаете переменную-счетчик, чтобы следить за выполнением задачи.

Каждый раз, когда ваша программа выполняет какое-либо задание, в действительности она спрашивает что-то типа "Ну как, уже все?". Если ответ будет "Нет!", VBA возвращается к началу цикла и выполняет всю последовательность команд еще раз. Если же программа обнаружит, что выполнила задачу именно столько раз, сколько вы указали, она прекращает выполнение цикла и переходит к следующему выражению макрокоманды. В этом примере вы создадите переменную-счетчик, которая выполняет действие 10 раз:

For х=1 to 10

Последовательность любых команд

Next х

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

Далее рассмотрим, как использовать цикл For...Next в макросе StripSpacePara, который вы только что писали и отредактировали. В этом примере цикл будет выполнен только пять раз; этого вполне достаточно, чтобы отловить все лишние символы абзаца.

Sub StripSpacePara()

For x = 1 to 5

Selection.Find.ClearFormatting

Selection.Find.Replacement.ClearFormatting

With Selection.Find

.Text = "^p^p^p"

.Replacement.Text = "^р^р"

.Forward = True

.Wrap = wdFindContinue

End With

Selection.Find.Execute Replace:=wdReplaceAl1 With Selection.Find

.Text = " "

.Replacement.Text = " "

.Forward = True

.Wrap = wdFindContinue

End With

Selection.Find.Execute Replace:=wdRepiaceAll

Next x

End Sub

Замечание. Обратите внимание, что содержимое цикла For...Next сдвинуто вправо для удобства чтения когда макрокоманды Помните, что вы можете легко сдвинуть несколько строк одновременно, отметив их и нажав <Таb> на клавиатуре.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: