Select case vba описание. Язык программирования Visual Basic. Программирование ветвлений. Операторы цикла. Вложенные циклы

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

Select Case выражение ] ... ] End Select

Параметры
выражение
Обязательный. Любое числовое выражение или строковое выражение.
списокВыражений-n
Обязательный при наличии предложения Case . Список с разделителями, состоящий из одной или нескольких форм следующего вида: выражение, выражение To выражение, Is операторСравнения выражение. Ключевое слово To задает диапазон значений. При использовании ключевого слова To перед ним должно находиться меньшее значение. Ключевое слово Is с операторами сравнения (кроме Is и Like) задает диапазон значений. Если ключевое слово Is не указано, оно вставляется по умолчанию.
инструкции-n
Необязательный. Одна или несколько инструкций, выполняемых в том случае, если выражение совпадает с любым компонентом списка списокВыражений-n.
инструкции_else
Необязательный. Одна или несколько инструкций, выполняемых в том случае, если выражение не совпадает не совпадает ни с одним из предложений Case .

Замечания
Если выражение совпадает с любым выражением из спискаВыражений в предложении Case , выполняются все инструкции, следующие за данным предложением Case до следующего предложения Case , или, для последнего предложения, до инструкции End Select . Затем управление передается инструкции, следующей за End Select . Если выражение совпадает с выражениями из списка в нескольких предложениях Case , выполняется только первый подходящий набор инструкций.
Предложение Case Else задает список инструкции_else, которые будут выполнены, если не обнаружено ни одно совпадение выражения и компонента списокВыражений ни в одном из остальных предложений Case. Хотя данное предложение не является обязательным, рекомендуется помещать предложение Case Else в блок Select Case , чтобы предусмотреть неожиданные значения выражения. Если ни в одном предложении Case списокВыражений не содержит компонента, отвечающего аргументу выражение, и отсутствует инструкция Case Else , выполнение продолжается с инструкции, следующей за инструкцией End Select .
В каждом предложении Case допускается использование нескольких выражений или диапазонов. Например допустима следующая строка:

Case 1 To 4, 7 To 9, 11, 13, Is > MaxNumber Следует отличать оператор сравнения Is от ключевого слова Is , используемого в инструкции Select Case .
Имеется также возможность задать диапазоны или несколько выражений для строковых значений. В следующем примере предложение Case выполняется для строк, которые точно совпадают со строкой "все", для строк, лежащих в алфавитном порядке между "орехи" и "яблоки", и для строк со значением, равных текущему значению переменной TestItem :
Case "все", "орехи" To "яблоки", TestItem Допускаются вложенные инструкции Select Case . Каждой вложенной инструкции Select Case должна соответствовать инструкция End Select .

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

Dim Number Number = 8 " Инициализирует переменную. Select Case Number " Анализирует число. Case 1 To 5 " Число между 1 и 5. Debug.Print "Между 1 и 5" " Это предложение Case является единственным истинным. Case 6, 7, 8 " Число между 6 и 8. Debug.Print "Между 6 и 8" Case Is > 8 And Number < 11 " 9 или 10. Debug.Print "Больше 8" Case Else " Другие значения. Debug.Print "Вне интервала 1 -- 10" End Select

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

VBA поддерживает следующие конструкции принятия решений:

If . . . Then . . . Else

6.1 Конструкция If . . . Then

Конструкция If . . . Then применяется, когда необходимо выполнить один или группу операторов в зависимости от некоторого условия. Синтаксис этой конструкции позволяет задавать ее в одной строке или в нескольких строках программы:

If условие Then выражение If условие Then выражение End If

Обычно условие является простым сравнением, но оно может быть любым выражением с вычисляемым значением. Это значение интерпретируется как False (Ложь), если оно нулевое, а любое ненулевое рассматривается как True (Истина). Если условие истинно, то выполняются все выражения, стоящие после ключевого слова Then. Для условного выполнения одного оператора можно использовать как синтаксис для одной строки, так и синтаксис для нескольких строк (блоковую конструкцию).

Следующие два оператора эквивалентны:

