If-Then je VBA-ova najvažnija kontrolna struktura. Ovu naredbu vjerojatno ćete koristiti svakodnevno. Koristite strukturu If-Then kada želite izvršiti uvjetno jedan ili više izraza. Opcijska klauzula Else, ako je uključena, omogućuje vam da izvršite jednu ili više naredbi ako uvjet koji testirate nije istinit. Evo jednostavne procedure CheckUser, prekodirane za korištenje strukture If-Then-Else:
Sub CheckUser2()
Korisničko ime = InputBox ("Unesite svoje ime: ")
Ako je korisničko ime = "Satya Nadella" Zatim
MsgBox ("Dobrodošla Satya...")
' …[Više koda ovdje] …
Drugo
MsgBox “Oprosti. Samo Satya Nadella može ovo voditi.”
Završi ako
Kraj Sub
Ako-Onda primjeri
Sljedeća rutina pokazuje strukturu If-Then bez neobavezne klauzule Else:
Sub GreetMe()
Ako je vrijeme < 0,5 onda MsgBox "Dobro jutro"
Kraj Sub
Procedura GreetMe koristi VBA-ovu funkciju vremena za dobivanje vremena sustava. Ako je trenutno vrijeme manje od 0,5, rutina prikazuje prijateljski pozdrav. Ako je Vrijeme veće ili jednako .5, rutina završava i ništa se ne događa.
Za prikaz drugačijeg pozdrava ako je Vrijeme veće od ili jednako .5, možete dodati još jednu naredbu If-Then nakon prve:
Sub GreetMe2()
Ako je vrijeme < 0,5 onda MsgBox "Dobro jutro"
Ako je vrijeme >= 0,5 onda MsgBox "Dobar dan"
Kraj Sub
Primijetite da se >= (veće ili jednako) koristi za drugu naredbu If-Then. To osigurava da je cijeli dan pokriven. Da je korišteno > (veće od), ne bi se pojavila poruka da se ovaj postupak izvrši točno u 12:00 sati. To je malo vjerojatno, ali s ovakvim važnim programom ne želite riskirati.
Primjer If-Onda-Else
Drugi pristup prethodnom problemu koristi klauzulu Else. Evo iste rutine kodirane za korištenje strukture If-Onda-Else:
Sub GreetMe3()
Ako je vrijeme < 0,5 onda MsgBox “Dobro jutro” Ostalo _
MsgBox “Dobar dan”
Kraj Sub
Primijetite da se u prethodnom primjeru koristi znak za nastavak retka (podvlaka). Naredba If-Then-Else zapravo je jedna izjava. VBA pruža malo drugačiji način kodiranja If-Then-Else konstrukcija koje koriste naredbu End If. Stoga se GreetMe procedura može prepisati kao
Sub GreetMe4()
Ako je vrijeme < 0,5 Tada
MsgBox "Dobro jutro"
Drugo
MsgBox “Dobar dan”
Završi ako
Kraj Sub
Zapravo, možete umetnuti bilo koji broj izraza u dio If i bilo koji broj izraza u dio Else. Ova sintaksa je lakša za čitanje i čini izjave kraćima.
Što ako trebate proširiti GreetMe rutinu za rješavanje tri stanja: ujutro, poslijepodne i navečer? Imate dvije mogućnosti: upotrijebite tri ako-onda naredbe ili upotrijebite ugniježđenu strukturu ako-onda-drugače. Ugniježđenje znači stavljanje If-Onda-Else strukture unutar druge If-Onda-Else strukture. Prvi pristup, koristeći tri If-Then izjave, jednostavniji je:
Sub GreetMe5()
Priguši poruku kao niz
Ako je vrijeme < 0,5 tada je poruka = "Jutro"
Ako je vrijeme >= 0,5 i vrijeme < 0,75 Tada je poruka = "Poslijepodne"
Ako je vrijeme >= 0,75 Tada je poruka = "Večer"
MsgBox “Dobro” & Msg
Kraj Sub
Dodan je novi zaokret uz korištenje varijable. Varijabla Msg dobiva drugačiju tekstualnu vrijednost, ovisno o dobu dana. Izjava MsgBox prikazuje pozdrav: Dobro jutro, Dobar dan ili Dobra večer.
Sljedeća rutina izvodi istu radnju, ali koristi strukturu If-Then-End If:
Sub GreetMe6()
Priguši poruku kao niz
Ako je vrijeme < 0,5 Tada
Poruka = "Jutro"
Završi ako
Ako je vrijeme >= 0,5 i vrijeme < 0,75 Tada
Poruka = "Poslijepodne"
Završi ako
Ako je Vrijeme >= 0,75 Tada
Poruka = "Večer"
Završi ako
MsgBox “Dobro” & Msg
Kraj Sub
Korištenje ElseIf
U prethodnim primjerima, svaki izraz u rutini se izvršava. Nešto učinkovitija struktura bi izašla iz rutine čim se utvrdi da je uvjet istinit. Ujutro, na primjer, procedura bi trebala prikazati poruku Dobro jutro, a zatim izaći - bez evaluacije drugih suvišnih uvjeta.
Uz ovakvu malu rutinu, ne morate brinuti o brzini izvršenja. Ali za veće aplikacije u kojima je brzina kritična, trebali biste znati za drugu sintaksu za strukturu If-Then.
Evo kako možete prepisati GreetMe rutinu korištenjem ove sintakse:
Sub GreetMe7()
Priguši poruku kao niz
Ako je vrijeme < 0,5 Tada
Poruka = "Jutro"
Inače ako je vrijeme >= 0,5 i vrijeme < 0,75 Tada
Poruka = "Poslijepodne"
Drugo
Poruka = "Večer"
Završi ako
MsgBox “Dobro” & Msg
Kraj Sub
Kada je uvjet istinit, VBA izvršava uvjetne izraze, a struktura If završava. Drugim riječima, ovaj postupak je malo učinkovitiji od prethodnih primjera. Kompromis je što je kod teže razumljiv.
Još jedan primjer Ako-Onda
Evo još jednog primjera koji koristi jednostavan oblik strukture If-Then. Ovaj postupak traži od korisnika količinu, a zatim prikazuje odgovarajući popust na temelju količine koju korisnik unese:
Sub ShowDiscount()
Dim Quantity As Long
Dim Discount As Double
Količina = InputBox ("Unesite količinu:")
Ako je količina > 0 tada je popust = 0,1
Ako je količina >= 25, tada je popust = 0,15
Ako je količina >= 50 tada je popust = 0,2
Ako je količina >= 75 Tada je popust = 0,25
MsgBox “Popust: “ & Popust
Kraj Sub
Primijetite da se svaka naredba If-Then u ovoj rutini izvršava, a vrijednost za Discount može se mijenjati kako se iskazi izvršavaju. Međutim, rutina u konačnici prikazuje ispravnu vrijednost za popust jer su naredbe If-Then prema rastućim vrijednostima popusta.
Sljedeći postupak izvodi iste zadatke korištenjem alternativne ElseIf sintakse. U ovom slučaju, rutina završava odmah nakon izvršenja naredbi za istinit uvjet:
Sub ShowPopust2()
Dim Quantity As Long
Dim Discount As Double
Količina = InputBox ("Unesite količinu: ")
Ako je količina > 0 i količina < 25 Tada
Popust = 0,1
Inače ako je količina >= 25 i količina < 50 Tada
Popust = 0,15
Inače ako je količina >= 50 i količina < 75 Tada
Popust = 0,2
ElseIf Količina >= 75 Tada
Popust = 0,25
Završi ako
MsgBox “Popust: “ & Popust
Kraj Sub
Ove višestruke ako-onda strukture su prilično glomazne. Možda ćete htjeti koristiti strukturu If-Then samo za jednostavne binarne odluke.