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

ЯЗЫК ПРОГРАММИРОВАНИЯ VISUAL BASIC. ПРОГРАММИРОВАНИЕ ВЕТВЛЕНИЙ

Ветвление в Visual Basic организуется с использованием:

  • условного оператора IF;
  • встроенной функции IIF;
  • оператора выбора CASE.

Для проверки одного условия и выполнения оператора или блока операторов используется условный оператор IF...THEN . Этот оператор можно использовать с разным синтаксисом: однострочным (линейным) и многострочным (блочным).

Линейный оператор имеет следующий синтаксис:

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

Блочный оператор имеет следующий синтаксис:

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

Если заданное условие имеет значение True, выполняется блок операторов, в противном случае - блок операторов2. Если предложение Else не задано, при не выполнении условия управление сразу же передается следующему после If оператору.

Оператор If может быть вложенным, т. е. находиться внутри блоков операторов. Для проверки более одного условия и выполнения одного из нескольких блоков операторов используется расширенный условный оператор вида:

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

Для выбора одного из значений в зависимости от выполнения или невыполнения некоторого условия используется условная функция IIF, имеющая следующий синтаксис:

IIF (<условие>, <значение1>, <значение2>)

Эта функция возвращает значение1, если условие истинно, и значение2, если условие ложно.

В качестве условия можно использовать логическое выражение, возвращающее значение True (Истина) или

False (Ложь), или любое арифметическое выражение (нулевое значение эквивалентно False, а ненулевое - True).

Оператор выбора SELECT CASE используется для проверки одного условия и выполнения одного из нескольких блоков операторов.

Формат записи оператора:

Select Case <проверяемое выражение>
Case <список выражений 1>
<операторы 1> Case <список выражений 2>
<операторы 2> Case <список выражений 3>
<операторы 3>
Case Else
<операторы группы Else>
End Select

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

Список выражений - одно или несколько выражений, разделенных стандартным символом - разделителем (точкой с запятой).

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

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

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

Оператор Select Case VBA языка предназначен для формирования выбора операции в зависимости от значения, по сути, данный оператор выбора является гибридом условного оператора vba if then. Все довольно просто – в сценарии есть переменная, значение которой будет изменяться, и в зависимости от значения нужно выбрать, какой блок кода (выражение) выполнить.

Как и в условном операторе , тут происходит проверка значения, например: есть текстовое поле, в которое нужно ввести данные, допустим, возраст. Далее следует проверить введенное значение, если значение меньше 18 – вывести один текст, если значение находится между 19 и 30 – другой текст, в противном случае – вывести третий текст. Как уже говорилось, для таких целей можно использовать условный оператор, однако, оператор выбора VBA Select Case является более компактным варинтом.

Синтаксис оператора VBA Select Case:

Select Case значение
Select условие 1
Набор операторов

Select условие 2
Набор операторов

Select условие 3
Набор операторов

….

Select условие N
Набор операторов N

Case Else
Другие операторы


End Select

Вначале происходит проверка параметра “значение”, который может быть как строкового, так и числового типа, после проверки параметра, происходит поочередное сравнение (начиная сначала) с каждый условием, которые прописаны в операторах Select Case VBA. Если совпадение произойдет для “условие 1”, то будет выполнен “набор операторов 1”, после чего произойдет выполнения кода, находящегося после End Select . Оператор Case Else формально означает “В противном случае”, то есть, если ни одно из условий не подходит, то выполнится набор операторов, прописанных для Case Else. Само выражение VBA - Case Else не является обязательным, как и “другие операторы”, при необходимости его можно опустить, оно всегда прописывается в конце.

Давайте рассмотрим такой пример кода:

Private Sub CommandButton1_Click() Dim a a = TextBox1.Text Select Case a Case Is < 100 Label1.Caption = "Введенное значение меньше числа 100" Case 101 To 150 Label1.Caption = "Введенное значение больше числа 100 и меньше 151" Case 151 To 200 Label1.Caption = "Введенное значение больше 151 и меньше 201" Case Else Label1.Caption = "Другое значение, оператор Select Case VBA" End Select End Sub Private Sub UserForm_Activate() " начальные настройки "***************************** Label1.Caption = "" " размер текста Label1.FontSize = 15 " цвет текста Label1.ForeColor = &HFF0000 " выравнивание по центру Label1.TextAlign = fmTextAlignCenter " включить перенос строк Label1.WordWrap = True " надпись на кнопке CommandButton1.Caption = "Показать" "начальное сожержимое текстового поля TextBox1.Text = "Введите любое значение" End Sub

