Ve VBA, Vyberte Případ je alternativou k Prohlášení If-Then, což vám umožní otestovat, zda jsou splněny podmínky, spuštěním konkrétního kódu pro každou podmínku. Výběr příkazu je vhodnější než příkaz If, pokud existuje více podmínek ke zpracování.
Vyberte Příklad případu
Tento příklad vyzve uživatele pomocí YesNoCancel MessageBox a otestuje, kterou možnost uživatel vybral:
1234567891011121314 | Sub Select_Case_Yes_No_Cancel ()Dim nResult As VbMsgBoxResultnResult = MsgBox ("…", vbYesNoCancel)Vyberte Case nResultPřípad vbAnoMsgBox „Ano“Case vbNoMsgBox „Ne“Případ vbCancelMsgBox "Zrušit"Konec VybratEnd Sub |
Níže jsme sepsali ekvivalent pomocí prohlášení If. Všimnete si, že prohlášení o výběru případů zahrnuje o něco méně psaní - tato výhoda je umocněna při testování více kritérií.
12345678910111213 | Sub If_Yes_No_Cancel ()Dim nResult As VbMsgBoxResultnResult = MsgBox ("…", vbYesNoCancel)Pokud nResult = vbYes ThenMsgBox „Ano“ElseIf nResult = vbNo ThenMsgBox „Ne“ElseIf nResult = vbCancel PotomMsgBox "Zrušit"Konec IfEnd Sub |
Syntaxe prohlášení o případu
Syntaxe příkazu Select Case je následující:
12345678910 | Vyberte případ [testovací výraz]Případ [Podmínka 1][Akce, pokud je splněna podmínka 1]Případ [Podmínka 2][Akce, pokud je splněna podmínka 2]Případ [Podmínka n][Akce, pokud je podmínka n pravdivá]Případ jinak[Akce, pokud žádná není pravdivá]Konec Vybrat |
Kde:
[Testovací výraz] - Je hodnota k vyhodnocení. Obvykle se jedná o proměnnou.
[Akce, pokud je splněna podmínka n] - Je pouze kód, který se má spustit, pokud je splněna podmínka (stejně jako u příkazu If)
[Podmínka n] - Je podmínkou testování. Existuje mnoho různých způsobů testování podmínek. Budeme o nich diskutovat níže.
Příkaz Case spustí kód pro PRVNÍ podmínku, u které bylo zjištěno, že je PRAVDA. Pokud není splněna žádná podmínka, nebude spuštěn žádný kód, pokud není přidána klauzule Else.
Vyberte Kritéria případu
Select Cases lze použít k vyhodnocení číselných hodnot i textu. Nejprve si probereme, jak pomocí Select Cases vyhodnotit číselné výrazy.
Přesná shoda - čísla
Přesnou shodu můžete snadno otestovat pomocí prohlášení o případech:
1 | Případ 10 |
nebo přidejte čárky k testování přesných shod s více čísly:
1 | Případ 20, 30, 40 |
1234567891011121314 | Sub ExactMatch_Numbers ()Dim n jako celé číslon = CInt (InputBox ("…"))Vyberte případ čPřípad 10„Pokud n je 10, pakPřípad 20, 30, 40„Pokud n je 20/30/40 PakPřípad jinak„Pokud n není 10/20/30/40 PakKonec VybratEnd Sub |
Rozsahy
Můžete vyzkoušet, zda číslo spadá do rozsahu takto:
1 | Případ 55 až 74 |
Tento postup vygeneruje pro studenta skóre podle písmene na základě jeho numerického skóre:
12345678910111213141516171819202122 | Dílčí Calc_Grade ()Dim Score As IntegerDim LetterGrade jako řetězecSkóre = InputBox („Zadejte skóre studentů“)Vyberte Skóre případůPřípad 90 až 100LetterGrade = "A"Případ 80 až 90LetterGrade = "B"Případ 70 až 80LetterGrade = "C"Případ 60 až 70LetterGrade = "D"Případ JinakLetterGrade = "F"Konec VybratMsgBox „Student's Grade is:“ & LetterGradeEnd Sub |
Rozsahy můžete také testovat pomocí Case Is
Vyberte možnost Case Is
1234 | Případ je <55'Nedělat nicPřípad <= 74MsgBox „V dosahu“ |
Pamatujte, že Případ bude spouštět kód POUZE pro první shodu.
Tento postup vypočítá hodnocení studenta pomocí Case Is namísto Case To.
12345678910111213141516171819202122 | Sub Select_Case_Is_Grade ()Dim Score As IntegerDim LetterGrade jako řetězecSkóre = InputBox („Zadejte skóre studentů“)Vyberte Skóre případůPřípad je> = 90LetterGrade = "A"Případ je> = 80LetterGrade = "B"Případ je> = 70LetterGrade = "C"Případ je> = 60LetterGrade = "D"Případ jinakLetterGrade = "F"Konec VybratMsgBox „Student's Grade is:“ & LetterGradeEnd Sub |
Případ jinak
Na konec svého prohlášení o případu můžete přidat „Case Else“, abyste mohli něco udělat, pokud nejsou splněny žádné podmínky:
1 | Případ jinak |
Na konci předchozího příkladu kódu zjistíte, jak lze Case Case použít.
Vyberte operátor Case - Text & Like
Naše příklady Select Case dosud fungovaly pouze s čísly. Můžete také použít příkazy Select Case s textem.
Přesná shoda - text
Můžete otestovat, zda se výraz shoduje s přesnou frází, jako je tato:
1 | Případ "řepa" |
Nebo použijte čárky k otestování, zda se výraz přesně shoduje s více než jednou frází:
1 | Pouzdro "Apple", "Banana", "Orange" |
Sestavení vypadá takto:
12345678910 | Sub ExactMatch_Food ()Vyberte rozsah případů („a1“). HodnotaPřípad "řepa"MsgBox „Zelenina“Pouzdro "Apple", "Banana", "Orange"MsgBox „Ovoce“Konec VybratEnd Sub |
Velká a malá písmena
Standardně VBA rozlišuje velká a malá písmena. To znamená, že VBA považuje „text“ za jiný než „text“. Chcete-li rozlišovat velká a malá písmena, přidejte do horní části modulu text pro porovnání:
1 | Možnost Porovnat text |
V tomto příkladu bude Case Select při práci s textem nerozlišovat velká a malá písmena:
123456789101112 | Možnost Porovnat textSub ExactMatch_Food ()Vyberte rozsah případů („a1“). HodnotaPřípad "řepa"MsgBox „Zelenina“Pouzdro "Apple", "Banana", "Orange"MsgBox „Ovoce“Konec VybratEnd Sub |
Případ jako
Operátor Like vám umožňuje provádět nepřesná srovnání. Pokud se text shoduje, Like vrátí hodnotu TRUE, pokud ne, vrátí hodnotu FALSE. Díky tomu se operátor Like snadno používá s příkazy If, ale s příkazy Case to nebude fungovat tak snadno.
Case Like - neúspěšný test
Následující kód ukazuje, že operátor Like nefunguje s Select Case:
1234567891011 | Sub Select_Case_Like_DoesnotWork ()Tlumené slovo jako řetězecslovo = "COCOA"Vyberte Case casePřípadové slovo2 Jako „*C*C*“MsgBox „Dobrý“Případ jinakMsgBox „Není dobré“Konec VybratEnd Sub |
Případ jako - správný způsob
Můžeme však přidat výraz TRUE, aby příkaz Select Select fungoval s operátorem Like:
1234567891011 | Sub Select_Case_Like_CorrectWay ()Tlumené slovo jako řetězecslovo = "COCOA"Vyberte Case TruePřípadové slovo jako „*C*C*“MsgBox „Dobrý“Případ jinakMsgBox „Není dobré“Konec VybratEnd Sub |
Případ - Colon
Při používání Případu můžete přidat tolik řádků kódu, kolik chcete spustit s každou podmínkou. Pokud však potřebujete spustit pouze jeden řádek kódu. K napsání všeho na stejný řádek můžete použít dvojtečku (:).
Zde je stejný příklad studentské třídy jako dříve, kromě použití dvojtečky ke zkrácení kódu:
1234567891011121314151617 | Sub Calc_Grade_colon ()Dim Score As IntegerDim LetterGrade jako řetězecSkóre = InputBox („Zadejte skóre studentů“)Vyberte Skóre případůPřípad 90 až 100: LetterGrade = "A"Případ 80 až 90: LetterGrade = "B"Případ 70 až 80: LetterGrade = "C"Případ 60 až 70: LetterGrade = "D"Případ jiný: LetterGrade = "F"Konec VybratMsgBox „Student's Grade is:“ & LetterGradeEnd Sub |
Výběr případu - A / Nebo - Více podmínek
Pomocí operátorů And / Or můžete spolu s výběrem případu otestovat další kritéria.
V tomto příkladu používáme Select Case na proměnné ‘věk’, ale chceme také otestovat sex. K provedení složitějšího testu tedy používáme And Operator:
123456789101112131415161718 | Sub NestedSelectCase ()Dim sex jako řetězecDim age As Integersex = „muž“ nebo ženavěk = 15Vyberte Case casePřípad je <20 a sex = "muž"Msgbox „Muž do 20 let“Případ je <20 a sex = "žena"Msgbox „Žena do 20 let“Případ je> = 20 a sex = "muž"Msgbox „Muž nad 20“Případ je> = 20 a sex = "žena"Msgbox „Žena nad 20“Konec VybratEnd Sub |
Vnořená prohlášení o případech
Stejně jako příkazy If můžete do sebe vnořovat příkazy Case:
123456789101112131415161718192021222324 | Sub NestedSelectCase ()Dim sex jako řetězecDim age As Integersex = „muž“ nebo ženavěk = 15Vyberte Case casePřípad je <20Vyberte Case sexPřípad "muž"MsgBox "Muž do 20"Případ "žena"MsgBox "Žena do 20 let"Konec VybratPřípad je> = 20 a sex = "žena"Vyberte Case sexPřípad "muž"MsgBox "Muž nad 20"Případ "žena"MsgBox „Žena nad 20“Konec VybratKonec VybratEnd Sub |
Případ případ vs. prohlášení If
Čím více podmínek k testování, tím užitečnější je prohlášení o případu ve srovnání s příkazem If. Podívejme se na příklad.
Zde je kód požadovaný k otestování, zda se název listu rovná sadě hodnot pomocí příkazu If:
12345 | If Name = "Budget" Nebo Name = "Forecast" Nebo Name = "Trailing12" Nebo _Název = "Flex" Nebo Název = "Jiné poměry" Nebo Název = "Porovnání" Nebo _Name = "BudReview" Nebo Name = "P & L_Review" Nebo Name = "Other" Potom'Dělej něcoKonec If |
Zde je stejný kód, který místo toho používá příkaz Select:
12345 | Vyberte název případuPřípad "Budget", "Forecast", "Trailing12", "Flex", "OtherRatios", _„Porovnání“, „BudReview“, „P & L_Review“, „Jiné“'Dělej něcoKonec Vybrat |
Vidíte, že je v tomto scénáři mnohem jednodušší použít příkaz Select. Je to podstatně méně psaní a je to mnohem snáze čitelné.
VBA Select Case Příklady
Příklad 1. Případová dokumentace Uživatelem definovaná funkce (UDF)
Zopakujme výše uvedený příklad výpočtu známky a vytvořme UDF pro výpočet skóre studenta:
12345678910111213141516 | Funkce GetGrade (skóre jako celé číslo) jako řetězecVyberte Skóre případůPřípad 90 až 100GetGrade = "A"Případ 80 až 90GetGrade = "B"Případ 70 až 80GetGrade = "C"Případ 60 až 70GetGrade = "D"Případ jinakGetGrade = "F"Konec VybratKoncová funkce |
Nyní můžeme použít funkci GetGrade v našem listu aplikace Excel k rychlému výpočtu známek studentů:
Příklad 2. Název testovacího listu / Prohlášení o případu smyčky
Tento kód bude procházet všemi listy v sešitu, UnProtecting listy, které splňují určitá kritéria:
123456789101112 | Dílčí případ_UnProtectSheet ()Dim ws As WorksheetZa každé ws v pracovních listechVyberte Case ws.Name 'Seznam všech listů s RatioPřípad "Budget", "Forecast", "Trailing12", "Flex", "OtherRatios", _„Porovnání“, „BudReview“, „P & L_Review“, „Jiné“w. OdemknoutKonec VybratDalší wsEnd Sub |
Příklad 3. Vyberte Case - Cell value
Tento příklad bude testovat skóre studenta v buňce s výstupem hodnocení písmene přímo do buňky vpravo.
12345678910111213141516 | Sub TestCellValue ()Dim buňka jako rozsahNastavit buňku = rozsah ("C1")Vyberte Case case.ValuePřípad 90 až 100cell.Offset (0, 1) = "A"Případ 80 až 90buňka.Offset (0, 1) = "B"Případ 70 až 80cell.Offset (0, 1) = "C"Případ 60 až 80buňka.Offset (0, 1) = "D"Konec VybratEnd Sub |
Příklad 4. Vyberte případ - data
Tento příklad výběru případů je funkce, která testuje, do kterého čtvrtletí spadá datum.
123456789101112131415161718 | Datum dílčího testu ()MsgBox GetQuarter (CDate ("7/20/2019"))End SubFunkce GetQuarter (dt jako datum) jako celé čísloDim sht As jako pracovní listVyberte Case dtCase CDate („01/01/2019“) To CDate („03/31/2019“)GetQuarter = 1Case CDate („04/01/2019“) To CDate („06/30/2019“)GetQuarter = 2Case CDate („07/01/2019“) To CDate („09/30/2019“)GetQuarter = 3Case CDate („10/01/2019“) To CDate („12/31/2019“)GetQuarter = 4Konec VybratKoncová funkce |
Protože je to funkce, můžete ji použít jako funkci v aplikaci Excel:
Př. 5 Zkontrolujte, zda je číslo liché nebo sudé
Tento příklad testuje, zda je číslo liché nebo sudé.
123456789101112 | Dílčí CheckOddEven ()Dim n jako celé číslon = InputBox („Zadejte číslo“)Vyberte Case n Mod 2Případ 0MsgBox "Číslo je sudé."Případ 1MsgBox "Číslo je liché."Konec VybratEnd Sub |
Př. 6 Otestujte, zda je Datum ve všední den nebo o víkendu
Tyto příklady otestují, zda datum připadne na všední den nebo víkend.
123456789101112131415161718192021 | Sub CheckWeekDay ()Dim dt As Datedt = CDate ("1/1/2020")Select Case Weekday (dt)Případ vbPondělíMsgBox „Je pondělí“Případ vbÚterýMsgBox „Je úterý“Případ vb StředaMsgBox „Je středa“Případ vbČtvrtekMsgBox „Je čtvrtek“Případ vbPátekMsgBox „Je pátek“Případ vbSobotaMsgBox „Je sobota“Případ vb NeděleMsgBox „Je neděle“Konec VybratEnd Sub |
123456789101112 | Dílčí kontrolní víkend ()Dim dt As Datedt = CDate ("1/1/2020")Select Case Weekday (dt)Případ vbSobota, vbNeděleMsgBox „Je víkend“Případ jinakMsgBox „Není víkend“Konec VybratEnd Sub |
VBA Select Case v Accessu
Všechny výše uvedené příklady fungují v Access VBA úplně stejně jako v Excelu VBA.
123456789101112131415161718192021 | Sub TestCellValue ()Dim dbs jako databázeDim první jako RecordSetNastavit dbs = CurrentDBNastavit rst = dbs.OpenRecordset ("tblClients", dbOpenDynaset)S první.MoveFirst.UpravitVyberte Case rst.Fields („City“)Případ "Austin".rst.Fields ("TelCode") = "512"Případ "Chicago".rst.Fields ("TelCode") = "312"Případ „New YorK“.rst.Fields ("TelCode") = "1212"Případ "San Fransisco".rst.Fields ("TelCode") = "415"Konec Vybrat.AktualizaceKonec sKonec Sus |