Домашняя страница Undo Do Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Статьи об Excel

МЕНЮ САЙТА
  • 1
  • 2
  • 3

КАТЕГОРИИ РАЗДЕЛА
Циклы [4]
Циклы VBA
Операторы ветвления [2]
Модули классов [2]
Создание, поля, свойства, события, когда использовать
Работа с приложениями и библиотеками [2]
Создание надстроек для ексель на .net, вызов компонентов .net

ОПРОСЫ
Какой версией Excel Вы пользуетесь?
Всего ответов: 35654
Главная » Статьи » Программирование на VBA » Операторы ветвления

Оператор ветвления "Select Case"

 

При создании сложных программ один из ключевых моментов - возможность предусмотреть несколько вариантов развития событий. Самый простой и классический пример - оператор "If ... Then ... Else ... End", который позволяет выбрать одно из двух действий в зависимости от результатов проверки каких-либо значений. Бывает, что в результате такой проверки необходимо выбрать из множества вариантов. Один из выходов: добавить множество "... ElseIf ...", что несколько усложняет синтаксис программы (лёгкость её чтения). Однако это очень мощный оператор, открывающий большие возможности. Подробнее о нём можно узнать здесь.

 

Альтернативой оператору "If ... End" служит оператор "Select Case" (с английского "Select Case" можно перевести как "Выбор Ситуации"), который упрощает восприятие кода "на глаз". И если "If ... End" оператор в каждом своём "ElseIf" вынужден обращаться к проверяемым значениям снова и снова (допустим, выражение каждый раз одинаковое), то "Select Case" делает это только один раз, что позволяет последнему на больших массивах данных работать быстрее. Этот оператор позволяет удобно задать ветвление программы из одной точки в большое количество веток. То есть в основном применяется при множественных условиях проверки, когда проверяемых условий больше двух.

 

Структура оператора "Select Case".

 

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

Select Case [Проверяемое Значение]
    Case [Конкретное Значение]
        [Некоторое Действие]
    Case Else
        [Некоторое Действие Х]
End Select

В качестве куска [Значение] можно вставить любую переменную или свойство, значение которой или которого Вы можете проверить. Можно также проверять значение конкретной ячейки. При этом работать можно не только с числами, но и с текстами. И даже с булевыми значениями TRUE/FALSE («Правда» и «Ложь»), о чем знают не все.

 

[Конкретное Значение] - это то, с чем сравнивается [Проверяемое Значение]. И, если одно удовлетворяет другому, то выполняется [Некоторое Действие]. Есть несколько вариантов записи для блока [Конкретное Значение]. Для текстовых и числовых значений можно записывать разные значения через запятую:

Case 3, 4, 5, "да", "нет"

Для чисел можно выбирать диапазоны:

Case 3 to 10 'От 3-х до 10-ти, включая сами 3 и 10.

Также для чисел можно использовать логический оператор сравнения вместе с частицей "Is":

Case Is < 2 'Меньше 2, НЕ включая 2
Case Is = 3 'Равно 3-м. Избыточная запись, достаточно Case 3
Case Is >= 4 'Больше либо равно 4
Case Is <> 0 'Не равно нулю

Допустимо использовать и логические операторы, что позволит предусматривать сложнейшие случаи и проводить параллельные сравнения с другими переменными. Кроме оператора «Or», который заменяется обычной запятой.

Case ... And ...
Case Not ...

[Некоторое Действие] может быть абсолютно любым. Если вы его пропускаете - то для данного случая программа будет бездействовать. «Case [Конкретное Значение]» вместе с частью [Некоторое Действие] складываются в один блок:

Case [Конкретное Значение]
    [Некоторое Действие]

Таких блоков может быть любое количество, которое уложится в предельные размеры процедуры (она должна весить не более 64 килобайт). Полезно знать, что VBA просматривает соответствие [Конкретного Значения] и [Проверяемого Значения] вдоль по блокам сверху вниз. То есть, у Вас может быть два блока с одинаковым "Case", но выполнится только тот, который будет раньше найден программой при просмотре кода сверху вниз.

 

Case Else - это все другие случаи, которые не подошли ни под одно другое [Конкретное Значение] во всех блоках оператора "Select Case". Если блок "Case Else" отсутствует и ни один другой блок не подошёл, то программа делает логичное "ничего". Case Else должен быть последним проверяемым случаем среди всех блоков проверки в операторе. После него других блоков быть не должно, иначе получим синтаксическую ошибку "Case without Select Case".

 

