If-Then er VBAs viktigste kontrollstruktur. Du vil sannsynligvis bruke denne kommandoen daglig. Bruk If-Then-strukturen når du vil utføre en eller flere setninger betinget. Den valgfrie Else-klausulen, hvis den er inkludert, lar deg utføre en eller flere setninger hvis betingelsen du tester ikke er sann. Her er en enkel CheckUser-prosedyre, omkodet for å bruke If-Then-Else-strukturen:
Sub CheckUser2()
UserName = InputBox("Skriv inn navnet ditt: ")
Hvis brukernavn = "Satya Nadella" Da
MsgBox ("Velkommen Satya ...")
' …[Mer kode her] …
Ellers
MsgBox "Beklager. Bare Satya Nadella kan kjøre dette.»
Slutt om
End Sub
Hvis-så eksempler
Følgende rutine demonstrerer If-Then-strukturen uten den valgfrie Else-klausulen:
Sub GreetMe()
Hvis tid < 0,5 så MsgBox "God morgen"
End Sub
GreetMe-prosedyren bruker VBAs tidsfunksjon for å få systemtiden. Hvis gjeldende tid er mindre enn 0,5, viser rutinen en vennlig hilsen. Hvis tiden er større enn eller lik 0,5, avsluttes rutinen, og ingenting skjer.
For å vise en annen hilsen hvis Time er større enn eller lik 0,5, kan du legge til en annen If-Then-setning etter den første:
Sub GreetMe2()
Hvis tid < 0,5 så MsgBox "God morgen"
Hvis tid >= 0,5 så MsgBox "God ettermiddag"
End Sub
Legg merke til at >= (større enn eller lik) brukes for den andre If-Then-setningen. Dette sikrer at hele dagen dekkes. Hadde > (større enn) blitt brukt, ville ingen melding vises hvis denne prosedyren ble utført nøyaktig kl. 12.00. Det er ganske usannsynlig, men med et viktig program som dette vil du ikke ta noen sjanser.
Et If-Then-Else-eksempel
En annen tilnærming til det foregående problemet bruker Else-klausulen. Her er den samme rutinen omkodet for å bruke If-Then-Else-strukturen:
Sub GreetMe3()
Hvis tid < 0,5 så MsgBox "God morgen" Else _
MsgBox "God ettermiddag"
End Sub
Legg merke til at linjefortsettelsestegn (understrek) brukes i det foregående eksempelet. If-Then-Else-setningen er faktisk en enkelt setning. VBA gir en litt annen måte å kode If-Then-Else-konstruksjoner som bruker en End If-setning. Derfor kan GreetMe-prosedyren skrives om som
Sub GreetMe4()
Hvis tid < 0,5 da
MsgBox "God morgen"
Ellers
MsgBox "God ettermiddag"
Slutt om
End Sub
Faktisk kan du sette inn et hvilket som helst antall utsagn under If-delen og et hvilket som helst antall utsagn under Else-delen. Denne syntaksen er lettere å lese og gjør utsagnene kortere.
Hva om du trenger å utvide GreetMe-rutinen til å håndtere tre forhold: morgen, ettermiddag og kveld? Du har to alternativer: Bruk tre If-Then-setninger eller bruk en nestet If-Then-Else-struktur. Nesting betyr å plassere en If-Then-Else-struktur i en annen If-Then-Else-struktur. Den første tilnærmingen, ved å bruke tre If-Then-setninger, er enklere:
Sub GreetMe5()
Dim melding som streng
Hvis tid < 0,5 så Msg = "Morgen"
Hvis tid >= 0,5 og tid < 0,75, så er Msg = "Ettermiddag"
Hvis Tid >= 0,75, så Msg = "Kveld"
MsgBox “Bra” & Msg
End Sub
En ny vri ble lagt til ved bruk av en variabel. Msg-variabelen får en annen tekstverdi, avhengig av tidspunktet på dagen. MsgBox-erklæringen viser hilsenen: God morgen, god ettermiddag eller god kveld.
Følgende rutine utfører samme handling, men bruker en If-Then-End If-struktur:
Sub GreetMe6()
Dim melding som streng
Hvis tid < 0,5 da
Msg = "Morgen"
Slutt om
Hvis tid >= 0,5 og tid < 0,75 da
Msg = "Ettermiddag"
Slutt om
Hvis Tid >= 0,75 Da
Msg = "Kveld"
Slutt om
MsgBox “Bra” & Msg
End Sub
Bruker ElseIf
I de foregående eksemplene blir hver setning i rutinen utført. En litt mer effektiv struktur vil gå ut av rutinen så snart en tilstand er funnet å være sann. Om morgenen, for eksempel, bør prosedyren vise meldingen God morgen og deretter avslutte — uten å evaluere de andre overflødige forholdene.
Med en liten rutine som dette trenger du ikke å bekymre deg for utførelseshastigheten. Men for større applikasjoner der hastigheten er kritisk, bør du vite om en annen syntaks for If-Then-strukturen.
Slik kan du omskrive GreetMe-rutinen ved å bruke denne syntaksen:
Sub GreetMe7()
Dim melding som streng
Hvis tid < 0,5 da
Msg = "Morgen"
ElseHvis Tid >= 0,5 Og Tid < 0,75 Da
Msg = "Ettermiddag"
Ellers
Msg = "Kveld"
Slutt om
MsgBox “Bra” & Msg
End Sub
Når en betingelse er sann, utfører VBA de betingede setningene, og If-strukturen avsluttes. Denne prosedyren er med andre ord litt mer effektiv enn de foregående eksemplene. Avveiningen er at koden er vanskeligere å forstå.
Et annet Hvis-Så-eksempel
Her er et annet eksempel som bruker den enkle formen til If-Then-strukturen. Denne prosedyren ber brukeren om et antall og viser deretter den aktuelle rabatten, basert på antallet brukeren angir:
Sub ShowDiscount()
Dim mengde så lenge
Dim rabatt som dobbel
Mengde = InputBox(“Skriv inn mengde:”)
Hvis mengde > 0, så er rabatt = 0,1
Hvis Mengde >= 25 Da Rabatt = 0,15
Hvis mengde >= 50, så er rabatt = 0,2
Hvis Mengde >= 75 Da Rabatt = 0,25
MsgBox "Rabatt: " & rabatt
End Sub
Legg merke til at hver If-Then-setning i denne rutinen utføres, og verdien for Rabatt kan endres etter hvert som setningene utføres. Rutinen viser imidlertid til slutt riktig verdi for rabatt fordi If-Then-setningene er i rekkefølge etter stigende rabattverdier.
Følgende prosedyre utfører de samme oppgavene ved å bruke den alternative ElseIf-syntaksen. I dette tilfellet avsluttes rutinen umiddelbart etter at setningene er utført for en sann tilstand:
Sub ShowRabatt2()
Dim mengde så lenge
Dim rabatt som dobbel
Mengde = InputBox(“Skriv inn mengde: “)
Hvis mengde > 0 og mengde < 25, da
Rabatt = 0,1
ElseIf Mengde >= 25 Og Mengde < 50 Da
Rabatt = 0,15
ElseIf Mengde >= 50 Og Mengde < 75 Da
Rabatt = 0,2
ElseIf Mengde >= 75 Da
Rabatt = 0,25
Slutt om
MsgBox "Rabatt: " & rabatt
End Sub
Disse multiple If-Then-strukturene er ganske tungvinte. Det kan være lurt å bruke If-Then-strukturen bare for enkle binære beslutninger.