Лекция 8. Цель: научиться применять базовые конструкции VBA

Цель: научиться применять базовые конструкции VBA.

Лабораторная работа №7. Тема: Использование управляющих конструкций VBA

Задание1. Внимательно изучить теоретическую чость лекции. Созданный ранее «Чистящий макрос преобразовать с использованием цикла For …Next.

Задание2. Переформатирование таблиц

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

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

1. Щелкните на кнопке ЗАП. Появится диалоговое окно Запись макроса.

2. Введите имя макрокоманды в поле Имя макроса. (Для данного примера назовите макрос FormatTableContemporary и пропустите пункты, относящиеся к назначению макрокоманде кнопки на панели инструментов или комбинации клавиш.)

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

4. Чтобы переместиться в начато документа, нажмите на клавиатуре <Ctrl+Home>. В этом случае все таблицы в документе будут переформатированы независимо от того, в каком месте вы запустили макрос.

5. Щелкните на кнопке Выбор объекта перехода в нижней части вертикальной полосы прокрутки

5. Из раскрывающегося списка выберите Таблицы. Word перенесет курсор в первую ячейку следующей таблицы документа.

7. Из меню Таблица выберите команду Выделить таблицу. Word выделит всю таблицу.

8. Из меню Таблица выберите команду Автоформат. Word покажет диалоговое окно Автоформат таблицы

9. В списке Форматы выберите Современный.

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

11. Чтобы переместить указатель за таблицу, нажмите клавишу со стрелкой вниз. Это подготовит макрос к поиску следующей таблицы.

12. Дважды щелкните на кнопке ЗАП, чтобы прекратить запись макрокоманды.

Теперь у вас есть макрокоманда, которая ищет следующую таблицу и автоматически форматирует ее с помощью стиля Современный. На рис. 7.4 показан макрос в Редакторе Visual Basic; при этом окна Проект и Свойства закрыты.

Рисунок 7.4

Некоторые элементы кода очень просты. В первой строке:

Selection.HomeKey Unit:=wdStory

HomeKey — метод, связанный с объектом Selection, а это, как вы помните, означает, что задано действие, выполняемое над объектом Selection. В данном случае действие — "перейти в начало блока". Блок в нашей программе — wdstory, таким образом VBA ссылается на весь текст документа, включая заголовки, примечания, верхние и нижние колонтитулы, а также другие элементы документа.

В следующих двух строках VBA использует свойство Browser объекта Application. Первая из строк устанавливает Browser на поиск таблиц. Вторая производит сам поиск, перемещая курсор в первую ячейку первой найденной таблицы.

Application.Browser.Target = wdBrowseTable

Application.Browser.Next

Теперь, когда курсор попал в таблицу, следующая строка выделяет ее целиком. Здесь вы используете объект, свойства и метод одновременно. Selection — это объект, Tables — свойство объекта, a Select в данном случае является методом — выполняемым действием.

Selection.Tables(1).Select

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

Selection.Tables(l).AutoFormat Format=wdTableFormatContemporary, _

ApplyBorders=Truer ApplyShading=True, ApplyFont=True, ApplyColor=True, ApplyHeadingRows=True, ApplyLastRow=False, ApplyFirstColumn=True, ApplyLastColumn=False, AutoFit=True

Наконец, последнее выражение перемещает указатель вниз на одну строку: Selection.MoveDown Unit:=wdLine, Count:=1

Теперь у вас есть необычайно МОЩНЫЙ макрос, однако и его можно усовершенствовать. Вы уже знаете, как создавать цикл типа For...Next, который выполняет последовательность команд определенное число раз. Дальше вы узнаете, как изменить макрокоманду, чтобы она выполнялась до тех пор, пока не достигнут конец документа.

Использование циклов Do...While

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

Selection.HomeKey Unit;=wdStory

Application.Browser.Target = wdBrowseTable

Однако в следующие за ними строки кода вам придется внести некоторые изменения. Сначала необходимо создать переменную логического типа (Boolean), которая может принимать всего два значения: True (равна —1) или False (равна 0). Переменную такого типа вы добавите в макрокоманду с именем EndOfDoc, и ее значение будет зависеть от того, достиг ли курсор конца документа. Значение True (-1) соответствует случаю, когда курсор достиг конца документа; в противном случае будет возвращаться 0.