В конце оператора должен стоять "End Select", который служит "точкой" в "предложении" оператора.

 

Примеры использования.

 

Рассмотрим несколько примеров использования кода и начнём с самого простого. В первом примере в зависимости от значения Х выводится сообщение.

Sub SelectCase_example_1()

Dim X As Long
X = 1 'Можете изменять эту цифру и смотреть, что получится.

Select Case X
    Case 1
        MsgBox "Один"
    Case 2
        MsgBox "Два"
    Case 3
        MsgBox "Три"
    Case Else
        MsgBox "Выбрано что-то другое"
End Select

End Sub

Второй пример показывает некоторые виды записи проверяемого значения. В зависимости от количества листов в книге с макросом выводится разное сообщение. Обратите внимание, что если листов в книге 7, то первым сработает “Case 7”, хотя условие “Case 5 to 12” тоже подходит, но стоит позже.

Sub SelectCase_example_2()

'Введём переменную и посчитаем количество листов в текущей книге:
Dim X As Long
X = ThisWorkbook.Sheets.Count

Select Case X 'В зависимости от количества листов в книге выведем сообщение.
    Case 1 'Если 1 лист, то...
        MsgBox "Один лист в книге"
    Case 2, 3, 4 'Если листов 2 или 3 или 4
        MsgBox "Несколько листов в книге"
    Case 7 'Если листов 7
        MsgBox "Красивое количество листов"
    Case 5 To 12 'Если листов от 5 до 12
        MsgBox "Почти брошюра"
    Case Is >= 14 'Если листов больше либо равно 14
        MsgBox "Листов как в фолианте"
    Case Else 'Все остальные случаи, а именно 13
        MsgBox "Чёртова дюжина листов"
End Select

End Sub

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

Sub SelectCase_example_3()

'Введём переменную и привяжем её к последнему листу в книге:
Dim shtX As Worksheet: Set shtX = ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)

Select Case shtX.Visible 'Проверим, скрыт ли лист или нет
    Case True: MsgBox "Последний лист в книге доступен" 'Если последний лист виден
    Case False: MsgBox "Последний лист в книге скрыт" 'Если последний лист скрыт
End Select

End Sub

Четвёртый пример показывает, что «Case» может ориентироваться и на другие переменные. В данном случае будем проверять равенство трёх переменных с помощью логического оператора «And»:

Sub SelectCase_example_4()

'Введём несколько переменных:
Dim X%, Y%, Z%
'Приравняем всех к тройке:
X = 3: Y = 3: Z = 3

Select Case True 'Проверим равенство всех переменных
    Case Z = X And Y = X: MsgBox "Все равны" 'Если все равны
    Case Else: MsgBox "Кто-то отличается" 'Если хоть кто-то отличается
End Select

End Sub

Пятый пример показывает, как через запятую в проверяемом значении для «Case» можно указать целый набор чисел. Допустим, есть некоторая функция и мы проверяем, может ли наше число в этой функции использоваться. По условию, нас устраивают числа в диапазоне от 5 (не включая 5) до минус бесконечности, от 12 до 15 включая концы и от 20 (включая 20) до плюс бесконечности.

Sub SelectCase_example_5()

'Введём переменную и дадим ей значение вручную
Dim X As Double
X = InputBox("Введите числовое значение переменной Х")

Select Case X 'Проверим, подходит ли некоторой воображаемой функции наше значение
    Case Is < 5, Is >= 20, 12 To 15 'Диапазон подходящих значений
        MsgBox "Действительное значение для некоторой функции"
    Case Else 'Не подходящие значения
        MsgBox "Значение не может быть использовано в некоторой функции"
End Select

End Sub

Подводя черту, замечу, что оператор «Select Case» по структуре довольно прост и удобен в использовании. Он менее гибок по сравнению с «If … End», если по ходу проверок требуется менять проверяемое значение, но значительно выигрывает при разнообразных проверках одного и того же выражения. Для чего собственно и был создан.

 

Спасибо за внимание.

 

Статью c примерами составил Роман «Rioran» Воронов для www.excelworld.ru

 

Категория: Операторы ветвления | Добавил: Rioran (05.07.2014) | Автор: Rioran E
Просмотров: 13797 | Комментарии: 1 | Теги: select case, программирование в Excel, Case, VBA, операторы ветвления | Рейтинг: 5.0/3


Всего комментариев: 1
0   Спам
1    SkyPro   (14.07.2014 15:52)
   Не знал (не внимательный я) о возможности записи через запятую. Спасибо.

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Яндекс цитирования
© 2010-2016 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!