If-Then er VBAs vigtigste kontrolstruktur. Du vil sandsynligvis bruge denne kommando på daglig basis. Brug If-Then-strukturen, når du vil udføre en eller flere sætninger betinget. Den valgfri Else-sætning, hvis den er inkluderet, lader dig udføre en eller flere sætninger, hvis den betingelse, du tester, ikke er sand. Her er en simpel CheckUser-procedure, omkodet til at bruge If-Then-Else-strukturen:
Sub CheckUser2()
Brugernavn = InputBox(“Indtast dit navn: “)
Hvis Brugernavn = "Satya Nadella" Så
MsgBox ("Velkommen Satya...")
' …[Mere kode her] …
Andet
MsgBox "Beklager. Kun Satya Nadella kan køre dette."
Afslut Hvis
Slut Sub
Hvis-så eksempler
Følgende rutine viser If-Then-strukturen uden den valgfri Else-sætning:
Sub GreetMe()
Hvis Tid < 0,5, så MsgBox "Godmorgen"
Slut Sub
GreetMe-proceduren bruger VBAs tidsfunktion til at få systemtiden. Hvis den aktuelle tid er mindre end 0,5, viser rutinen en venlig hilsen. Hvis tiden er større end eller lig med 0,5, slutter rutinen, og der sker ikke noget.
For at vise en anden hilsen, hvis Time er større end eller lig med 0,5, kan du tilføje en anden If-Then-sætning efter den første:
Sub GreetMe2()
Hvis Tid < 0,5, så MsgBox "Godmorgen"
Hvis Tid >= 0,5, så MsgBox "God eftermiddag"
Slut Sub
Bemærk, at >= (større end eller lig med) bruges til den anden If-Then-sætning. Dette sikrer, at hele dagen er dækket. Var > (større end) blevet brugt, ville der ikke komme nogen meddelelse, hvis denne procedure blev udført præcis kl. 12.00. Det er ret usandsynligt, men med et vigtigt program som dette ønsker du ikke at tage nogen chancer.
Et Hvis-Så-Andet eksempel
En anden tilgang til det foregående problem bruger Else-sætningen. Her er den samme rutine omkodet for at bruge If-Then-Else-strukturen:
Sub GreetMe3()
Hvis Tid < 0,5 Så MsgBox “Godmorgen” Else _
MsgBox "God eftermiddag"
Slut Sub
Bemærk, at linjefortsættelsestegn (understregning) er brugt i det foregående eksempel. If-Then-Else-sætningen er faktisk en enkelt erklæring. VBA giver en lidt anderledes måde at kode If-Then-Else-konstruktioner, der bruger en End If-sætning. Derfor kan GreetMe-proceduren omskrives som
Sub GreetMe4()
Hvis Tid < 0,5 Så
MsgBox "Godmorgen"
Andet
MsgBox "God eftermiddag"
Afslut Hvis
Slut Sub
Faktisk kan du indsætte et hvilket som helst antal udsagn under If-delen og et hvilket som helst antal udsagn under Else-delen. Denne syntaks er lettere at læse og gør udsagn kortere.
Hvad hvis du har brug for at udvide GreetMe-rutinen til at håndtere tre forhold: morgen, eftermiddag og aften? Du har to muligheder: Brug tre If-Then-sætninger eller brug en indlejret If-Then-Else-struktur. Nesting betyder at placere en If-Then-Else-struktur i en anden If-Then-Else-struktur. Den første tilgang, der bruger tre If-Then-sætninger, er enklere:
Sub GreetMe5()
Dæmp besked som streng
Hvis tid < 0,5 så besked = "morgen"
Hvis tid >= 0,5 og tid < 0,75, så er Msg = "Eftermiddag"
Hvis Tid >= 0,75, så Msg = "Aften"
MsgBox "God" & Msg
Slut Sub
Et nyt twist blev tilføjet ved brug af en variabel. Msg-variablen får en anden tekstværdi, afhængigt af tidspunktet på dagen. MsgBox-erklæringen viser hilsenen: Godmorgen, god eftermiddag eller godaften.
Følgende rutine udfører den samme handling, men bruger en If-Then-End If-struktur:
Sub GreetMe6()
Dæmp besked som streng
Hvis Tid < 0,5 Så
Msg = "morgen"
Afslut Hvis
Hvis tid >= 0,5 og tid < 0,75 så
Msg = "Eftermiddag"
Afslut Hvis
Hvis Tid >= 0,75 Så
Msg = "Aften"
Afslut Hvis
MsgBox "God" & Msg
Slut Sub
Brug af ElseIf
I de foregående eksempler udføres hver sætning i rutinen. En lidt mere effektiv struktur ville forlade rutinen, så snart en betingelse viser sig at være sand. Om morgenen skal proceduren f.eks. vise meddelelsen Godmorgen og derefter afslutte — uden at evaluere de andre overflødige forhold.
Med en lille rutine som denne behøver du ikke bekymre dig om udførelseshastigheden. Men for større applikationer, hvor hastigheden er kritisk, bør du kende til en anden syntaks for If-Then-strukturen.
Sådan kan du omskrive GreetMe-rutinen ved at bruge denne syntaks:
Sub GreetMe7()
Dæmp besked som streng
Hvis Tid < 0,5 Så
Msg = "morgen"
ElseIf Time >= 0,5 og Time < 0,75 Then
Msg = "Eftermiddag"
Andet
Msg = "Aften"
Afslut Hvis
MsgBox "God" & Msg
Slut Sub
Når en betingelse er sand, udfører VBA de betingede sætninger, og If-strukturen slutter. Med andre ord er denne procedure en smule mere effektiv end de foregående eksempler. Afvejningen er, at koden er sværere at forstå.
Endnu et Hvis-Så-eksempel
Her er et andet eksempel, der bruger den simple form af If-Then-strukturen. Denne procedure beder brugeren om en mængde og viser derefter den relevante rabat, baseret på den mængde, brugeren indtaster:
Sub ShowRabat()
Dim mængde så længe
Dim Rabat Som Dobbelt
Antal = InputBox(“Indtast antal:”)
Hvis mængde > 0, så er rabat = 0,1
Hvis mængde >= 25, så rabat = 0,15
Hvis mængde >= 50, så rabat = 0,2
Hvis mængde >= 75, så rabat = 0,25
MsgBox “Rabat: “ & Rabat
Slut Sub
Bemærk, at hver If-Then-sætning i denne rutine udføres, og værdien for Discount kan ændre sig, efterhånden som sætningerne udføres. Rutinen viser dog i sidste ende den korrekte værdi for rabat, fordi If-Then-sætningerne er i rækkefølge efter stigende rabatværdier.
Følgende procedure udfører de samme opgaver ved at bruge den alternative ElseIf-syntaks. I dette tilfælde slutter rutinen umiddelbart efter udførelse af sætningerne for en sand tilstand:
Sub ShowRabat2()
Dim mængde så længe
Dim Rabat Som Dobbelt
Antal = InputBox("Indtast antal: ")
Hvis Mængde > 0 Og Mængde < 25 Så
Rabat = 0,1
ElseIf Mængde >= 25 Og Mængde < 50 Så
Rabat = 0,15
ElseIf Mængde >= 50 Og Mængde < 75 Så
Rabat = 0,2
ElseIf Mængde >= 75 Så
Rabat = 0,25
Afslut Hvis
MsgBox “Rabat: “ & Rabat
Slut Sub
Disse multiple Hvis-Så-strukturer er ret besværlige. Du vil måske kun bruge If-Then-strukturen til simple binære beslutninger.