Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


VBA Excel. Управляющие структуры языка



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

Как и во всех других языках программирования, в VBA имеются различные управляющие конструкции, позволяющие изменять порядок выполнения программы. Если управляющие конструкции не используются, происходит последовательное выполнение операторов языка программирования, начиная с самого первого и кончая последним. Хотя в некоторых самых простых случаях этого и бывает достаточно, обычно все-таки требуется изменять порядок исполнения операторов при выполнении определенных условий, либо пропуская выполнение некоторых операторов, либо, наоборот, многократно повторяя их. Оказывается, для реализации любых алгоритмов достаточно иметь только два вида конструкций управления: ветвления и циклы.

Ветвления

Управляющие конструкции ветвления позволяют проверить некоторое условие и, в зависимости от результатов этой проверки, выполнить ту или иную группу операторов. Для организации ветвлений в VBA используются различные формы оператора ветвления If и-оператор выбора Select Case.

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

If < условие> Then < оператор>

В блочной форме краткое ветвление выглядит следующим образом:

If < условие> Then< оператор1> < оператор2> End If

В качестве условия можно использовать логическое выражение, возвращающее значение True или False, или любое арифметическое выражение. Если применяется арифметическое выражение, то нулевое значение этого выражения эквивалентно логическому значению False, а любое ненулевое выражение эквивалентно True. В том случае, когда условие возвращает значение False, оператор или блок операторов, заключенных между ключевыми словами Then и End if и составляющих тело краткого оператора ветвления, не будет выполняться.

Замечание
Обратите внимание, что при записи краткого оператора ветвления в одну строку ключевые слова End if не используются
.

Полная форма оператора if используется в тех случаях, когда имеются два различных блока операторов и по результатам проверки условия нужно выполнить один из них. Такая форма if не может записываться в одну строку и всегда имеет блочную форму записи:

If < условие> Then< блокОператоров1> Else< блокОператоров2> End If

Если условие истинно, выполняется первый блок операторов, заключенный между ключевыми словами Then и Else, а в противном случае – второй блок, заключенный между ключевыми словами Else и End If.

Совет
Для того чтобы текст вашей процедуры был понятным и удобным для восприятия, рекомендуется делать отступы для групп операторов так, как это указано при описании их синтаксиса. В VBA предусмотрено удобное средство изменения отступов – нажатие на клавишу Таb увеличивает отступ вправо, нажатие комбинации клавиш SHIFT + Tab уменьшает этот отступ
.

Иногда приходится делать выбор одного действия из целой группы действий на основе проверки нескольких различных условий. Для этого можно использовать цепочку операторов ветвления If…Then… Elseif:

If < условие1> Then< блокОператоров1> Elseif < условие2> Then< блокОператоров2> Elseif < условие3> Then< блокОператоров3> Elseif < условиеN> Then< блокОператоровN> Else< блокОператоров_Еlsе> End If

Такие цепочки операторов If…Then…Elseif обладают большой гибкостью и позволяют решить все проблемы, однако если выбор одной из нескольких возможностей все время основан на различных значениях одного и того же выражения, гораздо удобнее использовать специально предназначенный для этого оператор выбора Select Case, имеющий следующий синтаксис:

Select Case < проверяемоеВыражение> Case < списокЗначений1> < блокОператоров1> Case < списокЗначений2> < блокОператоров2> Case < списокЗначени3> < блокОператоров3> Case Else< блокОператоровЕlsе> End Select

Проверяемое выражение вычисляется в начале работы оператора Select Case. Это выражение может возвращать значение любого типа, например логическое, числовое или строковое.

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

Эти элементы списка выражений могут иметь одну из следующих форм:

· < выражение> в данном случае проверяется, совпадает ли значение проверяемого выражения с этим выражением;

· < выражение1> То < выражение2> в этом случае проверяется, находится ли значение проверяемого выражения в указанном диапазоне значений;

· Is < логическийОператор> < выражение> в третьем случае проверяемое выражение сравнивается с указанным значением с помощью заданного логического оператора; например, условие is > = 10 считается выполненным, если проверяемое значение не меньше 10.

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



Циклы

В VBA имеется богатый выбор средств организации циклов, которые можно разделить на две основные группы – циклы с условием Do… Loop и циклы с перечислением For…Next.

Циклы типа Do… Loop используются в тех случаях, когда заранее неизвестно, сколько раз должно быть повторено выполнение блока операторов, составляющего тело цикла. Такой цикл продолжает свою работу до тех пор, пока не будет выполнено определенное условие. Существуют четыре вида циклов Do…Loop, которые различаются типом проверяемого условия и временем выполнения этой проверки. В табл. 13.2 приводится синтаксис этих четырех конструкций.

Таблица 13.2. Синтаксис операторов цикла Do

