I VBA, Vælg sagserklæring er et alternativ til If-Then erklæring, så du kan teste, om betingelserne er opfyldt, og køre specifik kode for hver betingelse. Select -erklæringen foretrækkes frem for If -erklæringen, når der er flere betingelser, der skal behandles.
Vælg case -eksempel
Dette eksempel beder brugeren om en YesNoCancel MessageBox og tester, hvilken mulighed brugeren valgte:
1234567891011121314 | Sub Select_Case_Yes_No_Cancel ()Dim nResult Som VbMsgBoxResultnResult = MsgBox ("…", vbYesNoCancel)Vælg Sag nResultSag vbJaMsgBox "Ja"Sag vbNrMsgBox "Nej"Sag vbCancelMsgBox "Annuller"Afslut VælgAfslut Sub |
Nedenfor har vi i stedet skrevet det tilsvarende ved hjælp af en If -erklæring. Du vil bemærke, at Case Select -erklæringen indebærer lidt mindre indtastning - denne fordel forstærkes, når du tester flere kriterier.
12345678910111213 | Sub If_Yes_No_Cancel ()Dim nResult Som VbMsgBoxResultnResult = MsgBox ("…", vbYesNoCancel)Hvis nResult = vbJaMsgBox "Ja"ElseIf nResult = vbNo SåMsgBox "Nej"ElseIf nResult = vbCancel HerefterMsgBox "Annuller"Afslut HvisAfslut Sub |
Sagserklæring Syntaks
Syntaks for Select Case Statement er som følger:
12345678910 | Vælg sag [Testudtryk]Sag [Betingelse 1][Handling hvis betingelse 1 er sand]Sag [Betingelse 2][Handling hvis betingelse 2 er sand]Sag [Betingelse n][Handling hvis betingelse n er sand]Sag ellers[Handling hvis ingen er sande]Afslut Vælg |
Hvor:
[Testudtryk] - Er værdien at vurdere. Normalt er dette en variabel.
[Handling hvis betingelse n er sand] - Er bare koden, der skal køres, hvis betingelsen er opfyldt (ligesom med en If -erklæring)
[Betingelse n] - Er betingelsen for at teste. Der er mange forskellige måder at teste forholdene på. Vi vil diskutere dem nedenfor.
Sagserklæringen vil udføre koden for den FØRSTE betingelse, der findes SAND. Hvis ingen betingelse er opfyldt, udføres der ingen kode, medmindre Else -klausulen tilføjes.
Vælg sagskriterier
Select Cases kan bruges til at evaluere både numeriske værdier og tekst. Først vil vi diskutere, hvordan du bruger Select Cases til at evaluere numeriske udtryk.
Præcis match - tal
Du kan nemt teste for en nøjagtig match med en sagserklæring:
1 | Sag 10 |
eller tilføj kommaer for at teste for nøjagtige kampe med flere tal:
1 | Sag 20, 30, 40 |
1234567891011121314 | Sub ExactMatch_Numbers ()Dim n Som heltaln = CInt (InputBox ("…"))Vælg sag nSag 10'Hvis n er 10 SåSag 20, 30, 40'Hvis n er 20/30/40 SåSag ellers'Hvis n ikke er 10/20/30/40 SåAfslut VælgAfslut Sub |
Intervaller
Du kan teste, om et tal falder inden for et område som sådan:
1 | Sag 55 til 74 |
Denne procedure genererer en bogstavscore for en elev baseret på deres numeriske score:
12345678910111213141516171819202122 | Sub Calc_Grade ()Dim Score som heltalDim LetterGrade som strengScore = InputBox ("Enter Student Score")Vælg sagscoreSag 90 til 100LetterGrade = "A"Sag 80 til 90LetterGrade = "B"Sag 70 til 80LetterGrade = "C"Sag 60 til 70LetterGrade = "D"Sag ellersLetterGrade = "F"Afslut VælgMsgBox "Elevens karakter er:" & LetterGradeAfslut Sub |
Du kan også teste intervaller med Case Is
Vælg Case Is
1234 | Sagen er <55'Gøre ingentingSag <= 74MsgBox "In Range" |
Husk, at sagserklæringen kun vil udføre kode for KUN den første kamp.
Denne procedure beregner en elevs karakter ved hjælp af Case Is i stedet for Case To.
12345678910111213141516171819202122 | Sub Select_Case_Is_Grade ()Dim Score som heltalDim LetterGrade som strengScore = InputBox ("Enter Student Score")Vælg sagscoreSag er> = 90LetterGrade = "A"Sag er> = 80LetterGrade = "B"Sag er> = 70LetterGrade = "C"Sag er> = 60LetterGrade = "D"Sag ellersLetterGrade = "F"Afslut VælgMsgBox "Elevens karakter er:" & LetterGradeAfslut Sub |
Sag ellers
Du kan tilføje "Case Else" til slutningen af din sagserklæring for at gøre noget, hvis ingen betingelser er opfyldt:
1 | Sag ellers |
Se slutningen på det forrige kodeeksempel for at se, hvordan Case Else kan bruges.
Vælg sag - tekst og lignende operatør
Hidtil har vores Select Case -eksempler kun fungeret med tal. Du kan også bruge Select Case -sætninger med tekst.
Præcis match - tekst
Du kan teste, om udtrykket matcher en nøjagtig sætning som denne:
1 | Sag "rødbeder" |
Eller brug kommaer til at teste, om udtrykket nøjagtigt matcher mere end én sætning:
1 | Etui "Apple", "Banan", "Orange" |
At sætte det sammen ligner:
12345678910 | Sub ExactMatch_Food ()Vælg Case Range ("a1"). VærdiSag "rødbeder"MsgBox "Grøntsag"Etui "Apple", "Banan", "Orange"MsgBox "Frugt"Afslut VælgAfslut Sub |
Store og små bogstaver
Som standard er VBA er store og små bogstaver. Det betyder, at VBA anser "Tekst" anderledes end "tekst". For at deaktivere store og små bogstaver skal du tilføje Option Compare Text til toppen af dit modul:
1 | Mulighed Sammenlign tekst |
Dette eksempel vil gøre Case Select store og små bogstaver ufølsomme, når du arbejder med tekst:
123456789101112 | Mulighed Sammenlign tekstSub ExactMatch_Food ()Vælg Case Range ("a1"). VærdiSag "rødbeder"MsgBox "Grøntsag"Etui "Apple", "Banan", "Orange"MsgBox "Frugt"Afslut VælgAfslut Sub |
Case Like
Like Operator giver dig mulighed for at foretage unøjagtige sammenligninger. Hvis teksten matcher, returnerer Like SAND, hvis den ikke matcher, returnerer den FALSK. Dette gør Like -operatøren let at bruge med If -erklæringer, men den fungerer ikke lige så let med sagserklæringer.
Case Like - En mislykket test
Følgende kode viser, at Like -operatøren ikke fungerer med Select Case:
1234567891011 | Sub Select_Case_Like_DoesnotWork ()Svagt ord som strengword = "COCOA"Vælg Case -ordCase word2 Like "*C*C*"MsgBox "Godt"Sag ellersMsgBox "Ikke godt"Afslut VælgAfslut Sub |
Case Like - Den korrekte måde
Vi kan dog tilføje det SANDE udtryk for at få Select -sætningen til at fungere med Like -operatøren:
1234567891011 | Sub Select_Case_Like_CorrectWay ()Svagt ord som strengword = "COCOA"Vælg Case TrueSagord som "*C*C*"MsgBox "Godt"Sag ellersMsgBox "Ikke godt"Afslut VælgAfslut Sub |
Sag - kolon
Når du bruger en sagserklæring, kan du tilføje så mange linjer med kode, som du gerne vil køre med hver betingelse. Men hvis du kun skal køre en linje med kode. Du kan bruge et kolon (:) til at skrive alt på samme linje.
Her er det samme elevkaraktereksempel som før, undtagen at bruge et kolon til at forkorte koden:
1234567891011121314151617 | Sub Calc_Grade_colon ()Dim Score som heltalDim LetterGrade som strengScore = InputBox ("Enter Student Score")Vælg sagscoreSag 90 til 100: LetterGrade = "A"Sag 80 til 90: LetterGrade = "B"Sag 70 til 80: LetterGrade = "C"Sag 60 til 70: LetterGrade = "D"Ellers sag: LetterGrade = "F"Afslut VælgMsgBox "Elevens karakter er:" & LetterGradeAfslut Sub |
Case Select - Og / Eller - Flere betingelser
Du kan bruge And / Eller -operatørerne til at teste yderligere kriterier sammen med Select Case.
I dette eksempel bruger vi en Select Case på variablen 'alder', men vi vil også teste køn. Så vi bruger And Operator til at udføre den mere komplekse test:
123456789101112131415161718 | Sub NestedSelectCase ()Dim sex As StringDim alder Som heltalkøn = "han" eller kvindealder = 15Vælg Sagens alderCase Is <20 And sex = "male"Msgbox "Mand under 20"Sag er <20 Og sex = "kvinde"Msgbox "Kvinde under 20"Sag er> = 20 Og køn = "mand"Msgbox "Mand over 20"Sag er> = 20 Og køn = "kvinde"Msgbox "Kvinde over 20"Afslut VælgAfslut Sub |
Indlejrede sagserklæringer
Ligesom If -erklæringer kan du indlejre sagsopgørelser inde i hinanden:
123456789101112131415161718192021222324 | Sub NestedSelectCase ()Dim sex As StringDim alder Som heltalkøn = "han" eller kvindealder = 15Vælg Sagens alderSag er <20Vælg Case -sexSag "mand"MsgBox "Mand under 20"Sag "kvinde"MsgBox "Kvinde under 20"Afslut VælgSag er> = 20 Og køn = "kvinde"Vælg Case sexSag "mand"MsgBox "Mand over 20"Sag "kvinde"MsgBox "Kvinde over 20"Afslut VælgAfslut VælgAfslut Sub |
Sagserklæring vs. if -erklæring
Jo flere betingelser der skal testes, jo mere nyttig er sagserklæringen sammenlignet med en If -erklæring. Lad os se på et eksempel.
Her er den kode, der kræves for at teste, om et regnearks navn er lig med et sæt værdier ved hjælp af en If -erklæring:
12345 | Hvis Navn = "Budget" Eller Navn = "Prognose" Eller Navn = "Efterfølgende12" Eller _Name = "Flex" Eller Name = "OtherRatios" Eller Name = "Comparison" Eller _Name = "BudReview" Eller Name = "P & L_Review" Eller Name = "Other" Herefter'Gør nogetAfslut Hvis |
Her er den samme kode ved hjælp af en Select Statement i stedet:
12345 | Vælg sagsnavnSag "Budget", "Forecast", "Trailing12", "Flex", "OtherRatios", _"Sammenligning", "BudReview", "P & L_Review", "Andet"'Gør nogetAfslut Vælg |
Du kan se, at det er meget lettere at bruge en Select -erklæring i dette scenario. Det er betydeligt mindre at skrive, og det er meget lettere at læse.
VBA Select Case -eksempler
Eks. 1. Sagserklæring Brugerdefineret funktion (UDF)
Lad os replikere vores eksempel på karakterberegning ovenfor og oprette en UDF til at beregne en elevs score:
12345678910111213141516 | Funktion GetGrade (Score As Integer) As StringVælg sagscoreSag 90 til 100GetGrade = "A"Sag 80 til 90GetGrade = "B"Sag 70 til 80GetGrade = "C"Sag 60 til 70GetGrade = "D"Sag ellersGetGrade = "F"Afslut VælgAfslut funktion |
Nu kan vi bruge Function GetGrade i vores Excel -regneark til hurtigt at beregne elevernes karakterer:
Eks. 2. Testarkets navn / loop -erklæring
Denne kode går gennem alle regneark i en projektmappe, Un -Protecting sheets, der opfylder visse kriterier:
123456789101112 | Sub Case_UnProtectSheet ()Dim ws Som regnearkFor hver gang i regnearkVælg Case ws.Name 'Liste over alle ark med forholdSag "Budget", "Forecast", "Trailing12", "Flex", "OtherRatios", _"Sammenligning", "BudReview", "P & L_Review", "Andet"ws.BeskytAfslut VælgNæste wsAfslut Sub |
Eks. 3. Vælg sag - celleværdi
Dette eksempel tester en elevs score i en celle og sender bogstavkarakteren direkte til cellen til højre.
12345678910111213141516 | Sub TestCellValue ()Dim celle som områdeIndstil celle = område ("C1")Vælg sagcelle. VærdiSag 90 til 100cell.Offset (0, 1) = "A"Sag 80 til 90cell.Offset (0, 1) = "B"Sag 70 til 80cell.Offset (0, 1) = "C"Sag 60 til 80cell.Offset (0, 1) = "D"Afslut VælgAfslut Sub |
Eks. 4. Vælg sag - datoer
Dette Case Select -eksempel er en funktion, der tester, hvilken kvartal der falder ind.
123456789101112131415161718 | Sub TestDate ()MsgBox GetQuarter (CDate ("7/20/2019"))Afslut SubFunktion GetQuarter (dt As Date) Som IntegerDim sht Som regnearkVælg Case dtSag CDate ("01/01/2019") Til CDate ("31/03/2019")GetQuarter = 1Sag CDate ("04/01/2019") Til CDate ("06/30/2019")GetQuarter = 2Sag CDate ("07/01/2019") Til CDate ("30/09/2019")GetQuarter = 3Sag CDate ("10/01/2019") Til CDate ("31/12/2019")GetQuarter = 4Afslut VælgAfslut funktion |
Fordi det er en funktion, kan du bruge den som en funktion i Excel:
Eks. 5 Kontroller, om tallet er ulige eller lige
Dette eksempel tester, om et tal er ulige eller lige.
123456789101112 | Sub CheckOddEven ()Dim n Som heltaln = InputBox ("Indtast et tal")Vælg Case n Mod 2Sag 0MsgBox "Tallet er lige."Sag 1MsgBox "Tallet er ulige."Afslut VælgAfslut Sub |
Eks. 6 Test, om datoen er på hverdag eller weekend
Disse eksempler tester, om en dato falder på en hverdag eller en weekend.
123456789101112131415161718192021 | Sub CheckWeekDay ()Dim dt As Datedt = CDate ("1/1/2020")Vælg sag Ugedag (dt)Sag vbMandagMsgBox "Det er mandag"Sag vbTirsdagMsgBox "Det er tirsdag"Sag vb onsdagMsgBox "Det er onsdag"Sag vbTorsdagMsgBox "Det er torsdag"Sag vbFredagMsgBox "Det er fredag"Sag vbSaturdayMsgBox "Det er lørdag"Sag vbSøndagMsgBox "Det er søndag"Afslut VælgAfslut Sub |
123456789101112 | Sub CheckWeekend ()Dim dt As Datedt = CDate ("1/1/2020")Vælg sag Ugedag (dt)Sag vbSaturday, vbSundayMsgBox "Det er en weekend"Sag ellersMsgBox "Det er ikke en weekend"Afslut VælgAfslut Sub |
VBA Select Case i Access
Alle ovenstående eksempler fungerer nøjagtig det samme i Access VBA som i Excel VBA.
123456789101112131415161718192021 | Sub TestCellValue ()Dim dbs som databaseDim først som RecordSetIndstil dbs = CurrentDBIndstil rst = dbs.OpenRecordset ("tblClients", dbOpenDynaset)Med første.MoveFirst.RedigereVælg Case rst.Fields ("By")Sag "Austin".rst.Fields ("TelCode") = "512"Sag "Chicago".rst.Fields ("TelCode") = "312"Sag "New YorK".rst.Fields ("TelCode") = "1212"Sag "San Fransisco".rst.Fields ("TelCode") = "415"Afslut Vælg.OpdaterAfslut medAfslut Sus |