В данном примере у нас есть процедура CommandButton1_Click , которая отвечает за обработку нажатия по кнопке. Переменная a будет хранить значение текстового поля TextBox1 (свойство Text). Далее следует оператор выбора Select case VBA языка, в котором происходит проверка значения переменной a, после чего, значение сравнивается с условиями:

  • Case Is < 100 – если значение переменной a меньше числа 100
  • Case 101 To 150 – если значение находится в диапазоне от 101 до 150
  • Case 151 To 200 – диапазон проверки от 151 до 200
  • Case Else – собственно, всю другие значения.

В зависимости от результат проверки, в свойство Caption, объекта , будет записанное информативное сообщение.

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

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

Sub OBModule() OBForm.Show End Sub

Тут OBModule – имя модуля (макроса), а OBForm – название формы.

Стоит обратить внимание, что даже при совпадении условие, например: меньше 100 и больше 99, в операторе выбора Select Сase произойдет выполнения лишь для первого подходящего условия, а все остальные будут проигнорированы.

Условия являются очень полезными при программировании, поскольку позволяют нам выполнять действия, в зависимости от установленных критериев (используется такой же принцип как и в IF функции Excel).

Наиболее важной функцией, которая задает условие является IF и сейчас мы посмотрим, как она работает:

If [УСЛОВИЕ ЗДЕСЬ] Then "=> ЕСЛИ условие верно, ТОГДА "Инструкции, если "правда" Else "=> В ПРОТИВНОМ СЛУЧАЕ "Инструкции, если "ложь" End If

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

Если вы введете букву в ячейку F5 , это повлечет ошибку. Мы хотим предотвратить это.

Sub variables () "Декларирование переменных Dim last_name As String, first_name As String, age As Integer, row_number As Integer "Присвоение значений переменным row_number = Range("F5") + 1 last_name = Cells(row_number, 1) first_name = Cells(row_number, 2) age = Cells(row_number, 3) "Диалоговое окно MsgBox last_name & " " & first_name & "," & age & " лет" End Sub

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

Мы воспользуемся функцией IsNumeric для проверки условия:

Sub variables () "Если значение в скобках (ячейка F5) является числовым (И ПОЭТОМУ УСЛОВИЕ IF ЕСТЬ ВЕРНЫМ) тогда "выполнить инструкции, которые следуют после THEN If IsNumeric (Range ("F5")) Then "Декларирование переменных Dim last_name As String, first_name As String, age As Integer, row_number As Integer "Присвоение значений переменным row_number = Range ("F5") + 1 last_name = Cells (row_number, 1) first_name = Cells (row_number, 2) age = Cells (row_number, 3) "Диалоговое окно MsgBox last_name & " " & first_name & "," & age & " лет" End If End Sub

Нам также нужно прописать инструкции, если поставленное нами условие не выполнится:

Sub variables () If IsNumeric (Range ("F5")) Then "Если условие выполняется "Декларирование переменных Dim last_name As String, first_name As String, age As Integer, row_number As Integer "Присвоение значений переменным row_number = Range ("F5") + 1 last_name = Cells (row_number, 1) first_name = Cells (row_number, 2) age = Cells (row_number, 3) "Диалоговое окно MsgBox last_name & " " & first_name & "," & age & " лет" Else "Если условие не выполняется "Диалоговое окно: предупреждение MsgBox "Введенное значение " & Range ("F5") & " не является верным!" "Удаление содержимого ячейки F5 Range ("F5").ClearContents End If End Sub

Теперь нечисловое значения не повлечет никаких проблем.

Работая с нашим массивом, который содержит 16 строк данных, наш следующий шаг будет в проверке является ли переменная row_number: "больше чем или равно 2" и "меньше чем или равно 17".

