VBA Select Case Statement

I VBA, Välj ärendebesked är ett alternativ till If-Then uttalande, så att du kan testa om villkoren är uppfyllda och köra specifik kod för varje villkor. Select -satsen är att föredra framför If -uttalandet när det finns flera villkor att bearbeta.

Välj fallexempel

I det här exemplet uppmanas användaren med en YesNoCancel MessageBox och testar vilket alternativ användaren valt:

1234567891011121314 Sub Select_Case_Yes_No_Cancel ()Dim nResult As VbMsgBoxResultnResult = MsgBox ("…", vbYesNoCancel)Välj Fall nResultFall vbJaMsgBox "Ja"Fall vbNrMsgBox "Nej"Fall vbCancelMsgBox "Avbryt"Avsluta VäljAvsluta Sub

Nedan har vi skrivit ut motsvarigheten med ett If -uttalande istället. Du kommer att märka att fallvalsutlåtandet innebär något mindre skrivning - denna fördel förstärks när du testar flera kriterier.

12345678910111213 Sub If_Yes_No_Cancel ()Dim nResult As VbMsgBoxResultnResult = MsgBox ("…", vbYesNoCancel)Om nResult = vbJa DåMsgBox "Ja"ElseIf nResult = vbNo DåMsgBox "Nej"ElseIf nResult = vbCancel ThenMsgBox "Avbryt"Avsluta omAvsluta Sub

Fallbeskrivning Syntax

Syntaxen Välj fallbesked är följande:

12345678910 Välj fall [Testuttryck]Fall [villkor 1][Åtgärd om villkor 1 är sant]Fall [villkor 2][Åtgärd om villkor 2 är sant]Fall [villkor n][Åtgärd om villkor n är sant]Case Else[Åtgärd om ingen är sann]Avsluta Välj

Var:

[Testuttryck] - Är värdet att utvärdera. Vanligtvis är detta en variabel.

[Åtgärd om villkor n är sant] - Är bara koden som ska köras om villkoret är uppfyllt (precis som med ett If -uttalande)

[Villkor n] - Är villkoret att testa. Det finns många olika sätt att testa förhållanden. Vi kommer att diskutera dem nedan.

Ärendeförklaringen kommer att köra koden för det FÖRSTA villkoret som befinner sig vara SANT. Om inget villkor är uppfyllt kommer ingen kod att köras, såvida inte Else -satsen läggs till.

Välj fallskriterier

Välj fall kan användas för att utvärdera både numeriska värden och text. Först kommer vi att diskutera hur man använder Select Cases för att utvärdera numeriska uttryck.

Exakt matchning - siffror

Du kan enkelt testa för en exakt matchning med ett ärendebesked:

1 Fall 10

eller lägg till kommatecken för att testa exakta matchningar med flera nummer:

1 Ärende 20, 30, 40
1234567891011121314 Sub ExactMatch_Numbers ()Dim n Som heltaln = CInt (InputBox ("…"))Välj fall nrFall 10'Om n är 10 DåÄrende 20, 30, 40'Om n är 20/30/40 DåCase Else'Om n inte är 20/10/30/40 DåAvsluta VäljAvsluta Sub

Områden

Du kan testa om ett tal faller inom ett intervall så här:

1 Mål 55 till 74

Detta förfarande kommer att generera en bokstavspoäng för en elev baserat på deras numeriska poäng:

12345678910111213141516171819202122 Sub Calc_Grade ()Dim Score som heltalDim LetterGrade som strängPoäng = InputBox ("Ange studentpoäng")Välj fallpoängÄrende 90 till 100LetterGrade = "A"Ärende 80 till 90LetterGrade = "B"Ärende 70 till 80LetterGrade = "C"Ärende 60 till 70LetterGrade = "D"Case ElseLetterGrade = "F"Avsluta VäljMsgBox "Studentens betyg är:" & LetterGradeAvsluta Sub

Du kan också testa intervall med Case Is

Välj fall är

