VBA Select Case Statement

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
wave wave wave wave wave