Основные принципы и концепции программирования на языке VBA в Excel

Операторы управления

Разбить на страницы
Показывать лекцию целиком

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

Управляющие операторы позволяют изменить стандартный порядок выполнения операторов. Процедура, включающая управляющие операторы, может принимать решения в зависимости от значений данных или от состояния приложения.

Управляющие операторы, определяя альтернативный порядок выполнения команд (ветвление) или повторение некоторой совокупности команд (циклы), ограничивают операторными скобками некоторую совокупность команд.

Операторы комментариев и операторы объявления переменных не являются исполнительными операторами.

Условный оператор If

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

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

  • Синтаксис оператора при записи в строку
    If condition Then [statements] [Else elsestatements]

    Например, оператор IF salary <9000 Then social=salary*0.2 вычисляет выплату, если зарплата менее 9000.

  • Синтаксис оператора при записи блоком
    If condition-1 Then
    [statements]
    [ElseIf condition-2 Then
    [elseifstatements-2] ...
    [Else
    [elsestatements]]
    End If
  • сondition-n - тестируемые выражения со значением True или False. Обязательный элемент;
  • statements, elseifstatements-2, elsestatements - последовательности операторов, необязательные элементы;
  • ElseIf - ключевое слово (записывается в одно слово), используемое для задания дополнительных условий (их может быть несколько). Необязательный элемент;
  • End If - оператор, играющий роль закрывающей операторной скобки.
  • Если условие ( condition ) верно, то выполняется последовательность операторов statements. Если условие нарушено, при записи оператора в строку выполняется последовательность операторов elsestatements, а при записи оператора блоком конструкция ElseIf позволяет задать дополнительные условия тестирования и, если ни одно из них не выполнено, то выполняются операторы elsestatements.

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

    IF salary <9000 Then
      social=salary*0.2
    Else
      social=0
    End If

    Приведенный в примере оператор вычисляет выплату, если зарплата менее 9000, и устанавливает нулевую выплату в противном случае.

    Важно:
  • Комбинируя несколько операторов сравнения, можно создать достаточно сложное логическое выражение.
  • Последовательность выполняемых действий statements, elseifstatements, elsestatements может быть пустой или состоять из нескольких операторов, записанных последовательно в разных строках или через двоеточие в одной строке. По крайней мере, одна из последовательностей должна быть непустой.
  • Часть конструкции, относящаяся к Else и к ElseIf, может быть опущена, если она не используется (нет альтернативных действий).
  • Конструкций ElseIf может быть несколько. При наличии такой конструкции отыскивается первое истинное условие, и выполняются соответствующие операторы elseifstatements.
  • Оператор EndIf обязателен в блочной структуре условного оператора и не используется при записи условного оператора в строку.
  • Возможно использование вложенных условных операторов.
  • Примеры

  • Вычисляется сумма четных чисел в интервале значений от 0 до 20 и произведение нечетных чисел в том же интервале.

    Переменная p описана как Long, т.к. значение произведения превосходит число 32767. Начальное значение переменной устанавливается в 1.

    В оператор цикла For вложен условный оператор If. Четность числа проверяется как нулевой остаток от деления на два.

    (рис 6.1) Пример вычисления суммы и произведения четных чисел в интервале значений
  • Первые двадцать ячеек столбца A меняют свой цвет. Если номер ячейки кратен трем, то цвет заливки красный. Для первой ячейки в тройке ячеек, то устанавливается синий цвет заливки. Остальные ячейки окрашиваются черным цветом.

    Запись Cells(i,1) представляет объект Range - ячейку первого столбца i-ой строки. Объект Interior - цвет заливки ячейки. Свойство ColorIndex этого объекта - номер цвета из цветовой палитры.

    (рис 6.2) Пример раскраски ячеек, значения которых имеют разные остатки от деления на 3
  • При использовании в условии числового выражения нуль интерпретируется как False, а любое значение, отличное от нуля, как True. В условии можно проверить тип выражения или значение переменной, используя специальные функции:

    Функция Синтаксис Предназначена для проверки
    IsArray IsArray(VarName) является ли переменная VarName массивом
    IsDate IsDate(expression) является ли выражение expression датой или может ли быть преобразовано в дату
    IsEmpty IsEmpty(expression) инициализирована ли переменная expression или содержит ли выражение (переменная или ячейка) пустое значение
    IsMissing IsMissing(argname) пропущен ли аргумент argname процедуры. Используется в процедурах, имеющих необязательные параметры
    IsNull IsNull(expression) имеет ли выражение expression значение Null
    IsNumeric IsNumeric(expression) является ли значение выражения expression числом
    IsObject IsObject(expression) является ли значение выражения expression объектом

    Оператор выбора Select Case

    При необходимости анализировать большое количество условий в качестве альтернативы условному оператору If используется оператор Select Case, который создает более читабельную программу. Оператор Select Case - это оператор выбора ветви в зависимости от значения тестируемого выражения.

    Синтаксис оператора

    Select Case testexpression
    [Case expressionlist-n
    [statements-n]] ...
    [Case Else
    [elsestatements]]
    End Select
  • testexpression - тестируемое выражение. Обязательный элемент;
  • строки Case задают возможные значения тестируемого выражения;
  • expressionlist - список значений тестируемого выражения, который определяет выполняемую последовательность операторов: если значение тестируемого выражения найдено в списке expressionlist-1, то выполняются операторы statements-1 и т.д.;
  • строка Case Else определяет операторы, которые выполняются, если значение не найдено ни в одном списке;
  • statements-n, elsestatements последовательности операторов.
  • Значения списка могут быть представлены константами или выражениями, имеющими числовые или символьные значения. Элементы списка перечисляются через запятую или могут иметь одну из двух форм:

  • expression (нижняя граница) To expression (верхняя граница) - задает диапазон значений списка: "от" и "до";
  • Is comparisonoperator (оператор сравнения) - задает условие на значение тестируемого выражения, при справедливости которого выполняются последующие операторы.
  • Важно:
  • По крайней мере, один список значений тестируемого выражения должен присутствовать в операторе.
  • Хотя бы одна из совокупностей операторов должна быть не пустой.
  • Тестируемое выражение может быть задано формулой.
  • Если конструкции Case Else нет в операторе выбора и значение не найдено ни в одном списке, ни одна из последовательностей операторов не выполняется.
  • После выполнения выбранной последовательности операторов соответствие тестируемого выражения другим спискам значений не проверяется, и управление передается оператору, следующему за End Select.
  • Примеры

  • Пусть необходимо вычислить значения переменной $$X$$ в зависимости от значений переменной $$A$$ по формуле:$$X=\left\{\begin{array}{ll}(A-1)^*A, \text{для }A=7,9,12,15 \\ \frac{A}{2},\text{если }A\le 5 \\ A+1, \text{для остальных значений} \end{array}\right.$$ Пусть переменная $$A$$ изменяется от -5 до 15 с шагом 1. В операторе выбора (рис 6.3) используются два списка значений: в первом списке значения перечисляются через запятую; во втором списке после ключевого слова (рис 6.3) Пример применения оператора Select Case
  • Процедура меняет цвет заливки первых двадцати ячеек столбца ).

    По сравнению с процедурой color_cells_if, записанной при помощи оператора If, новая процедура выглядит более лаконичной и прозрачной.

    (рис 6.4) Пример применения оператора Select Case
  • Операторы цикла

    Повтор действий в процедурах достигается при помощи организации циклов. Цикл - это многократно повторяемая последовательность операторов.

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

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

    Цикл For…Next

    Оператор используется для организации вычисляемого цикла ( Counted Loop ), который применяется, если известно или может быть вычислено количество повторений.

    Синтаксис оператора

    For counter = start To end [Step step]
    [statements]
    [Exit For]
    [statements]
    Next [counter]
  • counter - переменная цикла (счетчик цикла);
  • start - начальное значение переменной цикла;
  • end - конечное значение переменной цикла;
  • step - шаг цикла. Необязательное значение. По умолчанию шаг цикла равен единице;
  • Exit For - оператор немедленного выхода из цикла;
  • statements - набор повторяемых команд (тело цикла);
  • Next - оператор окончания цикла.
  • При первом входе в цикл счетчик цикла устанавливается в начальное значение ( start ). При каждом повторе к счетчику цикла прибавляется шаг цикла ( step ). Как только значение переменной цикла превысит конечное значение, цикл завершается. Можно подсчитать, сколько раз выполнится цикл: например, если шаг цикла равен единице, то цикл выполняется end-start+1 раз и каждый раз с новым значением счетчика цикла.

    Внимание:
  • counter - числовая переменная. Счетчик цикла обычно участвует в вычислениях внутри цикла.
  • Параметры цикла start, end, step могут быть заданы числами, числовыми переменными или числовыми выражениями.
  • Параметры цикла вычисляются при входе в цикл и не изменяются во время выполнения цикла, даже если меняются переменные, влияющие на эти значения.
  • Параметры цикла могут иметь положительные и отрицательные значения.
  • Внутри тела цикла не рекомендуется присваивать новые значения переменной цикла, т.к. это может вызвать зацикливание.
  • Счетчик цикла можно использовать и по завершении цикла. По окончании цикла значение счетчика цикла равно конечному значению плюс шаг.
  • Рекомендуется указывать в операторе Next идентификатор счетчика цикла, так как в случае использования вложенных циклов часто трудно определить, где кончается тот или иной цикл.
  • Оператор Exit For осуществляет немедленный выход из цикла независимо от значения счетчика цикла.
  • Примеры

  • Распечатать в окне ).

    Переменная i (счетчик цикла) в процессе выполнения цикла меняет значение от 1 (устанавливается выражением i=1 ) до значения 5, заданного выражением To 5. Шаг изменения значений переменной i по умолчанию 1.

    (рис 6.5) Распечатка в окне Immediate первых пяти целых чиселМожно было бы записать все операторы на одной строке, используя двоеточие как разделитель между операторами
    For i=1 To 5: Debug.Print i : Next i.
  • Подсчитать сумму чисел от 1 до 1000 (рис 6.6).

    В процедуре используются два оператора присваивания: s=0, s=s+n. Первый оператор устанавливает начальное значение для суммы чисел, а второй наращивает эту сумму в процессе вычислений.

    (рис 6.6) Пример суммирования чисел от 1 до 1000
  • Цикл For Each…Next

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

    Синтаксис оператора

    For Each element In group
    [statements]
    [Exit For]
    [statements]
    Next [element]
  • element - переменная, значения которой суть элементы из группы;
  • group - массив данных или группа объектов;
  • statements - последовательность операторов, выполняемая для каждого элемента;
  • Exit For - оператор, осуществляющий немедленный выход из цикла.
  • Важно:
  • Если цикл выполняется для массива, то переменная element должна быть переменной типа Variant.
  • Если цикл выполняется для коллекции объектов, то тип переменной element - Object или должен совпадать с типом элементов коллекции объектов.
  • Не рекомендуется внутри цикла изменять количество элементов массива или группы, так как новый элемент может не обработаться командами тела цикла.
  • Цикл For Each для группы объектов более эффективен, чем цикл For Next.
  • Примеры

  • Просуммировать элементы массива.

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

    В цикле объектного типа подсчитывается сумма элементов массива: переменная цикла i принимает значения элементов массива.

    (рис 6.7) Суммирование элементов массива
  • Заполнить интервал ячеек последовательными натуральными числами.

    Переменная Obj_range объявлена как объект Range и ее значение устанавливается оператором Set как ссылка на интервал ячеек A1:B6.

    Переменная p (переменная цикла объектного типа) перебирает все ячейки интервала Obj_range, устанавливая их значения в номер элемента.

    (рис 6.8) Заполнение интервала ячеек последовательными натуральными числами
  • Цикл Do…Loop

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

    Синтаксис оператора

    Do [(While|Until) condition]
    [statements]
    [Exit Do]
    [statements]
    Loop [(While | Until) condition]
  • condition - тестируемое выражение со значением True или False ;
  • While|UntilЗапись While|Until означает, что в операторе присутствует только одно ключевое слово из двух. - ключевые слова, которые определяют, до каких пор будут выполняться команды, составляющие тело цикла:
  • While - повтор операторов, пока условие ( condition ) истинно;
  • Until - повтор операторов, пока условие ложно (пока условие не станет истинным).
  • Таким образом, циклы с ключевым словом While эквивалентны циклам Until, в которых перед условием стоит Not:
    While condition = Until Not condition
  • Exit Do - оператор немедленного выхода из цикла;
  • statements - последовательность операторов, выполняемых в цикле.
  • По сути, оператор имеет пять вариантов синтаксиса. В первых двух вариантах While|Until condition проверяется в начале цикла. В следующих двух вариантах While|Until condition проверяется в конце цикла. Пятый вариант - оператор цикла без задания условия.

    Замечания:
  • Если While|Until condition отсутствует, то в теле цикла должна осуществляться проверка условия выхода из цикла или продолжения цикла и должен стоять оператор немедленного выхода из цикла Exit Do.
  • Если условие выполнения цикла проверяется в начале, то команды внутри цикла не выполнятся ни разу, если при входе в цикл условие нарушено.
  • Команды тела цикла выполняются хотя бы один раз при проверке условия продолжения цикла в конце оператора цикла.
  • Возможно использование вложенных циклов, в том числе разных конструкций. Оператор Exit Do всегда завершает внутренний цикл.
  • Пример

    Поиск первой непустой ячейки в первой строке рабочего листа.

    Рассмотрим два способа записи оператора ) и с условием в конце оператора цикла (постусловие) (рис 6.10).

    (рис 6.10) Способ записи оператора Do…Loop с условием в начале оператора цикла(рис 6.9) Способ записи оператора Do…Loop с условием в конце оператора цикла

    Аргумент ActiveSheet.Cells(1,i) функции IsEmpty определяет очередную ячейку первой строки активного листа. Оператор Exit Sub немедленно завершает процедуру, если просмотрены все 256 ячеек первой строки и непустая ячейка не найдена ( i=257 ).

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

    В первом случае цикл выполняется до тех пор, пока ячейка пуста. Тестирование выполняется до входа в цикл. Во втором случае цикл выполняется до тех пор, пока ячейка не станет непустой. Тестирование выполняется в конце цикла.

    Цикл While…Wend

    Этот способ организации цикла повторяет команды, пока заданное условие верно. Он полностью эквивалентен циклу Do…Loop с условием While в первой строке оператора.

    Синтаксис оператора

    While condition
    statements 
    Wend
  • condition - тестируемое выражение со значением True или False ;
  • statements - последовательность операторов, выполняемых в цикле.
  • Внимание:
  • При таком способе организации цикла не применяется оператор немедленного завершения цикла.
  • Приведем процедуру расчета зарплаты с использованием этого оператора цикла

    Выполняется проверка введенных значений h и r, если оба не равны нулю, то проводится расчет и запрос на ввод данных о следующем сотруднике. В противном случае цикл завершается.

    (рис 6.11) Пример цикла While… Wend
    Страницы:

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

    Управляющие операторы позволяют изменить стандартный порядок выполнения операторов. Процедура, включающая управляющие операторы, может принимать решения в зависимости от значений данных или от состояния приложения.

    Управляющие операторы, определяя альтернативный порядок выполнения команд (ветвление) или повторение некоторой совокупности команд (циклы), ограничивают операторными скобками некоторую совокупность команд.

    Операторы комментариев и операторы объявления переменных не являются исполнительными операторами.

    Условный оператор If

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

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

  • Синтаксис оператора при записи в строку
    If condition Then [statements] [Else elsestatements]

    Например, оператор IF salary <9000 Then social=salary*0.2 вычисляет выплату, если зарплата менее 9000.

  • Синтаксис оператора при записи блоком
    If condition-1 Then
    [statements]
    [ElseIf condition-2 Then
    [elseifstatements-2] ...
    [Else
    [elsestatements]]
    End If
  • сondition-n - тестируемые выражения со значением True или False. Обязательный элемент;
  • statements, elseifstatements-2, elsestatements - последовательности операторов, необязательные элементы;
  • ElseIf - ключевое слово (записывается в одно слово), используемое для задания дополнительных условий (их может быть несколько). Необязательный элемент;
  • End If - оператор, играющий роль закрывающей операторной скобки.
  • Если условие ( condition ) верно, то выполняется последовательность операторов statements. Если условие нарушено, при записи оператора в строку выполняется последовательность операторов elsestatements, а при записи оператора блоком конструкция ElseIf позволяет задать дополнительные условия тестирования и, если ни одно из них не выполнено, то выполняются операторы elsestatements.

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

    IF salary <9000 Then
      social=salary*0.2
    Else
      social=0
    End If

    Приведенный в примере оператор вычисляет выплату, если зарплата менее 9000, и устанавливает нулевую выплату в противном случае.

    Важно:
  • Комбинируя несколько операторов сравнения, можно создать достаточно сложное логическое выражение.
  • Последовательность выполняемых действий statements, elseifstatements, elsestatements может быть пустой или состоять из нескольких операторов, записанных последовательно в разных строках или через двоеточие в одной строке. По крайней мере, одна из последовательностей должна быть непустой.
  • Часть конструкции, относящаяся к Else и к ElseIf, может быть опущена, если она не используется (нет альтернативных действий).
  • Конструкций ElseIf может быть несколько. При наличии такой конструкции отыскивается первое истинное условие, и выполняются соответствующие операторы elseifstatements.
  • Оператор EndIf обязателен в блочной структуре условного оператора и не используется при записи условного оператора в строку.
  • Возможно использование вложенных условных операторов.
  • Примеры

  • Вычисляется сумма четных чисел в интервале значений от 0 до 20 и произведение нечетных чисел в том же интервале.

    Переменная p описана как Long, т.к. значение произведения превосходит число 32767. Начальное значение переменной устанавливается в 1.

    В оператор цикла For вложен условный оператор If. Четность числа проверяется как нулевой остаток от деления на два.

    (рис 6.1) Пример вычисления суммы и произведения четных чисел в интервале значений
  • Первые двадцать ячеек столбца A меняют свой цвет. Если номер ячейки кратен трем, то цвет заливки красный. Для первой ячейки в тройке ячеек, то устанавливается синий цвет заливки. Остальные ячейки окрашиваются черным цветом.

    Запись Cells(i,1) представляет объект Range - ячейку первого столбца i-ой строки. Объект Interior - цвет заливки ячейки. Свойство ColorIndex этого объекта - номер цвета из цветовой палитры.

    (рис 6.2) Пример раскраски ячеек, значения которых имеют разные остатки от деления на 3
  • При использовании в условии числового выражения нуль интерпретируется как False, а любое значение, отличное от нуля, как True. В условии можно проверить тип выражения или значение переменной, используя специальные функции:

    Функция Синтаксис Предназначена для проверки
    IsArray IsArray(VarName) является ли переменная VarName массивом
    IsDate IsDate(expression) является ли выражение expression датой или может ли быть преобразовано в дату
    IsEmpty IsEmpty(expression) инициализирована ли переменная expression или содержит ли выражение (переменная или ячейка) пустое значение
    IsMissing IsMissing(argname) пропущен ли аргумент argname процедуры. Используется в процедурах, имеющих необязательные параметры
    IsNull IsNull(expression) имеет ли выражение expression значение Null
    IsNumeric IsNumeric(expression) является ли значение выражения expression числом
    IsObject IsObject(expression) является ли значение выражения expression объектом

    Оператор выбора Select Case

    При необходимости анализировать большое количество условий в качестве альтернативы условному оператору If используется оператор Select Case, который создает более читабельную программу. Оператор Select Case - это оператор выбора ветви в зависимости от значения тестируемого выражения.

    Синтаксис оператора

    Select Case testexpression
    [Case expressionlist-n
    [statements-n]] ...
    [Case Else
    [elsestatements]]
    End Select
  • testexpression - тестируемое выражение. Обязательный элемент;
  • строки Case задают возможные значения тестируемого выражения;
  • expressionlist - список значений тестируемого выражения, который определяет выполняемую последовательность операторов: если значение тестируемого выражения найдено в списке expressionlist-1, то выполняются операторы statements-1 и т.д.;
  • строка Case Else определяет операторы, которые выполняются, если значение не найдено ни в одном списке;
  • statements-n, elsestatements последовательности операторов.
  • Значения списка могут быть представлены константами или выражениями, имеющими числовые или символьные значения. Элементы списка перечисляются через запятую или могут иметь одну из двух форм:

  • expression (нижняя граница) To expression (верхняя граница) - задает диапазон значений списка: "от" и "до";
  • Is comparisonoperator (оператор сравнения) - задает условие на значение тестируемого выражения, при справедливости которого выполняются последующие операторы.
  • Важно:
  • По крайней мере, один список значений тестируемого выражения должен присутствовать в операторе.
  • Хотя бы одна из совокупностей операторов должна быть не пустой.
  • Тестируемое выражение может быть задано формулой.
  • Если конструкции Case Else нет в операторе выбора и значение не найдено ни в одном списке, ни одна из последовательностей операторов не выполняется.
  • После выполнения выбранной последовательности операторов соответствие тестируемого выражения другим спискам значений не проверяется, и управление передается оператору, следующему за End Select.
  • Примеры

  • Пусть необходимо вычислить значения переменной $$X$$ в зависимости от значений переменной $$A$$ по формуле:$$X=\left\{\begin{array}{ll}(A-1)^*A, \text{для }A=7,9,12,15 \\ \frac{A}{2},\text{если }A\le 5 \\ A+1, \text{для остальных значений} \end{array}\right.$$ Пусть переменная $$A$$ изменяется от -5 до 15 с шагом 1. В операторе выбора (рис 6.3) используются два списка значений: в первом списке значения перечисляются через запятую; во втором списке после ключевого слова (рис 6.3) Пример применения оператора Select Case
  • Процедура меняет цвет заливки первых двадцати ячеек столбца ).

    По сравнению с процедурой color_cells_if, записанной при помощи оператора If, новая процедура выглядит более лаконичной и прозрачной.

    (рис 6.4) Пример применения оператора Select Case
  • Операторы цикла

    Повтор действий в процедурах достигается при помощи организации циклов. Цикл - это многократно повторяемая последовательность операторов.

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

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

    Цикл For…Next

    Оператор используется для организации вычисляемого цикла ( Counted Loop ), который применяется, если известно или может быть вычислено количество повторений.

    Синтаксис оператора

    For counter = start To end [Step step]
    [statements]
    [Exit For]
    [statements]
    Next [counter]
  • counter - переменная цикла (счетчик цикла);
  • start - начальное значение переменной цикла;
  • end - конечное значение переменной цикла;
  • step - шаг цикла. Необязательное значение. По умолчанию шаг цикла равен единице;
  • Exit For - оператор немедленного выхода из цикла;
  • statements - набор повторяемых команд (тело цикла);
  • Next - оператор окончания цикла.
  • При первом входе в цикл счетчик цикла устанавливается в начальное значение ( start ). При каждом повторе к счетчику цикла прибавляется шаг цикла ( step ). Как только значение переменной цикла превысит конечное значение, цикл завершается. Можно подсчитать, сколько раз выполнится цикл: например, если шаг цикла равен единице, то цикл выполняется end-start+1 раз и каждый раз с новым значением счетчика цикла.

    Внимание:
  • counter - числовая переменная. Счетчик цикла обычно участвует в вычислениях внутри цикла.
  • Параметры цикла start, end, step могут быть заданы числами, числовыми переменными или числовыми выражениями.
  • Параметры цикла вычисляются при входе в цикл и не изменяются во время выполнения цикла, даже если меняются переменные, влияющие на эти значения.
  • Параметры цикла могут иметь положительные и отрицательные значения.
  • Внутри тела цикла не рекомендуется присваивать новые значения переменной цикла, т.к. это может вызвать зацикливание.
  • Счетчик цикла можно использовать и по завершении цикла. По окончании цикла значение счетчика цикла равно конечному значению плюс шаг.
  • Рекомендуется указывать в операторе Next идентификатор счетчика цикла, так как в случае использования вложенных циклов часто трудно определить, где кончается тот или иной цикл.
  • Оператор Exit For осуществляет немедленный выход из цикла независимо от значения счетчика цикла.
  • Примеры

  • Распечатать в окне ).

    Переменная i (счетчик цикла) в процессе выполнения цикла меняет значение от 1 (устанавливается выражением i=1 ) до значения 5, заданного выражением To 5. Шаг изменения значений переменной i по умолчанию 1.

    (рис 6.5) Распечатка в окне Immediate первых пяти целых чиселМожно было бы записать все операторы на одной строке, используя двоеточие как разделитель между операторами
    For i=1 To 5: Debug.Print i : Next i.
  • Подсчитать сумму чисел от 1 до 1000 (рис 6.6).

    В процедуре используются два оператора присваивания: s=0, s=s+n. Первый оператор устанавливает начальное значение для суммы чисел, а второй наращивает эту сумму в процессе вычислений.

    (рис 6.6) Пример суммирования чисел от 1 до 1000
  • Цикл For Each…Next

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

    Синтаксис оператора

    For Each element In group
    [statements]
    [Exit For]
    [statements]
    Next [element]
  • element - переменная, значения которой суть элементы из группы;
  • group - массив данных или группа объектов;
  • statements - последовательность операторов, выполняемая для каждого элемента;
  • Exit For - оператор, осуществляющий немедленный выход из цикла.
  • Важно:
  • Если цикл выполняется для массива, то переменная element должна быть переменной типа Variant.
  • Если цикл выполняется для коллекции объектов, то тип переменной element - Object или должен совпадать с типом элементов коллекции объектов.
  • Не рекомендуется внутри цикла изменять количество элементов массива или группы, так как новый элемент может не обработаться командами тела цикла.
  • Цикл For Each для группы объектов более эффективен, чем цикл For Next.
  • Примеры

  • Просуммировать элементы массива.

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

    В цикле объектного типа подсчитывается сумма элементов массива: переменная цикла i принимает значения элементов массива.

    (рис 6.7) Суммирование элементов массива
  • Заполнить интервал ячеек последовательными натуральными числами.

    Переменная Obj_range объявлена как объект Range и ее значение устанавливается оператором Set как ссылка на интервал ячеек A1:B6.

    Переменная p (переменная цикла объектного типа) перебирает все ячейки интервала Obj_range, устанавливая их значения в номер элемента.

    (рис 6.8) Заполнение интервала ячеек последовательными натуральными числами
  • Цикл Do…Loop

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

    Синтаксис оператора

    Do [(While|Until) condition]
    [statements]
    [Exit Do]
    [statements]
    Loop [(While | Until) condition]
  • condition - тестируемое выражение со значением True или False ;
  • While|UntilЗапись While|Until означает, что в операторе присутствует только одно ключевое слово из двух. - ключевые слова, которые определяют, до каких пор будут выполняться команды, составляющие тело цикла:
  • While - повтор операторов, пока условие ( condition ) истинно;
  • Until - повтор операторов, пока условие ложно (пока условие не станет истинным).
  • Таким образом, циклы с ключевым словом While эквивалентны циклам Until, в которых перед условием стоит Not:
    While condition = Until Not condition
  • Exit Do - оператор немедленного выхода из цикла;
  • statements - последовательность операторов, выполняемых в цикле.
  • По сути, оператор имеет пять вариантов синтаксиса. В первых двух вариантах While|Until condition проверяется в начале цикла. В следующих двух вариантах While|Until condition проверяется в конце цикла. Пятый вариант - оператор цикла без задания условия.

    Замечания:
  • Если While|Until condition отсутствует, то в теле цикла должна осуществляться проверка условия выхода из цикла или продолжения цикла и должен стоять оператор немедленного выхода из цикла Exit Do.
  • Если условие выполнения цикла проверяется в начале, то команды внутри цикла не выполнятся ни разу, если при входе в цикл условие нарушено.
  • Команды тела цикла выполняются хотя бы один раз при проверке условия продолжения цикла в конце оператора цикла.
  • Возможно использование вложенных циклов, в том числе разных конструкций. Оператор Exit Do всегда завершает внутренний цикл.
  • Пример

    Поиск первой непустой ячейки в первой строке рабочего листа.

    Рассмотрим два способа записи оператора ) и с условием в конце оператора цикла (постусловие) (рис 6.10).

    (рис 6.10) Способ записи оператора Do…Loop с условием в начале оператора цикла(рис 6.9) Способ записи оператора Do…Loop с условием в конце оператора цикла

    Аргумент ActiveSheet.Cells(1,i) функции IsEmpty определяет очередную ячейку первой строки активного листа. Оператор Exit Sub немедленно завершает процедуру, если просмотрены все 256 ячеек первой строки и непустая ячейка не найдена ( i=257 ).

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

    В первом случае цикл выполняется до тех пор, пока ячейка пуста. Тестирование выполняется до входа в цикл. Во втором случае цикл выполняется до тех пор, пока ячейка не станет непустой. Тестирование выполняется в конце цикла.

    Цикл While…Wend

    Этот способ организации цикла повторяет команды, пока заданное условие верно. Он полностью эквивалентен циклу Do…Loop с условием While в первой строке оператора.

    Синтаксис оператора

    While condition
    statements 
    Wend
  • condition - тестируемое выражение со значением True или False ;
  • statements - последовательность операторов, выполняемых в цикле.
  • Внимание:
  • При таком способе организации цикла не применяется оператор немедленного завершения цикла.
  • Приведем процедуру расчета зарплаты с использованием этого оператора цикла

    Выполняется проверка введенных значений h и r, если оба не равны нулю, то проводится расчет и запрос на ввод данных о следующем сотруднике. В противном случае цикл завершается.

    (рис 6.11) Пример цикла While… Wend
    Вернуться к учебному плану