1234 Fallet är <55'Göra ingentingFall <= 74MsgBox "In Range"

Kom ihåg att målmeddelandet endast kommer att köra kod för ENDAST den första matchen.

Detta förfarande kommer att beräkna en elevs betyg med Case Is istället för Case To.

12345678910111213141516171819202122 Sub Select_Case_Is_Grade ()Dim Score som heltalDim LetterGrade som strängPoäng = InputBox ("Ange studentpoäng")Välj fallpoängFall är> = 90LetterGrade = "A"Fall är> = 80LetterGrade = "B"Fall är> = 70LetterGrade = "C"Fall är> = 60LetterGrade = "D"Case ElseLetterGrade = "F"Avsluta VäljMsgBox "Studentens betyg är:" & LetterGradeAvsluta Sub

Case Else

Du kan lägga till ”Case Else” i slutet av ditt ärendebesked för att göra något om inga villkor är uppfyllda:

1 Case Else

Se slutet av föregående kodexempel för att se hur Case Else kan användas.

Välj fall - text och liknande operatör

Hittills har våra Select Case -exempel fungerat endast med siffror. Du kan också använda Select Case -uttalanden med text.

Exakt matchning - Text

Du kan testa om uttrycket matchar en exakt fras så här:

1 Fall "rödbetor"

Eller använd kommatecken för att testa om uttrycket exakt matchar mer än en fras:

1 Skalet "Apple", "Banan", "Orange"

Att sätta ihop det ser ut så här:

12345678910 Sub ExactMatch_Food ()Välj fallintervall ("a1"). VärdeFall "rödbetor"MsgBox "Vegetable"Skalet "Apple", "Banan", "Orange"MsgBox "Frukt"Avsluta VäljAvsluta Sub

Versaler och gemener

Som standard är VBA är skiftlägeskänslig. Detta innebär att VBA anser att "Text" är annorlunda än "text". För att stänga av skiftlägeskänslighet, lägg till Alternativ Jämför text högst upp i din modul:

1 Alternativ Jämför text

Det här exemplet gör att Case Select inte är skiftlägeskänslig när du arbetar med text:

123456789101112 Alternativ Jämför textSub ExactMatch_Food ()Välj fallintervall ("a1"). VärdeFall "rödbetor"MsgBox "Vegetable"Skalet "Apple", "Banan", "Orange"MsgBox "Frukt"Avsluta VäljAvsluta Sub

Case Like

Med Like Operator kan du göra inexakta jämförelser. Om texten matchar returnerar Gilla SANT, om den inte matchar returnerar den FALSK. Detta gör Like -operatören lätt att använda med If -uttalanden, men det fungerar inte lika enkelt med ärendebesked.

Case Like - Ett misslyckat test

Följande kod visar att Like Operator inte fungerar med Select Case:

1234567891011 Sub Select_Case_Like_DoesnotWork ()Dim ord som strängword = "COCOA"Välj fallordFallord 2 Gilla "*C*C*"MsgBox "Bra"Case ElseMsgBox "Inte bra"Avsluta VäljAvsluta Sub

Case Like - Det rätta sättet

Vi kan dock lägga till uttrycket TRUE för att få Select -satsen att fungera med Like Operator:

1234567891011 Sub Select_Case_Like_CorrectWay ()Dim ord som strängword = "COCOA"Välj Case TrueFallord som "*C*C*"MsgBox "Bra"Case ElseMsgBox "Inte bra"Avsluta VäljAvsluta Sub

Fall - kolon

När du använder ett ärendebesked kan du lägga till så många rader kod som du vill köra med varje villkor. Men om du bara behöver köra en kodrad. Du kan använda en kolon (:) för att skriva allt på samma rad.

Här är samma elevbetygsexempel som tidigare, förutom att använda ett kolon för att förkorta koden:

1234567891011121314151617 Sub Calc_Grade_colon ()Dim Score som heltalDim LetterGrade som strängPoäng = InputBox ("Ange studentpoäng")Välj fallpoängFall 90 till 100: LetterGrade = "A"Fall 80 till 90: LetterGrade = "B"Fall 70 till 80: LetterGrade = "C"Fall 60 till 70: LetterGrade = "D"Annat fall: LetterGrade = "F"Avsluta VäljMsgBox "Studentens betyg är:" & LetterGradeAvsluta Sub

Fallval - och / eller - flera villkor

Du kan använda And / Eller -operatörerna för att testa ytterligare kriterier tillsammans med Select Case.

I det här exemplet använder vi ett Select Case för variabeln 'age', men vi vill också testa sex. Så vi använder And Operator för att utföra det mer komplexa testet:

123456789101112131415161718 Sub NestedSelectCase ()Dim sex As StringDim ålder som heltalkön = "man" eller kvinnaålder = 15Välj fallålderFall är <20 Och sex = "man"Msgbox "Man under 20"Fall är <20 Och sex = "kvinna"Msgbox "Kvinna under 20"Fall är> = 20 Och kön = "man"Msgbox "Man över 20"Fall är> = 20 Och kön = "hona"Msgbox "Kvinna över 20"Avsluta VäljAvsluta Sub

Kapslade ärenden

Precis som If -uttalanden kan du hölja falleråd i varandra:

123456789101112131415161718192021222324 Sub NestedSelectCase ()Dim sex As StringDim ålder som heltalkön = "man" eller kvinnaålder = 15Välj fallålderFallet är <20Välj Case -sexFallet "hane"MsgBox "Man under 20"Fallet "hona"MsgBox "Kvinna under 20"Avsluta VäljFall är> = 20 Och kön = "hona"Välj Case -sexFallet "hane"MsgBox "Man över 20"Fallet "hona"MsgBox "Kvinna över 20"Avsluta VäljAvsluta VäljAvsluta Sub

Ärendeförklaring vs. om uttalande

Ju fler villkor att testa, desto mer användbart jämförs ärendeförklaringen med ett if -uttalande. Låt oss titta på ett exempel.

Här är koden som krävs för att testa om ett kalkylblads namn är lika med en uppsättning värden med hjälp av en If -sats:

12345 Om Namn = "Budget" Eller Namn = "Prognos" Eller Namn = "Trailing12" Eller _Namn = "Flex" Eller Namn = "OtherRatios" Eller Namn = "Jämförelse" Eller _Namn = "BudReview" Eller Namn = "P & L_Review" Eller Namn = "Annat" Då'Göra någontingAvsluta om

Här är samma kod med en Select Statement istället:

12345 Välj fallnamnFall "Budget", "Prognos", "Trailing12", "Flex", "OtherRatios", _"Jämförelse", "BudReview", "P & L_Review", "Övrigt"'Göra någontingAvsluta Välj

Du kan se att det är mycket lättare att använda ett Select -uttalande i det här scenariot. Det är betydligt mindre att skriva, och det är mycket lättare att läsa.

VBA Exempel på fall

Ex 1. Uttalande av ärenden Användardefinierad funktion (UDF)

Låt oss replikera vårt exempel på betygsberäkning ovan och skapa en UDF för att beräkna en elevs poäng:

12345678910111213141516 Funktion GetGrade (poäng som heltal) som strängVälj fallpoängÄrende 90 till 100GetGrade = "A"Ärende 80 till 90GetGrade = "B"Ärende 70 till 80GetGrade = "C"Ärende 60 till 70GetGrade = "D"Case ElseGetGrade = "F"Avsluta VäljAvsluta funktion

Nu kan vi använda Function GetGrade i vårt Excel -kalkylblad för att snabbt beräkna studentbetyg:

Ex 2. Testarkets namn / Loop Case Statement

Den här koden går igenom alla kalkylblad i en arbetsbok, Oskyddade blad som uppfyller vissa kriterier:

123456789101112 Sub Case_UnProtectSheet ()Dim ws Som arbetsbladFör varje ws i kalkylbladVälj Fall ws.Name 'Lista över alla blad med förhållandenFall "Budget", "Prognos", "Trailing12", "Flex", "OtherRatios", _"Jämförelse", "BudReview", "P & L_Review", "Övrigt"ws.OskyddadAvsluta VäljNästa wsAvsluta Sub

Ex. 3. Välj fall - cellvärde

Detta exempel kommer att testa en elevs poäng i en cell, vilket ger bokstäverna direkt till cellen till höger.

12345678910111213141516 Sub TestCellValue ()Dim cell As RangeAnge cell = intervall ("C1")Välj fallcell. VärdeÄrende 90 till 100cell.Offset (0, 1) = "A"Ärende 80 till 90cell.Offset (0, 1) = "B"Ärende 70 till 80cell.Offset (0, 1) = "C"Ärende 60 till 80cell.Offset (0, 1) = "D"Avsluta VäljAvsluta Sub

Ex. 4. Välj fall - datum

Detta Case Select -exempel är en funktion som testar vilket kvartalsdatum som faller in.

123456789101112131415161718 Sub TestDate ()MsgBox GetQuarter (CDate ("7/20/2019"))Avsluta SubFunktion GetQuarter (dt As Date) Som heltalDim sht Som arbetsbladVälj fall dtFall CDate ("01/01/2019") Till CDate ("31/03/2019")GetQuarter = 1Fall CDate ("04/01/2019") Till CDate ("30/06/2019")GetQuarter = 2Fall CDate ("07/01/2019") Till CDate ("30/09/2019")GetQuarter = 3Fall CDate ("10/01/2019") Till CDate ("31/12/2019")GetQuarter = 4Avsluta VäljAvsluta funktion

Eftersom det är en funktion kan du använda den som en funktion i Excel:

Ex. 5 Kontrollera om antalet är udda eller jämnt

Detta exempel testar om ett tal är udda eller jämnt.

123456789101112 Sub CheckOddEven ()Dim n Som heltaln = InputBox ("Ange ett nummer")Välj Case n Mod 2Fall 0MsgBox "Antalet är jämnt."Fall 1MsgBox "Siffran är udda."Avsluta VäljAvsluta Sub

Ex. 6 Testa om datumet är på vardag eller helg

Dessa exempel kommer att testa om ett datum infaller på en vardag eller en helg.

123456789101112131415161718192021 Sub CheckWeekDay ()Dim dt As Datedt = CDate ("1/1/2020")Välj Case Weekday (dt)Fall vbMåndagMsgBox "Det är måndag"Fall vbTisdagMsgBox "Det är tisdag"Fall vb onsdagMsgBox "Det är onsdag"Fall vbTorsdagMsgBox "Det är torsdag"Fall vbFredagMsgBox "Det är fredag"Fall vbSaturdayMsgBox "Det är lördag"Fall vbSöndagMsgBox "Det är söndag"Avsluta VäljAvsluta Sub
123456789101112 Sub CheckWeekend ()Dim dt As Datedt = CDate ("1/1/2020")Välj Case Weekday (dt)Fall vbSaturday, vbSundayMsgBox "Det är en helg"Case ElseMsgBox "Det är inte en helg"Avsluta VäljAvsluta Sub

VBA Select Case i Access

Alla ovanstående exempel fungerar exakt likadant i Access VBA som i Excel VBA.

123456789101112131415161718192021 Sub TestCellValue ()Dim dbs som databasDim först som RecordSetStäll in dbs = CurrentDBAnge rst = dbs.OpenRecordset ("tblClients", dbOpenDynaset)Med första.MoveFirst.RedigeraVälj Case rst.Fields ("City")Fallet "Austin".rst.Fields ("TelCode") = "512"Fallet "Chicago".rst.Fields ("TelCode") = "312"Fallet "New YorK".rst.Fields ("TelCode") = "1212"Fall "San Fransisco".rst.Fields ("TelCode") = "415"Avsluta Välj.UppdateringSluta medAvsluta Sus
wave wave wave wave wave