If anyDate < Now Then anyDate = Now If anyDate < Now Then anyDate = Now End If

Заметим, что синтаксис оператора If . . . Then для одной строки не использует оператор End If. Чтобы выполнить последовательность операторов, если условие истинно, следует использовать блоковую конструкцию If . . . Then . . . End If.

If anyDate < Now Then anyDate = Now Timer.Enabled = False " Запретить таймер. End If

Если условие ложно, то операторы после ключевого слова Then не выполняется, а управление передается на следующую строку (или строку после оператора End If в блочной конструкции).

6.2 Конструкция If . . . Then . . . Else

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

If условие1 Then выражение1 ElseIf условие2 Then выражение2 . . . Else выражение-n End If

При выполнении сначала проверяется условие1. Если оно ложно, VBA проверяет следующее условие2 и т. д., пока не найдет истинного условия. Найдя его, VBA выполняет соответствующий блок операторов и затем передает управление инструкции, следующей за оператором End if. В данную конструкцию можно включить блок оператора Else, который VBA выполняет, если не выполнено ни одно из условий.

Конструкция If . . . Then . . . ElseIf в действительности всего лишь специальный случай конструкции If . . . Then . . . Else. Заметим, что в данной конструкции может быть любое число блоков ElseIf, или даже ни одного. Блок Else можно включать независимо от присутствия или, наоборот, отсутствия блоков ElseIf.

Sub пример1() Dim a As Single, b As Single, x As Single Dim z As Double Call read("A1", a) Call read("B1", b) Let x = CSng(InputBox("введи x", "Ввод данных", 0)) If x <= a Then z = Sin(x) ElseIf x >= b Then z = Tan(x) Else: z = Cos(x) End If Call out("C1", z) End Sub

Заметим, что можно добавить любое число блоков Elself в конструкцию If . . . Then. Однако количество блоков Elself может стать настолько большим, что конструкция If . . . Then станет очень громоздкой и неудобной. В подобной ситуации следует применять другую конструкцию принятия решения - Select Case.

6.3 Конструкция Select Case

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

Конструкция Select Case работает с единственным проверяемым выражением, которое вычисляется один раз при входе в эту конструкцию. Затем VBA сравнивает полученный результат со значениями, задаваемыми в операторах Case конструкции. Если найдено совпадение, выполняется блок операторов, ассоциированный с оператором Case:

Select Case проверяемое_выражение ] ] . . . ] End Select

Каждый список выражений является списком из одного или более значений. Если в одном списке больше одного значения, они отделяются запятыми. Каждый блок операторов содержит несколько операторов или ни одного. Если окажется, что вычисленному значению проверяемого выражения соответствуют значения из нескольких операторов Case, то выполняется блок операторов, ассоциированный с первым оператором Case из всех найденных соответствий. VBA выполняет блок операторов, ассоциированный с оператором Case Else (заметим, что он необязателен), если не найдено ни одного соответствия проверяемого значения выражения и значений из всех списков операторов Case.

Рассмотрим пример вычисления функции

Sub пример2() Const pi2 = 1.57 Dim x As Single Dim z As Double Let x = CSng(InputBox("введи x", "Ввод данных", 0)) Select Case x Case -pi2 z = Sin(x) Case 0 z = Cos(x) Case pi2 z = Tan(x) Case Else MsgBox "Неверные исходные данные!" Exit Sub End Select Call out("D1", z) End Sub

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

O.K., нет никакого способа сделать то, что вы хотите. Вы не можете использовать ничего, кроме синтаксиса Excel внутри формулы, поэтому вещи, такие как "A1 = от 1 до 9", просто невозможно.

Вы можете написать довольно сложную процедуру VBA, которая взяла строки или что-то еще, и проанализировала их, но это действительно сводится к разработке и внедрению полного небольшого языка. И ваш "код" не будет хорошо работать с Excel. Например, если вы назвали что-то вроде