EndOfDoc = (Selection.End = ActiveDocument.Content.End - 1)

Далее, необходимо создать цикл Do...While. Такой цикл выполняет заданную последовательность действий, пока выполняется определенное условие. Если условие не выполняется, цикл завершает свою работу и программа переходит к исполнению следующего за ним выражения. Фактически цикл имеет такой вид:

Do While Условие

Необходимая последовательность действий

Loop

В нашем примере необходимо, чтобы цикл выполнялся пока

MoreTables =True,

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

Каждый раз, когда программа перемещается к следующей таблице, она пытается выделить ее целиком. Выражение On Error Resume Next предотвращает остановку выполнения программы при ошибке. Если макрос не может найти таблицу, системный объект Err содержит значение 1594. Проверка этой величины подскажет вам, имеет ли переменная MoreTables значение False.

On Error Resume Next

Selection.Tables(1).Select

If Err = 1594 Then

MoreTables = False

Else

End If

В окончательном виде это выглядит так:

Sub FormatTableContemporary()

EndOfDoc = (Selection.End = ActiveDocument.Content.End - 1)

Selection.HomeKey Unit: wdStory

Application.Browser.Target = wdBrowseTable

MoreTables = True

Do While MoreTables = True

Application.Browser.Next

On Error Resume Next

Selection.Tables(1).Select

If Err = 1594 Then

MoreTables = False

Else

Selection.Tables(1).AutoFormat Format:=wdTableFormatContemporary,_

ApplyBorders: =True, ApplyShading =True, ApplyFont=True,

ApplyColor =True_

, ApplyHeadingRows=True, ApplyLastRow=False,

ApplyFirstColumn=True,

ApplyLastColumn=False, AutoFit=True

Selection.MoveDown Unit=wdLine, Count=1

End If

Loop

End Sub

А если у вас в документе есть несколько видов таблиц и вы хотите применить Автоформат только к определенному их типу? На следующих страницах вы узнаете, как это сделать с помощью наиболее распространенной условной конструкции из всех существующих — выражения If...Then.

Замечание.

Другие особенности структуры Do...While.

Цикл Do...While выполняет задание по крайней мере один раз, даже если условие ложно. Если же оно истинно, он работает до тех пор, пока оно не станет ложным.

Цикл Do...Until работает только тогда, когда условие ложно, в противном случае он немедленно прекращает работу.

Цикл Do...Loop Until — комбинация двух предыдущих структур. Он выполняет код один раз независимо от того, выполняется условие или нет. Далее цикл продолжает работать только в том случае, если условие ложно.

5. Использование условной конструкции If Then...Else

Если есть условие, от которого зависит выполнение действия, то VBA поможет вам автоматизировать процесс принятия таких решений.

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

В самом простейшем виде конструкция If...Then...Else занимает всего одну строку. Фактически все выражение выглядит так:

If Условие истинно Then Сделать то Else Сделать другое

Во время работы программа может проверить условие путем просмотра документа, проверки значений переменных, а также многими другими способами. Если выполняется условие, программа переходит к исполнению того, что записано после Then. Если же условие ложно, программа делает то, что указано после Else. В следующем примере, предположим, что вы создали и определили переменную Income:

If Income > 96900 Then TaxRate =0.31 Else TaxKate =0.28

В приведенном далее примере у вас есть переменная WordCount, которая содержит количество слов в документе. Если оно превышает 200, программа запускает проверку орфографии.

If WordCount > 200 Then ActiveDocument.CheckSpeiling

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

Это чрезвычайно простые примеры применения If...Then...Else. И вполне возможно, что у вас возникнет необходимость выполнить группу выражений только в том случае, когда условие не выполняется. Для таких случаев вам придется использовать блочную структуру с If...Then, которая выглядит примерно так:

If Условие истинно Then

Сделать это

И это

И это тоже

Else

Сделать то

И вот это

End If

Некоторые команды в действительности могут быть построены только с помощью конструкции If...Then...Else. Например, если речь идет о коде, который записывает VBA, когда вы щелкаете на кнопке Подчеркнутый, которая находится на панели инструментов Стандартная:

If Selection.Font.Underline = wdUnderlineNone Then

Selection.Font.Underline = wdUnderlineSingle

Else

Selection.Font.Underline = wdUnderlineNone

End If