Но сначала взглянем на операторы сравнения:

и эти полезные операторы:

Теперь давайте добавим одно из выше указанных условий AND между операторов сравнения:

Sub variables () If IsNumeric (Range ("F5")) Then "Если числовое значение Dim last_name As String, first_name As String, age As Integer, row_number As Integer row_number = Range ("F5") + 1 If row_number> = 2 And row_number

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

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

В этом случае, мы используем функцию WorksheetFunction.CountA , которая является аналогом функции COUNTA в самом Excel.

Мы хотим, чтобы эта функция подсчитала количество непустых ячеек в первой колонке по записала полученное значение в переменную nb_rows :

Sub variables () If IsNumeric (Range ("F5")) Then "ЕСЛИ ЧИСЛО Dim last_name As String, first_name As String, age As Integer, row_number As Integer Dim nb_rows As Integer row_number = Range ("F5") + 1 nb_rows = WorksheetFunction.CountA (Range ("A:A")) "Функция подсчета количества строк If row_number > = 2 And row_number

ElseIf

ElseIf дает возможность добавлять дополнительные условия после IF команды:

If [УСЛОВИЕ 1] Then "=> ЕСЛИ условие 1 верно, ТОГДА "Инструкции 1 ElseIf [УСЛОВИЕ 2] Then "=> ЕСЛИ условие 1 неверно, но условие 2 верно, ТОГДА "Инструкции 2 Else "=> ИНАЧЕ "Инструкции 3 End If

Если УСЛОВИЕ 1 выполняется, Инструкция 1 будет выполнена и покинет оператор IF (который начинается с IF и заканчивается End If). Если УСЛОВИЕ 2 принимает значение " ложь ", тогда будет выполнена Инструкция 2 , и если она в свою очередь возвращает " ложь ", тогда Инструкция 3 (под Else ) будет выполнена.

Sub scores_comment () "Переменные Dim note As Integer, score_comment As String note = Range ("A1") "Комментарии, основанные на полученной оценке If note = 6 Then score_comment = "Великолепный бал!" ElseIf note = 5 Then score_comment = "Хороший бал" ElseIf note = 4 Then score_comment = "Удовлетворительный бал" ElseIf note = 3 Then score_comment = "Неудовлетворительный бал" ElseIf note = 2 Then score_comment = "Плохой бал" ElseIf note = 1 Then score_comment = "Ужасный бал" Else score_comment = "Нулевой бал" End If "Комментарий в ячейке B1 Range ("B1") = score_comment End Sub

Select

Существует альтернатива использованию If со многими ElseIf инструкциями, а именно команда Select , которая больше подходит к такого рода ситуаций.

Рассмотрим пример макроса с оператором Select :

Sub scores_comment () "Переменные Dim note As Integer , score_comment As String note = Range ("A1") "Комментарии, основанные на полученной оценке Select Case note "

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

Case Is > = 6 "если значение> = 6

Примеры с различными значениями:

Case Is = 6, 7 "если значение = 6 или 7 Case Is 6, 7 "если значение не равно 6 или 7 Case 6 To 10 "если значение = любому числу от 6 до 10

Пример оператора Select Case

Здесь явно не помешает пример, показывающий, как в действительности может выглядеть структура Select Case.

Select Case objRol l OfFi l m.Type

Case "Слайдовая"

intСлайдовые = intСлайдовые + 1

Case "Цветная негативная"

intЦветныеНегативные = intЦветныеНегативные + 1

Case "ЧБ негативная"

intЧБнегативные = intЧБнегативные + 1

MgaBox "Неизвестный тип пленки."

В основном этот фрагмент программного кода делает то же, что и приведенный выше программный код для примера из раздела об операторах If. . .ElseIf (опущена только проверка срока хранения). Правда, с тех пор наш гипотетический объект, представляющий ролик пленки, похоже, был немного модифицирован - информация о цветностибесцветности пленки теперь тоже представляется свойством Туре, а не отдельным свойством Color, как раньше.

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