Cases("{A1="""",""there is nothing""},{else,A1}")

(обратите внимание на экранированные кавычки), Excel не будет обновлять вашу ссылку A1 при ее перемещении или скопировать формулу. Поэтому отбросьте весь параметр "синтаксис".

Однако, оказывается, вы можете получить большую часть поведения, которое, как мне кажется, вам действительно нужно, с помощью обычных формул Excel плюс один крошечный VBA UDF. Сначала UDF:

Public Function arr(ParamArray args()) arr = args End Function

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

Arr(A1=42, A1=99)

и вернуть массив логических значений.

С помощью этого небольшого UDF теперь вы можете использовать регулярные формулы для "выбора случаев". Они выглядели бы так:

CHOOSE(MATCH(TRUE, arr(A1>5, A1<5, A1=5), 0), "gt 5", "lt 5", "eq 5")

Что происходит, так это то, что "arr" возвращает логический массив, "MATCH" находит позицию первого TRUE, а "CHOOSE" возвращает соответствующий "случай".

Вы можете эмулировать предложение "else", обернув все это в "IFERROR":

IFERROR(CHOOSE(MATCH(TRUE, arr(A1>5, A1<5), 0), "gt 5", "lt 5"), "eq 5")

Если это слишком много для вас, вы всегда можете написать еще один VBA UDF, который приведет к MATCH, CHOOSE и т.д. внутри и вызовет его следующим образом:

Cases(arr(A1>5, A1<5, A1=5), "gt 5", "lt 5", "eq 5")

Это недалеко от вашего предложенного синтаксиса и намного, гораздо проще.

Я вижу, что вы уже придумали (хорошее) решение, которое ближе к тому, что вы действительно хотите, но я подумал, что добавлю это в любом случае, поскольку мое выражение выше о приведении MATCH, CHOOSE и т.д. внутри UDF заставлял его выглядеть проще, чем на самом деле.

Итак, вот "UDF" дел:

Public Function cases(caseCondResults, ParamArray caseValues()) On Error GoTo EH Dim resOfMatch resOfMatch = Application.Match(True, caseCondResults, 0) If IsError(resOfMatch) Then cases = resOfMatch Else Call assign(cases, caseValues(LBound(caseValues) + resOfMatch - 1)) End If Exit Function EH: cases = CVErr(xlValue) End Function

Он использует небольшую вспомогательную процедуру, "assign":

Public Sub assign(ByRef lhs, rhs) If IsObject(rhs) Then Set lhs = rhs Else lhs = rhs End If End Sub

Процедура "назначать" просто упрощает рассмотрение того факта, что пользователи могут вызывать UDF с любыми значениями или ссылками на диапазон. Поскольку мы хотим, чтобы UDF наших "случаев" работал, как Excel "CHOOSE", мы хотели бы возвращать ссылки при необходимости.

В основном, в новом UDF "случаях" мы сами делаем "выбор", индексируя в массив параметров значений case. Я удалил обработчик ошибок там, поэтому основные вещи, такие как несоответствие между результатами условия случая и значениями case, приведут к возвращаемому значению #VALUE!. Вероятно, вы добавили бы больше проверок в настоящую функцию, например, чтобы убедиться, что результаты условия были логическими и т.д.

Я рад, что вы достигли еще лучшего решения для себя! Это было интересно.

БОЛЬШЕ О "assign":

В ответ на ваш комментарий, здесь больше о том, почему это является частью моего ответа. VBA использует другой синтаксис для назначения объекта переменной, чем для присвоения простого значения. Посмотрите на справки VBA или посмотрите этот вопрос stackoverflow, а другим понравятся: Что действительно делает ключевое слово Set в VBA?

Это имеет значение, потому что, когда вы вызываете функцию VBA из формулы Excel, параметрами могут быть объекты типа Range, в дополнение к номерам, строкам, логическим значениям, ошибкам и массивам. (См. Может ли Excel VBA UDF, вызванный из листа, когда-либо передаваться экземпляр любого класса объектной модели Excel VBA, отличного от "Range" ?)

Ссылки на диапазон - это то, что вы описываете, используя синтаксис Excel, такой как A1: Q42. Когда вы передаете один в Excel UDF в качестве параметра, он отображается как объект Range. Если вы хотите вернуть объект Range из UDF, вам нужно сделать это явно с помощью ключевого слова VBA "Установить". Если вы не используете "Установить", Excel вместо этого примет значение, содержащееся в пределах диапазона, и вернет его. В большинстве случаев это не имеет значения, но иногда вам нужен фактический диапазон, например, когда у вас есть именованная формула, которая должна оцениваться в диапазоне, потому что она используется в качестве источника для списка проверки.

VBAимеет условный оператор перехода для использования в случаях, когда необходимо выбирать из большого количества различных ветвей кода: операторSelect Case (с его помощью очень удобно реализовывать структуру множественного выбора).Он работает во многом так же, как множе­ство независимых операторовIf ,но он более понятен для того, кто пишет код, и того, кто читает этот код. Этот оператор более эффективен, чем операторIf Then Else .

Ключевые слова Select Case используются со мно­гими операторамиCase ,где каждый операторCase проверяет появление дру­гого условия и выполняется только одна из ветвейCase .ВетвьCase может со­держать один, несколько или ни одного оператораVBA.

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

Select Case Выражение_выбора

[ Case Список_выражений_1

[Блок_операторов_1]

[Case Список_выражений_2 ]

[Блок_операторов_2]]

……………………………………………………………………………

[Case E lse

[Блок_операторов_N]]

E nd S elect

– Выражение_выбора – любое числовое или символьное выражение;

– Список_выражений – каждый из списков представляет собой список логических выражений, отделенных запятыми; имеют тот же тип, что и выражение_выбора;

– Блок_операторов – содержит любое количество операторов VBA.

При выполнении оператора Select Case VBA сначала оценивает Выражение_выбора, а затем сравнивает результат этого выражения с каждым выраже­нием, перечисленным в каждом Списке_выражений. Если значение, представлен­ное с помощью Выражение_выбора совпадает с выражением в Списке_выражений для одного из Case ,VBA выполняет Блок_операторов для этого предложения Case .Если значение Выражение_выбора совпадает более, чем с одним оператором Case ,VBA выполняет только операторы в первом совпадающем предложении Case .Часто Выражение_выбора – это просто имя одной переменной, математическое или чис­ленное, а не логическое выражение. Выражения в Списке_выражений – это обыч­но логические выражения.

После завершения выполнения операторов в первом совпадающем опера­торе Case VBA продолжает выполнение кода с первого оператора после ключе­вых слов End Select ,которые обозначают конец Select Case .

Если значение Выражение_выбора не совпадает ни с каким из Case ,а необяза­тельный Case Else присутствует, VBA выполняет операторы, представленные с помощью Блок_операторов_N перед переходом к оператору после Select Case . Блок операторов Case E lse выполняется только в том случае, если Выражения_выбора не удовлетворяет ни одному из условий Case . Обычно используется для обработки нежелательных значений. Действие оператора Select Case поясняется блок-схемой, приведенной на рис. 5.

Рис 5. Блок-схема конструкции Select Case

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

Выражение_1,Выражение_2, …, Выражение_N

Выражение Т o Выражение

I s Выражение с операцией

– Выражение_ – любое числовое, символьное или логическое выражение того же типа, что и выражение выбора;

– Выражение с операцией – выражение, содержащее любую из следующих операций: <, <=, >, >=, < >, =.

Если используется ключевое слово Тo для определения пределов выражения, то меньшее значение должно быть первым. Например, операторы блока Case -1 To -5 не выполняются, если Выражение _ выбора равно -4. Эта строка должна быть написана как Case -5 To -1 .

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

Можно использовать несколько выражений или пределов в каждом условии Case . Например, Case 1 TO 4, 7 TO 9, 11, 13, Is > n % .

Пример 4. Программа, рассчитывающая скидку в зависимости от суммы покупки.

Sub skidka()

" Определение скидки (в %) в зависимости от

" количества продаваемого товара

Dim skidka As Integer

Dim summa As Single

summa = InputBox ("Введите сумму покупки", "Расчет скидки", 0)

If summa > 0 Then

Select Case summa

Case Is > 1000

Case Is > 500

Case Else

End Select

MsgBox "Скидка" & skidka & "%"

MsgBox "Сумма покупки не указана"