Конструкция Описание
Do While < условие> < блокОператоров> Loop Условие проверяется до того, как выполняется группа операторов, образующих тело цикла. Цикл продолжает свою работу, пока это условие выполняется (то есть имеет значение True), иными словами, в этой конструкции указывается условие продолжения работы цикла
Do Until < условие> < блокОператоров> Loop Условие проверяется до того, как выполняется группа операторов, образующих тело цикла. Цикл продолжает свою работу, если это условие еще не выполнено, и прекращает работу, когда оно станет истинным, иными словами, в этой конструкции указывается условие прекращения работы цикла
Do < блокОператоров> Loop Until < условие> Условие проверяется после того, как операторы, составляющие тело цикла, будут выполнены хотя бы один раз. Цикл продолжает свою работу, если это условие еще не выполнено, а когда оно станет истинным, цикл прекращает работу, иными словами, в этой конструкции указывается условие прекращения работы цикла
Do < блокОператоров> Loop While < условие> Условие проверяется после того, как операторы, составляющие тело цикла, будут выполнены хотя бы один раз. Цикл продолжает свою работу, пока это условие остается истинным, иными словами, в этой конструкции указывается условие продолжения работы цикла

Имеется также две разновидности оператора цикла с перечислением For…Next. Очень часто при обработке массивов, а также в тех случаях, когда требуется повторить выполнение некоторой группы операторов заданное число раз, используется цикл For… Next со счетчиком. В отличие от циклов Do…Loop, данный тип цикла использует специальную переменную, называемую счетчиком, значение которой увеличивается или уменьшается при каждом выполнении тела цикла на определенную величину. Когда значение этой переменной достигает заданного значения, выполнение цикла заканчивается.

Синтаксис этого вида цикла выглядит, следующим образом (в квадратные скобки заключены необязательные элементы синтаксической конструкции):

For < счетчик> = < начальноеЗначение>

То < конечноеЗначение>

[Step < приращение> ]

< блокОператоров> Next [< счетчик> ]

Несколько пояснений к приведенному описанию:

· < приращение> – может быть как положительным, так и отрицательным числом. Если использовать отрицательное приращение, то конечное значение должно быть меньше либо равно начальному значению для того, чтобы тело цикла выполнилось хотя бы один раз;

· после завершения работы цикла For…Next переменная, которая использовалась в качестве счетчика, получает значение, обязательно превосходящее конечное значение в том случае, если приращение положительно, и строго меньшее конечного значения, если приращение отрицательно;

· если начальное и конечное значения совпадают, тело цикла выполняется лишь один раз.

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

For Each < элемент> In < совокупность>

< блокОператоров>

Next [< элемент> ]

Где:

· < элемент> – это переменная, используемая для ссылки на элементы семейства объектов;

· < совокупность> – это имя массива или семейства.

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

Public Sub EnumerateAllFields()

Dim MyBase As Database

Dim tdf As TableDef, fid As Field

Set MyBase = CurrentDb()

For Each tdf In MyBase.TableDefs

Debug.Print " Таблица: " & tdf.Name

For Each fid In tdf.Fields

Debug.Print " Поле: " & fid.Name Next fid

Next tdf

Set MyBase = Nothing

End Sub

Итак, в операторах Dim мы объявили переменную MyBase как объект " база данных DАО", переменные tdf и fid – как определение таблицы и поле таблицы, соответственно. Оператор Set назначает переменной MyBase текущую открытую базу данных. Далее для каждого определения таблицы выполняется вывод на печать названия таблицы, а затем вложенный цикл такого же типа печатает названия всех ее полей.

Приведем еще один пример использования подобного оператора цикла For Each…Next для обработки всех элементов многомерного массива. Пусть у нас имеется трехмерный числовой массив из 1000 элементов (размерами 10x10x10), который мы хотим заполнить случайными вещественными числами в диапазоне от 0 до 1. Если бы мы применяли обычные циклы For…Next со счетчиками, используя счетчики в качестве индексов элементов массива, то для решения этой задачи потребовалось бы написать три вложенных цикла For… Next:

Dim tArray{9, 9, 9) As Single

Dim i%, j%, k%

Randomize

For i=0 To 9

For j=0 To 9

For k=0 To 9

tArray(i, j, k) = Rnd()

Next k

Next j

Next i

На самом же деле достаточно всего одного цикла, если вместо циклов со счетчиками воспользоваться циклом For Each… Next:

Dim tArray(9, 9, 9) As Single

Dim elem As Variant

Randomize

For Each elem In tArray

elem = Rnd()

Next

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


Поделиться:



Последнее изменение этой страницы: 2019-04-09; Просмотров: 293; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.024 с.)
Главная | Случайная страница | Обратная связь