If-Then är VBA:s viktigaste kontrollstruktur. Du kommer förmodligen att använda det här kommandot dagligen. Använd If-Then-strukturen när du vill köra en eller flera satser villkorligt. Den valfria Else-satsen, om den ingår, låter dig köra en eller flera satser om villkoret du testar inte är sant. Här är en enkel CheckUser-procedur, omkodad för att använda If-Then-Else-strukturen:
Sub CheckUser2()
Användarnamn = InputBox("Ange ditt namn: ")
Om Användarnamn = "Satya Nadella" Då
MsgBox ("Välkommen Satya...")
' …[Mer kod här] …
Annan
MsgBox "Förlåt. Bara Satya Nadella kan köra det här.”
Avsluta om
Avsluta Sub
Om-Då exempel
Följande rutin visar If-Then-strukturen utan den valfria Else-satsen:
Sub GreetMe()
Om tid < 0,5 då MsgBox "God morgon"
Avsluta Sub
GreetMe-proceduren använder VBA:s tidsfunktion för att få systemtiden. Om den aktuella tiden är mindre än 0,5 visar rutinen en vänlig hälsning. Om tiden är större än eller lika med 0,5 slutar rutinen och ingenting händer.
För att visa en annan hälsning om tiden är större än eller lika med 0,5, kan du lägga till en annan If-Then-sats efter den första:
Sub GreetMe2()
Om tid < 0,5 då MsgBox "God morgon"
Om tid >= 0,5 då MsgBox "God eftermiddag"
Avsluta Sub
Lägg märke till att >= (större än eller lika med) används för den andra If-Then-satsen. Detta säkerställer att hela dagen täcks. Hade > (större än) använts, skulle inget meddelande visas om denna procedur utfördes exakt kl. 12.00. Det är ganska osannolikt, men med ett viktigt program som detta vill du inte ta några chanser.
Ett If-Then-Else-exempel
Ett annat förhållningssätt till det föregående problemet använder Else-satsen. Här är samma rutin omkodad för att använda If-Then-Else-strukturen:
Sub GreetMe3()
Om tid < 0,5 Då MsgBox "God morgon" Else _
MsgBox "God eftermiddag"
Avsluta Sub
Observera att linjefortsättningstecknet (understreck) används i föregående exempel. If-Then-Else-satsen är faktiskt ett enda påstående. VBA tillhandahåller ett något annorlunda sätt att koda If-Then-Else-konstruktioner som använder en End If-sats. Därför kan GreetMe-proceduren skrivas om som
Sub GreetMe4()
Om tid < 0,5 då
MsgBox "God morgon"
Annan
MsgBox "God eftermiddag"
Avsluta om
Avsluta Sub
Faktum är att du kan infoga valfritt antal påståenden under If-delen och valfritt antal påståenden under Else-delen. Denna syntax är lättare att läsa och gör påståendena kortare.
Vad händer om du behöver utöka GreetMe-rutinen för att hantera tre tillstånd: morgon, eftermiddag och kväll? Du har två alternativ: Använd tre If-Then-satser eller använd en kapslad If-Then-Else-struktur. Nesting innebär att placera en If-Then-Else-struktur inom en annan If-Then-Else-struktur. Det första tillvägagångssättet, med tre If-Then-satser, är enklare:
Sub GreetMe5()
Dim Msg As String
Om tid < 0,5 då Msg = "Morgon"
Om tid >= 0,5 och tid < 0,75 då Msg = "Eftermiddag"
Om Tid >= 0,75 då Msg = "Afton"
MsgBox “Bra” & Msg
Avsluta Sub
En ny twist lades till med användning av en variabel. Msg-variabeln får ett annat textvärde, beroende på tid på dygnet. MsgBox-meddelandet visar hälsningen: God morgon, god eftermiddag eller god kväll.
Följande rutin utför samma åtgärd men använder en If-Then-End If-struktur:
Sub GreetMe6()
Dim Msg As String
Om tid < 0,5 då
Msg = "morgon"
Avsluta om
Om tid >= 0,5 och tid < 0,75 då
Msg = "Eftermiddag"
Avsluta om
Om Tid >= 0,75 Då
Msg = "kväll"
Avsluta om
MsgBox “Bra” & Msg
Avsluta Sub
Använder ElseIf
I de föregående exemplen exekveras varje sats i rutinen. En något mer effektiv struktur skulle lämna rutinen så snart ett tillstånd befinns vara sant. På morgonen, till exempel, bör proceduren visa Good Morning-meddelandet och sedan avsluta — utan att utvärdera de andra överflödiga förhållandena.
Med en liten rutin som denna behöver du inte oroa dig för körhastigheten. Men för större applikationer där hastigheten är avgörande bör du känna till en annan syntax för If-Then-strukturen.
Så här kan du skriva om GreetMe-rutinen genom att använda den här syntaxen:
Sub GreetMe7()
Dim Msg As String
Om tid < 0,5 då
Msg = "morgon"
ElseOm Tid >= 0,5 Och Tid < 0,75 Då
Msg = "Eftermiddag"
Annan
Msg = "kväll"
Avsluta om
MsgBox “Bra” & Msg
Avsluta Sub
När ett villkor är sant, kör VBA de villkorliga satserna och If-strukturen slutar. Med andra ord är denna procedur lite mer effektiv än de tidigare exemplen. Avvägningen är att koden är svårare att förstå.
Ett annat If-Then-exempel
Här är ett annat exempel som använder den enkla formen av If-Then-strukturen. Denna procedur uppmanar användaren att ange en kvantitet och visar sedan lämplig rabatt, baserat på den kvantitet som användaren anger:
Sub ShowDiscount()
Dimmängd så lång
Dimrabatt som dubbel
Kvantitet = InputBox(”Ange kvantitet:”)
Om Kvantitet > 0 Då är rabatt = 0,1
Om kvantitet >= 25 Då rabatt = 0,15
Om Kvantitet >= 50 Då rabatt = 0,2
Om Kvantitet >= 75 Då rabatt = 0,25
MsgBox "Rabatt: " & rabatt
Avsluta Sub
Lägg märke till att varje If-Then-sats i denna rutin exekveras, och värdet för Discount kan ändras när satserna exekveras. Men rutinen visar i slutändan det korrekta värdet för Rabatt eftersom If-Then-satserna är i ordning efter stigande rabattvärden.
Följande procedur utför samma uppgifter genom att använda den alternativa ElseIf-syntaxen. I det här fallet avslutas rutinen omedelbart efter exekvering av satserna för ett sant tillstånd:
Sub ShowRabatt2()
Dimmängd så lång
Dimrabatt som dubbel
Kvantitet = InputBox("Ange kvantitet: ")
Om Kvantitet > 0 Och Kvantitet < 25 Då
Rabatt = 0,1
ElseIf Kvantitet >= 25 Och Kvantitet < 50 Då
Rabatt = 0,15
ElseIf Kvantitet >= 50 Och Kvantitet < 75 Då
Rabatt = 0,2
ElseOm Kvantitet >= 75 Då
Rabatt = 0,25
Avsluta om
MsgBox "Rabatt: " & rabatt
Avsluta Sub
Dessa multipla If-Then-strukturer är ganska besvärliga. Du kanske vill använda If-Then-strukturen endast för enkla binära beslut.