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 |