I VBA, Velg saksuttalelse er et alternativ til If-Then-uttalelse, slik at du kan teste om betingelsene er oppfylt, og kjøre spesifikk kode for hver tilstand. Velg -setningen er å foretrekke fremfor If -erklæringen når det er flere forhold som skal behandles.
Velg case -eksempel
Dette eksemplet ber brukeren om en YesNoCancel MessageBox og tester hvilket alternativ brukeren valgte:
1234567891011121314 | Sub Select_Case_Yes_No_Cancel ()Dim nResult As VbMsgBoxResultnResult = MsgBox ("…", vbYesNoCancel)Velg sak nResultSak vbJaMsgBox "Ja"Sak vbNrMsgBox "Nei"Sak vbCancelMsgBox "Avbryt"Avslutt VelgSlutt Sub |
Nedenfor har vi skrevet ut tilsvarende ved å bruke en If -erklæring i stedet. Du vil legge merke til at Case Select -erklæringen innebærer litt mindre skriving - denne fordelen forsterkes når du tester flere kriterier.
12345678910111213 | Sub If_Yes_No_Cancel ()Dim nResult As VbMsgBoxResultnResult = MsgBox ("…", vbYesNoCancel)Hvis nResult = vbJa DaMsgBox "Ja"ElseIf nResult = vbNo DaMsgBox "Nei"ElseIf nResult = vbCancel ThenMsgBox "Avbryt"Slutt omSlutt Sub |
Saksfremstilling Syntaks
Syntaksen Velg saksuttalelse er som følger:
12345678910 | Velg sak [Testuttrykk]Sak [Betingelse 1][Handling hvis betingelse 1 er sann]Sak [Betingelse 2][Handling hvis betingelse 2 er sann]Sak [Tilstand n][Handling hvis betingelse n er sann]Case Else[Handling hvis ingen er sanne]Avslutt Velg |
Hvor:
[Testuttrykk] - Er verdien å vurdere. Vanligvis er dette en variabel.
[Handling hvis betingelse n er sann] - Er bare koden som skal kjøres hvis betingelsen er oppfylt (akkurat som med en If -erklæring)
[Tilstand n] - Er betingelsen for å teste. Det er mange forskjellige måter å teste forholdene på. Vi vil diskutere dem nedenfor.
Sakserklæringen vil utføre koden for den FØRSTE tilstanden som er funnet å være SANN. Hvis ingen betingelse er oppfylt, vil ingen kode bli utført, med mindre Else -leddet legges til.
Velg sakskriterier
Select Cases kan brukes til å evaluere både numeriske verdier og tekst. Først vil vi diskutere hvordan du bruker Select Cases til å evaluere numeriske uttrykk.
Exact Match - Tall
Du kan enkelt teste for en eksakt samsvar med en saksuttalelse:
1 | Sak 10 |
eller legg til komma for å teste nøyaktige treff med flere tall:
1 | Sak 20, 30, 40 |
1234567891011121314 | Sub ExactMatch_Numbers ()Dim n Som heltalln = CInt (InputBox ("…"))Velg sak nrSak 10'Hvis n er 10 DaSak 20, 30, 40'Hvis n er 20/30/40 DaCase Else'Hvis n ikke er 20/10/30/40 DaAvslutt VelgSlutt Sub |
Rekkevidder
Du kan teste om et tall faller innenfor et område slik:
1 | Sak 55 til 74 |
Denne prosedyren vil generere en bokstavscore for en student basert på deres numeriske poengsum:
12345678910111213141516171819202122 | Sub Calc_Grade ()Dim Score As IntegerDim LetterGrade som strengPoengsum = InputBox ("Skriv inn studentpoeng")Velg Case ScoreSak 90 til 100LetterGrade = "A"Sak 80 til 90LetterGrade = "B"Sak 70 til 80LetterGrade = "C"Sak 60 til 70LetterGrade = "D"Case ElseLetterGrade = "F"Avslutt VelgMsgBox "Studentens karakter er:" & LetterGradeSlutt Sub |
Du kan også teste områder med Case Is
Velg Case Is
1234 | Saken er <55'Gjør ingentingSak <= 74MsgBox "In Range" |
Husk at sakserklæringen bare vil utføre kode for KUN den første kampen.
Denne prosedyren beregner en elevs karakter ved å bruke Case Is i stedet for Case To.
12345678910111213141516171819202122 | Sub Select_Case_Is_Grade ()Dim Score As IntegerDim LetterGrade som strengPoengsum = InputBox ("Skriv inn studentpoeng")Velg Case ScoreSak er> = 90LetterGrade = "A"Sak er> = 80LetterGrade = "B"Sak er> = 70LetterGrade = "C"Sak er> = 60LetterGrade = "D"Case ElseLetterGrade = "F"Avslutt VelgMsgBox "Studentens karakter er:" & LetterGradeSlutt Sub |
Case Else
Du kan legge til "Case Else" i slutten av sakserklæringen for å gjøre noe hvis ingen betingelser er oppfylt:
1 | Case Else |
Se slutten av forrige kodeeksempel for å se hvordan Case Else kan brukes.
Velg bokstav - tekst og lignende operatør
Så langt har våre eksempler på utvalgte saker bare fungert med tall. Du kan også bruke Select Case -setninger med tekst.
Exact Match - Tekst
Du kan teste om uttrykket samsvarer med et eksakt uttrykk som dette:
1 | Case "Beets" |
Eller bruk kommaer for å teste om uttrykket nøyaktig samsvarer med mer enn én setning:
1 | Etui "Apple", "Banana", "Orange" |
Å sette det sammen ser slik ut:
12345678910 | Sub ExactMatch_Food ()Velg saksområde ("a1"). VerdiCase "Beets"MsgBox "Vegetable"Etui "Apple", "Banana", "Orange"MsgBox "Frukt"Avslutt VelgSlutt Sub |
Store og små bokstaver
Som standard er VBA er store og små bokstaver. Dette betyr at VBA anser "Tekst" annerledes enn "tekst". For å slå av store og små bokstaver, legg til Alternativ Sammenlign tekst til toppen av modulen:
1 | Alternativ Sammenlign tekst |
Dette eksemplet vil gjøre case select ufølsomt for case-valg når du arbeider med tekst:
123456789101112 | Alternativ Sammenlign tekstSub ExactMatch_Food ()Velg saksområde ("a1"). VerdiCase "Beets"MsgBox "Vegetable"Etui "Apple", "Banana", "Orange"MsgBox "Frukt"Avslutt VelgSlutt Sub |
Case Like
Like Operator lar deg gjøre unøyaktige sammenligninger. Hvis teksten stemmer, returnerer Like SANN, hvis den ikke stemmer, returnerer den FALSK. Dette gjør Like -operatøren enkel å bruke med If -uttalelser, men den vil ikke fungere like lett med saksuttalelser.
Case Like - En mislykket test
Følgende kode viser at Like -operatøren ikke fungerer med Select Case:
1234567891011 | Sub Select_Case_Like_DoesnotWork ()Svakt ord som strengword = "COCOA"Velg SaksordCase word2 Like "*C*C*"MsgBox "Bra"Case ElseMsgBox "Ikke bra"Avslutt VelgSlutt Sub |
Case Like - Den riktige måten
Imidlertid kan vi legge til det SANNE uttrykket for å få Select -setningen til å fungere med Like Operator:
1234567891011 | Sub Select_Case_Like_CorrectWay ()Svakt ord som strengword = "COCOA"Velg Case TrueSaksord som "*C*C*"MsgBox "Bra"Case ElseMsgBox "Ikke bra"Avslutt VelgSlutt Sub |
Sak - kolon
Når du bruker en sakserklæring, kan du legge til så mange kodelinjer som du ønsker å kjøre med hver betingelse. Imidlertid, hvis du bare trenger å kjøre en linje med kode. Du kan bruke et kolon (:) til å skrive alt på samme linje.
Her er det samme elevkaraktereksemplet som før, bortsett fra å bruke et kolon for å forkorte koden:
1234567891011121314151617 | Sub Calc_Grade_colon ()Dim Score As IntegerDim LetterGrade som strengPoengsum = InputBox ("Skriv inn studentpoeng")Velg Case ScoreSak 90 til 100: LetterGrade = "A"Sak 80 til 90: LetterGrade = "B"Sak 70 til 80: LetterGrade = "C"Sak 60 til 70: LetterGrade = "D"Andre saker: LetterGrade = "F"Avslutt VelgMsgBox "Studentens karakter er:" & LetterGradeSlutt Sub |
Case Select - Og / Eller - Flere betingelser
Du kan bruke And / Eller -operatørene til å teste flere kriterier sammen med Select Case.
I dette eksemplet bruker vi en Select Case på variabelen ‘alder’, men vi vil også teste sex. Så vi bruker And Operator til å utføre den mer komplekse testen:
123456789101112131415161718 | Sub NestedSelectCase ()Dim sex As StringDim age As Integersex = "mann" eller kvinnealder = 15Velg saksalderCase Is <20 And sex = "male"Msgbox "Mann under 20"Case Is <20 And sex = "female"Msgbox "Kvinne under 20"Sak er> = 20 Og sex = "mann"Msgbox "Mann over 20"Case Is> = 20 And sex = "female"Msgbox "Kvinne over 20"Avslutt VelgSlutt Sub |
Nested Case Statements
På samme måte som If Statements, kan du hekke saksuttalelser inni hverandre:
123456789101112131415161718192021222324 | Sub NestedSelectCase ()Dim sex As StringDim age As Integersex = "mann" eller kvinnealder = 15Velg saksalderSak er <20Velg Case -sexSak "mann"MsgBox "Mann under 20"Sak "kvinne"MsgBox "Kvinne under 20"Avslutt VelgCase Is> = 20 And sex = "female"Velg Case -sexSak "mann"MsgBox "Mann over 20"Sak "kvinne"MsgBox "Kvinne over 20"Avslutt VelgAvslutt VelgSlutt Sub |
Sakserklæring vs. if -erklæring
Jo flere betingelser du skal teste, desto mer nyttig er sakserklæringen sammenlignet med en if -erklæring. La oss se på et eksempel.
Her er koden som kreves for å teste om et regnearksnavn tilsvarer et sett med verdier ved bruk av en If -setning:
12345 | Hvis Navn = "Budsjett" Eller Navn = "Prognose" Eller Navn = "Etterfølgende12" Eller _Name = "Flex" Eller Name = "OtherRatios" Eller Name = "Comparison" Eller _Name = "BudReview" Eller Name = "P & L_Review" Eller Name = "Other" Da'Gjør noeSlutt om |
Her er den samme koden ved å bruke en Select Statement i stedet:
12345 | Velg saksnavnCase "Budget", "Prognose", "Trailing12", "Flex", "OtherRatios", _"Sammenligning", "BudReview", "P & L_Review", "Annet"'Gjør noeAvslutt Velg |
Du kan se at det er mye lettere å bruke en Select -setning i dette scenariet. Det er betydelig mindre å skrive, og det er mye lettere å lese.
VBA Select Case -eksempler
Eks 1. Sakserklæring User Defined Function (UDF)
La oss replikere vårt karakterberegningseksempel ovenfor og lage en UDF for å beregne en elevs poengsum:
12345678910111213141516 | Funksjon GetGrade (Score As Integer) As StringVelg Case ScoreSak 90 til 100GetGrade = "A"Sak 80 til 90GetGrade = "B"Sak 70 til 80GetGrade = "C"Sak 60 til 70GetGrade = "D"Case ElseGetGrade = "F"Avslutt VelgSluttfunksjon |
Nå kan vi bruke Function GetGrade i vårt Excel -regneark for raskt å beregne elevkarakterer:
Eks. 2. Navn på testark / løkke -sak
Denne koden går gjennom alle regneark i en arbeidsbok, Un -Protecting sheets som oppfyller visse kriterier:
123456789101112 | Sub Case_UnProtectSheet ()Dim ws Som regnearkFor hver uke i regnearkVelg Case ws.Name 'Liste over alle ark med forholdCase "Budget", "Prognose", "Trailing12", "Flex", "OtherRatios", _"Sammenligning", "BudReview", "P & L_Review", "Annet"ws.UnbeskyttelseAvslutt VelgNeste wsSlutt Sub |
Eks. 3. Velg bokstav - celleverdi
Dette eksemplet vil teste en elevs poengsum i en celle, og skrive bokstavkarakteren direkte til cellen til høyre.
12345678910111213141516 | Sub TestCellValue ()Dim cell As RangeAngi celle = område ("C1")Velg bokstavcelle. VerdiSak 90 til 100cell.Offset (0, 1) = "A"Sak 80 til 90cell.Offset (0, 1) = "B"Sak 70 til 80cell.Offset (0, 1) = "C"Sak 60 til 80cell.Offset (0, 1) = "D"Avslutt VelgSlutt Sub |
Eks. 4. Velg sak - datoer
Dette Case Select -eksempelet er en funksjon som tester hvilken kvart dato som faller inn.
123456789101112131415161718 | Sub TestDate ()MsgBox GetQuarter (CDate ("7/20/2019"))Slutt SubFunksjon GetQuarter (dt As Date) As IntegerDim sht Som regnearkVelg Case dtSak CDate ("01/01/2019") Til CDate ("31/03/2019")GetQuarter = 1Sak CDate ("04/01/2019") Til CDate ("30/06/2019")GetQuarter = 2Sak CDate ("07/01/2019") Til CDate ("30/09/2019")GetQuarter = 3Sak CDate ("10/01/2019") Til CDate ("31/12/2019")GetQuarter = 4Avslutt VelgSluttfunksjon |
Fordi det er en funksjon, kan du bruke den som en funksjon i Excel:
Eks. 5 Sjekk om tallet er oddetall eller partall
Dette eksemplet tester om et tall er oddetall eller partall.
123456789101112 | Sub CheckOddEven ()Dim n Som heltalln = InputBox ("Skriv inn et tall")Velg Case n Mod 2Sak 0MsgBox "Tallet er jevnt."Sak 1MsgBox "Tallet er rart."Avslutt VelgSlutt Sub |
Eks. 6 Test om datoen er på ukedag eller helg
Disse eksemplene vil teste om en dato faller på en ukedag eller en helg.
123456789101112131415161718192021 | Sub CheckWeekDay ()Dim dt As Datedt = CDate ("1/1/2020")Velg Case Weekday (dt)Vb mandagMsgBox "Det er mandag"Sak vbTirsdagMsgBox "Det er tirsdag"Sak vb onsdagMsgBox "Det er onsdag"Sak vbTorsdagMsgBox "Det er torsdag"Sak vbFredagMsgBox "Det er fredag"Sak vbLørdagMsgBox "Det er lørdag"Case vbSundayMsgBox "Det er søndag"Avslutt VelgSlutt Sub |
123456789101112 | Sub CheckWeekend ()Dim dt As Datedt = CDate ("1/1/2020")Velg Case Weekday (dt)Sak vbSaturday, vbSundayMsgBox "Det er en helg"Case ElseMsgBox "Det er ikke en helg"Avslutt VelgSlutt Sub |
VBA Select Case in Access
Alle eksemplene ovenfor fungerer nøyaktig det samme i Access VBA som i Excel VBA.
123456789101112131415161718192021 | Sub TestCellValue ()Dim dbs som databaseDim først som RecordSetSett dbs = CurrentDBSett rst = dbs.OpenRecordset ("tblClients", dbOpenDynaset)Med første.MoveFirst.RedigereVelg Case rst.Fields ("City")Sak "Austin".rst.Fields ("TelCode") = "512"Sak "Chicago".rst.Fields ("TelCode") = "312"Sak "New YorK".rst.Fields ("TelCode") = "1212"Sak "San Fransisco".rst.Fields ("TelCode") = "415"Avslutt Velg.OppdaterSlutt medSlutt Sus |