Первое применение оператора Case в данном примере эквивалентно применению If objRollOf Film.Type = "Слайдовая" Then, т.е. если свойство Туре объекта равно "Слайдовая", то программа выполняет следующий оператор, в противном случае она перейдет ко второму оператору Case.

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

Из книги ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ВСТРОЕННЫХ СИСТЕМ. Общие требования к разработке и документированию автора Госстандарт России

Из книги Компьютер + мобильник: эффективное взаимодействие автора Гольцман Виктор Иосифович

Отправка с сайта оператора На сегодняшний день уже, наверное, все операторы поддерживают отправку SMS со своего сайта. Сообщения, правда, можно отправить только абонентам данного оператора, но этого, как правило, бывает достаточно.Итак, к практике. Сейчас мы рассмотрим

Из книги UNIX: взаимодействие процессов автора Стивенс Уильям Ричард

Пример: очереди сообщений Posix и функция select Дескриптор очереди сообщений (переменная типа mqd_t) не является «обычным» дескриптором и не может использоваться с функциями select и poll (глава 6 ). Тем не менее их можно использовать вместе с каналом и функцией mq_notify. (Аналогичный

Из книги VBA для чайников автора Каммингс Стив

Из книги Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ автора Борри Хелен

Проверка условий в операторах Select Case Структура Select Case не использует явным образом полные условные выражения, подобные тем, о которых шла речь выше (см. раздел "Курс на использование условных выражений"). Вы должны разбить каждое условие на две части, представленные как

Из книги Искусство программирования на языке сценариев командной оболочки автора Купер Мендель

Из книги Язык Си - руководство для начинающих автора Прата Стивен

Из книги Linux и UNIX: программирование в shell. Руководство разработчика. автора Тейнсли Дэвид

Из книги C++ для начинающих автора Липпман Стенли

Пример 10-24. Использование case #!/bin/bashecho; echo "Нажмите клавишу и затем клавишу Return."read Keypresscase "$Keypress" in ) echo "буква в нижнем регистре";; ) echo "Буква в верхнем регистре";; ) echo "Цифра";; *) echo "Знак пунктуации, пробел или что-то другое";;esac # Допускается указыватль

Из книги UNIX: разработка сетевых приложений автора Стивенс Уильям Ричард

Пример 10-25. Создание меню с помощью case #!/bin/bash# Грубый пример базы данныхclear # Очистка экранаecho " Список"echo " ------"echo "Выберите интересующую Вас персону:"echoecho "[E]vans, Roland"echo "[J]ones, Mildred"echo "[S]mith, Julie"echo "[Z]ane, Morris"echoread personcase "$person" in# Обратите внимание: переменная взята в кавычки.

Из книги автора

Пример 10-26. Оператор case допускает использовать подстановку команд вместо анализируемой переменной #!/bin/bash# Подстановка команд в "case".case $(arch) in # команда "arch" возвращает строку, описывающую аппаратную апхитектуру.i386) echo "Машина на базе процессора 80386";;i486) echo "Машина на базе

Из книги автора

Пример A-18. Генерация простых чисел, с использованием оператора деления по модулю (остаток от деления) #!/bin/bash# primes.sh: Генерация простых чисел, без использования массивов.# Автор: Stephane Chazelas.# Этот сценарий не использует класический алгоритм "Решето Эратосфена",#+ вместо него

Из книги автора

РАСШИРЕНИЕ ОПЕРАТОРА if С ПОМОЩЬЮ else Простейшей формой оператора if является та, которой мы только что воспользовались: if(выражение)оператор Обычно под выражением здесь понимают условное выражение, с его помощью сравниваются значения двух величин (например x > y

Из книги автора

18.8.2. Прекращение выполнения оператора case Рассмотрим следующий пример. В сценарии выполняется бесконечный цикл до тех пор, пока пользователь не введет число, большее 5. Для прерывания цикла и возврата в командную строку интерпретатора используется команда break.$ pg

Из книги автора

Из книги автора

Простой пример использования функции select Теперь мы переделаем код нашего получателя внеполосных данных и вместо сигнала SIGURG будем использовать функцию select. В листинге 24.3 показана принимающая программа.Листинг 24.3. Принимающая программа, в которой (ошибочно)