Аналогичная ситуация происходит, если в процессе записи макрокоманды щелкнуть на кнопке Орфография или Грамматика, тогда VBA запишет следующий код:

If Options.CheckGrammarWithSpelling = True Then ActiveDocument.CheckGrammar

Else

ActiveDocument.CheckSpelling

End If

Таким образом, писать какое-либо действие после Else совсем даже необязательно; если вы этого не сделаете, программа просто продолжит выполнение команд после End If.

6. Пример №2, Переформатирование таблиц, которые соответствуют определенному критерию

Теперь, когда вы уже немного освоились со структурой If...Then, вернемся к макросу, который почти завершен. У вас уже есть макрокоманда, которая выполняет команду Автоформат для каждой следующее таблицы и останавливается по достижении конца документа. А надо, чтобы форматировались только те таблицы, в которых находится квартальный отчет. И совершенно случайно догадались, что нужные таблицы содержат заголовки Q1, Q2, Q3. Q4. План, как построить необходимую программу, таков.

Искать заголовок Q1 внутри каждой таблицы.

Если Q1 найден, переформатировать таблицу.

Если заголовок Q1 не найден, перейти к следующей таблице и произвести поиск там.

Начинать можно с той программы, которая у вас уже есть. Однако что-либо менять вне цикла Do...While нет никакой необходимости. Все необходимые изменения достаточно внести в тело цикла, чтобы программа останавливалась, когда достигнет конца документа. Кроме того, две первые строки внутри цикла тоже не стоит менять, поскольку все еще нужно, чтобы программа искала следующую таблицу и выделяла ее:

Application.Browser.Next

Selection.Tables(1).Select

Поскольку все таблицы, которые вы хотите переформатировать, содержат текст Q1, следующий блок программы ищет именно Q1. Хотя код этой программы можно просто записать с помощью команды Запись макроса, однако все равно вам придется ее основательно отредактировать.

Selection. Find. Clear Formatting

With Selection.Find

.Execute FindText:="Q1", Forward:=True, Wrap:=wdFindContinue

If.Found = True Then

Selection.Tables(1).Select

Selection.Tables(1).AutcFormat Format=wdTableFormatContemporary,

ApplyBorders_

=True, ApplyShading=True, ApplyFont:=True, ApplyColor:=True,

ApplyHeadingRows:=True, ApplyLastRow=False,

ApplyFirstGolumn:=True,_ ApplyLastGolumn:=False, AutoFit:=True

Else

End If

End With,

Как вы уже знаете, при записи макросов для осуществления поиска создается отдельное выражение.Selection.Find.Execute. Однако, поскольку, кроме поиска, необходимо встроить еще и условную конструкцию If...Then, придется использовать выражение With.

Следующие строки устанавливают необходимые параметры для.Find. При этом обратите внимание на компактность синтаксиса метода.Execute, определяющего свойства Find, которые должны быть выполнены:

Selection.Find.ClearFormatting

With Selection.Find

.Execute FindText="Q1", Forward=True, Wrap=wdFindContinue

End With

Теперь, сразу же после строки.Execute, можно аккуратно пристроить выражение If...Then...Else:

If.Found = True Then

Selection.Tables(l).Select

Selection.Tables(1).AutoFormat Format=wdTableFormatContemporary,

ApplyBorders_

=True, ApplyShading=True, ApplyFont=True, ApplyColor=True,_

ApplyHeadingRows=True, ApplyLastRow=False,

ApplyFirstColumn=True,_

ApplyLastColumn=False, AutoFit:=True

Else

End If

Основную часть программы вы уже где-то видели, например, в написанном раньше макросе, который использует команду Автоформат, однако первая строка должна вызвать у вас большой интерес:

If.Found = True Then

Она вызывает свойство.Found объекта Find, которое сообщает о результатах работы команды Найти и заменить. Это невероятно удобно. Представьте себе, что необходимо написать макрокоманду, которая должна искать индексы в вашем документе. (Предварительно придется записать последовательность переключения режима отображения полей, чтобы они были видны в документе.) Дальше можно использовать структуру If...Then, чтобы установить индексы в том месте, где найдены введенные индексы.

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

Select Case выражение

Case Результат1

Сделать это

И еще вот это

Case Результат2

Сделать по-другому

И вот так

Case Результат3

Попытаться сделать другим образом

И попробовать таким образом

Case Else

Или вот это

И это

End Select

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


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



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