Select case vba excel примеры. Оператор ветвления "Select Case"

Select case vba excel примеры. Оператор ветвления "Select Case"

25.03.2024

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

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 вместо этого примет значение, содержащееся в пределах диапазона, и вернет его. В большинстве случаев это не имеет значения, но иногда вам нужен фактический диапазон, например, когда у вас есть именованная формула, которая должна оцениваться в диапазоне, потому что она используется в качестве источника для списка проверки.

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

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

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

Вышепоказанная процедура использует несколько вложенных друг в друга операторов условного перехода. Следует сказать, что такая процедура будет работать только в Excel, т.к. использует метод Application.InputBox (см. Функции host-приложений). Этот метод не дает пользователю во время работы функции ввести что-либо, кроме числа.

Если пользователь вводит не число, то получает об этом сообщение.



Если пользователь ничего не вводит, то получает сведение об ошибке.




Если пользователь воспользуется кнопкой "Отмена", то получает сообщение "Не введены данные".


VBA предоставляет сокращенную версию оператора If..Then..Else , являющуюся сжатым эквивалентом вложенных операторв If..Then..Else , использованных в листинге. Такой краткой формой является операторIf..Then..ElseIf



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


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

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

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


Оператор безусловного перехода

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

Оператор безусловного перехода всегда изменяет порядок выполнения операторов в процедуре или функции. При этом не проверяется никаких условий.


Синтаксис:

GoTo line


line - любая допустимая метка или номер строки в той же процедуре или функции, которая содержит оператор GoTo.

Оператор 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 произойдет выполнения лишь для первого подходящего условия, а все остальные будут проигнорированы.

© 2024 lidvalbecker.ru - Мой компьютер - Lidvalbecker