Във VBA, Изберете Декларация за случая е алтернатива на Изявление Ако-тогава, което ви позволява да тествате дали условията са изпълнени, изпълнявайки специфичен код за всяко условие. Изявлението за избор е за предпочитане пред изявлението If, когато има няколко условия за обработка.
Изберете Пример за случай
Този пример подканва потребителя с YesNoCancel MessageBox и тества коя опция е избрал потребителят:
1234567891011121314 | Sub Select_Case_Yes_No_Cancel ()Dim nResult Като VbMsgBoxResultnResult = MsgBox ("…", vbYesNoCancel)Изберете Case nResultСлучай vbДаMsgBox "Да"Дело vbNoMsgBox "Не"Калъф vbCancelMsgBox "Отказ"Край ИзберетеEnd Sub |
По -долу сме изписали еквивалента, използвайки вместо това Statement If. Ще забележите, че декларацията за избор на случай включва малко по -малко въвеждане - тази полза се усилва при тестване на множество критерии.
12345678910111213 | Sub Ако_Да_Не_Отказ ()Dim nResult Като VbMsgBoxResultnResult = MsgBox ("…", vbYesNoCancel)Ако nResult = vbДа ТогаваMsgBox "Да"В противен случай, ако nResult = vbNo ТогаваMsgBox "Не"ElseIf nResult = vbCancel ТогаваMsgBox "Отказ"Край АкоEnd Sub |
Синтаксис на казус
Синтаксисът на Избор на изявление на случая е следният:
12345678910 | Изберете случай [Тестов израз]Случай [условие 1][Действие, ако условие 1 е вярно]Случай [условие 2][Действие, ако условие 2 е вярно]Случай [условие n][Действие, ако условие n е вярно]Дело иначе[Действие, ако нито едно не е вярно]Край Изберете |
Където:
[Тестов израз] - Стойността е за оценка. Обикновено това е променлива.
[Действие, ако условие n е вярно] - Само кодът да се изпълнява, ако условието е изпълнено (точно както при оператор If)
[Условие n] - Условието за тестване. Има много различни начини за тестване на условията. Ще ги обсъдим по -долу.
Декларацията за случая ще изпълни кода за ПЪРВОТО условие, за което се установи, че е TRUE. Ако не е изпълнено условие, няма да се изпълни код, освен ако не е добавена клаузата Else.
Изберете критерии за случай
Избраните случаи могат да се използват за оценка както на числови стойности, така и на текст. Първо ще обсъдим как да използваме Select Cases за оценка на числови изрази.
Точно съвпадение - числа
Можете лесно да тествате за точно съвпадение с Case Statement:
1 | Случай 10 |
или добавете запетаи за тестване за точно съвпадение с множество числа:
1 | Дело 20, 30, 40 |
1234567891011121314 | Sub ExactMatch_Numbers ()Dim n като цяло числоn = CInt (InputBox ("…"))Изберете случай nСлучай 10'Ако n е 10, тогаваДело 20, 30, 40'Ако n е 20/30/40 ТогаваДело иначе'Ако n не е 10/20/30/40 ТогаваКрай ИзберетеEnd Sub |
Диапазони
Можете да тествате дали дадено число попада в диапазон по следния начин:
1 | Дело 55 до 74 |
Тази процедура ще генерира писмен резултат за студент въз основа на числения им резултат:
12345678910111213141516171819202122 | Под Calc_Grade ()Dim Score As IntegerЗатъмнете LetterGrade As StringРезултат = InputBox ("Въведете студентски резултат")Изберете Case ScoreДело 90 до 100LetterGrade = "А"Дело 80 до 90LetterGrade = "B"Случай 70 до 80LetterGrade = "C"Дело 60 до 70LetterGrade = "D"Дело иначеLetterGrade = "F"Край ИзберетеMsgBox "Оценката на ученика е:" & LetterGradeEnd Sub |
Можете също да тествате диапазони с Case Is
Изберете Case Is
1234 | Делото е <55„Не правете нищоСлучай <= 74MsgBox "В обхват" |
Не забравяйте, че State Statement ще изпълнява код САМО за първото съвпадение.
Тази процедура ще изчисли оценката на ученика, като използва Case Is вместо Case To.
12345678910111213141516171819202122 | Sub Select_Case_Is_Grade ()Dim Score As IntegerЗатъмнете LetterGrade As StringРезултат = InputBox ("Въведете студентски резултат")Изберете Case ScoreДелото е> = 90LetterGrade = "А"Случаят е> = 80LetterGrade = "B"Случаят е> = 70LetterGrade = "C"Случаят е> = 60LetterGrade = "D"Дело иначеLetterGrade = "F"Край ИзберетеMsgBox "Оценката на ученика е:" & LetterGradeEnd Sub |
Дело иначе
Можете да добавите „Case Otherse“ в края на вашия Statement Case, за да направите нещо, ако не са изпълнени условия:
1 | Дело иначе |
Вижте края на предишния пример за код, за да видите как може да се използва Case Else.
Изберете Дело - текст и подобен оператор
Досега нашите примери за Select Case са работили само с числа. Можете също да използвате изявления за Избор на случай с текст.
Точно съвпадение - текст
Можете да проверите дали изразът съвпада с точна фраза като тази:
1 | Калъф "Цвекло" |
Или използвайте запетаи, за да проверите дали изразът съвпада точно с повече от една фраза:
1 | Калъф "Apple", "Banana", "Orange" |
Сглобяването му изглежда така:
12345678910 | Sub ExactMatch_Food ()Изберете Диапазон на случаите ("a1"). СтойностКалъф "Цвекло"MsgBox "Зеленчук"Калъф "Apple", "Banana", "Orange"MsgBox "Плодове"Край ИзберетеEnd Sub |
Големи и малки букви
По подразбиране VBA е чувствителен към регистър. Това означава, че VBA счита „Текст“ за различен от „текст“. За да изключите чувствителността към регистър, добавете Опция Сравняване на текст в горната част на вашия модул:
1 | Опция Сравняване на текст |
Този пример ще направи регистъра на регистрите нечувствителен при работа с текст:
123456789101112 | Опция Сравняване на текстSub ExactMatch_Food ()Изберете Диапазон на случаите ("a1"). СтойностКалъф "Цвекло"MsgBox "Зеленчук"Калъф "Apple", "Banana", "Orange"MsgBox "Плодове"Край ИзберетеEnd Sub |
Дело като
Операторът Like ми позволява да правите неточни сравнения. Ако текстът съвпада, Like връща TRUE, ако не съвпада, връща FALSE. Това прави оператора Like лесен за използване с If изявления, но няма да работи толкова лесно с State Case.
Случай като - неуспешен тест
Следният код показва, че операторът Like не работи с Select Case:
1234567891011 | Sub Select_Case_Like_DoesnotWork ()Затъмнена дума As Stringword = "COCOA"Изберете Писателна думаДелна дума2 Като "*C*C*"MsgBox "Добре"Дело иначеMsgBox "Не е добре"Край ИзберетеEnd Sub |
Случай като - правилният начин
Въпреки това, можем да добавим в израза TRUE, за да накараме оператора за избор да работи с оператора Like:
1234567891011 | Sub Select_Case_Like_CorrectWay ()Затъмнена дума As Stringword = "COCOA"Изберете True CaseДелнична дума като "*C*C*"MsgBox "Добре"Дело иначеMsgBox "Не е добре"Край ИзберетеEnd Sub |
Калъф - Колон
Когато използвате Case Statement, можете да добавите толкова редове код, колкото искате да изпълните с всяко условие. Ако обаче трябва да изпълните само един ред код. Можете да използвате двоеточие (:), за да напишете всичко на същия ред.
Ето същия пример за оценка на учениците както преди, с изключение на използването на двоеточие за съкращаване на кода:
1234567891011121314151617 | Под Calc_Grade_colon ()Dim Score As IntegerЗатъмнете LetterGrade As StringРезултат = InputBox ("Въведете студентски резултат")Изберете Case ScoreДело 90 до 100: LetterGrade = "A"Случай 80 до 90: LetterGrade = "B"Случай 70 до 80: LetterGrade = "C"Дело 60 до 70: LetterGrade = "D"Друг случай: LetterGrade = "F"Край ИзберетеMsgBox "Оценката на ученика е:" & LetterGradeEnd Sub |
Избор на случай - и / или - множество условия
Можете да използвате операторите And / Or, за да тествате допълнителни критерии заедно с Select Case.
В този пример използваме Select Case за променливата „възраст“, но също така искаме да тестваме пола. Затова използваме оператора And за извършване на по -сложния тест:
123456789101112131415161718 | Sub NestedSelectCase ()Dim sex As StringDim age As Integersex = "мъж" или женавъзраст = 15Изберете Възраст на случаяДелото е <20 И пол = "мъжки"Msgbox "Мъж под 20"Дело е <20 И пол = "женски"Msgbox "Жена под 20"Случай е> = 20 И пол = "мъжки"Msgbox "Мъж над 20"Случай е> = 20 И пол = "женски"Msgbox "Жена над 20"Край ИзберетеEnd Sub |
Вложени изявления на случаите
Точно като If Statements, можете да поставите State Statements един в друг:
123456789101112131415161718192021222324 | Sub NestedSelectCase ()Dim sex As StringDim age As Integersex = "мъж" или женавъзраст = 15Изберете Възраст на случаяСлучаят е <20Изберете Секс по случайКалъф "мъжки"MsgBox "Мъж под 20"Калъф "женски"MsgBox "Жена под 20"Край ИзберетеСлучай е> = 20 И пол = "женски"Изберете Секс по случайКалъф "мъжки"MsgBox "Мъж над 20"Калъф "женски"MsgBox "Жена над 20"Край ИзберетеКрай ИзберетеEnd Sub |
Изложение на случая срещу изявление на If
Колкото повече условия за тестване, толкова по -полезна е декларацията за случая в сравнение с изявлението If. Нека разгледаме един пример.
Ето кода, необходим за тестване дали името на работен лист се равнява на набор от стойности, използвайки оператор If:
12345 | Ако Име = "Бюджет" Или Име = "Прогноза" Или Име = "Продължаващо12" Или _Name = "Flex" Or Name = "OtherRatios" Или Name = "Сравнение" Или _Name = "BudReview" Или Name = "P & L_Review" Или Name = "Други" Тогава'Направи нещоКрай Ако |
Ето същия код, като вместо това се използва Избрано изявление:
12345 | Изберете Име на случаяДело "Бюджет", "Прогноза", "Затваряне12", "Гъвкаво", "Други съотношения", _„Сравнение“, „BudReview“, „P & L_Review“, „Други“'Направи нещоКрай Изберете |
Можете да видите, че е много по -лесно да използвате Избрано изявление в този сценарий. Това е значително по -малко писане и е много по -лесно за четене.
Примери за избор на VBA
Пример 1. Декларация за случая Функция, дефинирана от потребителя (UDF)
Нека да възпроизведем нашия пример за изчисляване на оценките по -горе и да създадем UDF за изчисляване на резултата на ученика:
12345678910111213141516 | Функция GetGrade (Score As Integer) As StringИзберете Case ScoreДело 90 до 100GetGrade = "А"Дело 80 до 90GetGrade = "B"Случай 70 до 80GetGrade = "C"Дело 60 до 70GetGrade = "D"Дело иначеGetGrade = "F"Край ИзберетеКрайна функция |
Сега можем да използваме Функция GetGrade в нашия работен лист на Excel за бързо изчисляване на оценките на учениците:
Пример 2. Име на тестовия лист / Декларация за случай на цикъл
Този код ще премине през всички работни листове в работна книга, листове за защита, които отговарят на определени критерии:
123456789101112 | Sub Case_UnProtectSheet ()Затъмнете като работен листЗа всеки ws в работни листовеИзберете Case ws.Name 'Списък на всички листове с съотношенияДело "Бюджет", "Прогноза", "Затваряне12", "Гъвкаво", "Други съотношения", _„Сравнение“, „BudReview“, „P & L_Review“, „Други“ws.UnprotectКрай ИзберетеСледващата wsEnd Sub |
Пример 3. Изберете случай - Стойност на клетката
Този пример ще тества оценката на ученик в клетка, извеждайки оценката на буквата директно в клетката вдясно.
12345678910111213141516 | Sub TestCellValue ()Затъмняване на клетката като обхватЗадаване на клетка = Обхват ("C1")Изберете Case cell.ValueДело 90 до 100cell.Offset (0, 1) = "A"Дело 80 до 90cell.Offset (0, 1) = "B"Случай 70 до 80cell.Offset (0, 1) = "C"Дело 60 до 80cell.Offset (0, 1) = "D"Край ИзберетеEnd Sub |
Пример 4. Изберете случай - Дати
Този пример за избор на случай е функция, която тества в кое тримесечие на датата попада.
123456789101112131415161718 | Sub TestDate ()MsgBox GetQuarter (CDate ("7/20/2019"))End SubФункция GetQuarter (dt като дата) като цяло числоDim sht като работен листИзберете Case dtДело CDate ("01/01/2019") Към CDate ("31/03/2019")GetQuarter = 1Дело CDate ("04/01/2019") Към CDate ("30/06/2019")GetQuarter = 2Дело CDate ("07/01/2019") Към CDate ("30/09/2019")GetQuarter = 3Дело CDate ("10/01/2019") Към CDate ("31/12/2019")GetQuarter = 4Край ИзберетеКрайна функция |
Тъй като това е функция, можете да я използвате като функция в Excel:
Пр. 5 Проверете дали числото е нечетно или четно
Този пример тества дали числото е нечетно или четно.
123456789101112 | Sub CheckOddEven ()Dim n като цяло числоn = InputBox ("Въведете число")Изберете случай n Mod 2Случай 0MsgBox "Номерът е четен."Случай 1MsgBox "Номерът е нечетен."Край ИзберетеEnd Sub |
Пр. 6 Проверете дали датата е в делничен или уикенд
Тези примери ще тестват дали датата пада в делничен ден или уикенд.
123456789101112131415161718192021 | Sub CheckWeekDay ()Dim dt като датаdt = CDate ("1/1/2020")Избор на делния ден (dt)Дело vbПонеделникMsgBox "Понеделник е"Дело vbВторникMsgBox "Вторник е"Дело vbСрядаMsgBox "Сряда е"Дело vbЧетвъртъкMsgBox "Четвъртък е"Дело vbПетъкMsgBox "Петък е"Дело vbСъботаMsgBox "Събота е"Случай vbSundayMsgBox "Неделя е"Край ИзберетеEnd Sub |
123456789101112 | Sub CheckWeekend ()Dim dt като датаdt = CDate ("1/1/2020")Избор на делния ден (dt)Дело vbСъбота, vbСъботаMsgBox "Това е уикенд"Дело иначеMsgBox "Това не е уикенд"Край ИзберетеEnd Sub |
VBA Изберете случай в Access
Всички горепосочени примери работят абсолютно същото в Access VBA като в Excel VBA.
123456789101112131415161718192021 | Sub TestCellValue ()Dim dbs като база данниПърво затъмнете като RecordSetЗадайте dbs = CurrentDBЗадайте rst = dbs.OpenRecordset ("tblClients", dbOpenDynaset)С първи.Преместете първо.РедактиранеИзберете Case rst.Fields ("City")Калъф "Остин".rst.Fields ("TelCode") = "512"Калъф "Чикаго".rst.Fields ("TelCode") = "312"Дело "Ню Йорк".rst.Fields ("TelCode") = "1212"Калъф "Сан Франциско".rst.Fields ("TelCode") = "415"Край Изберете.АктуализиранеКрай сКрай Сус |