Az If-Then a VBA legfontosabb vezérlőstruktúrája. Valószínűleg napi rendszerességgel fogja használni ezt a parancsot. Használja az If-Then struktúrát, ha egy vagy több utasítást feltételesen szeretne végrehajtani. Az opcionális Else záradék, ha szerepel, lehetővé teszi egy vagy több utasítás végrehajtását, ha a tesztelt feltétel nem igaz. Íme egy egyszerű CheckUser eljárás, amelyet az If-Then-Else struktúra használatára átkódoltak:
Al CheckUser2()
UserName = InputBox ("Írja be a nevét: ")
Ha UserName = „Satya Nadella” Akkor
MsgBox („Üdvözöljük Satya…”)
' …[További kód itt] …
Más
MsgBox „Elnézést. Ezt csak Satya Nadella tudja végrehajtani.”
Vége Ha
Vége Sub
Ha-Akkor példák
A következő rutin az If-Then struktúrát mutatja be az opcionális Else záradék nélkül:
Sub GreetMe()
Ha az idő < 0,5, akkor az MsgBox „Jó reggelt”
Vége Sub
A GreetMe eljárás a VBA Time függvényét használja a rendszeridő lekérdezéséhez. Ha az aktuális idő kevesebb, mint 0,5, a rutin barátságos üdvözlést jelenít meg. Ha az Idő nagyobb vagy egyenlő, mint 0,5, a rutin véget ér, és semmi sem történik.
Másik üdvözlés megjelenítéséhez, ha az Idő nagyobb vagy egyenlő, mint 0,5, hozzáadhat egy másik If-Then utasítást az első után:
Sub GreetMe2()
Ha az idő < 0,5, akkor az MsgBox „Jó reggelt”
Ha az idő >= 0,5, akkor az MsgBox „Jó napot”
Vége Sub
Figyeljük meg, hogy a >= (nagyobb vagy egyenlő), mint a második If-Then utasítás. Ez biztosítja, hogy az egész nap lefedett legyen. Ha > (nagyobb, mint) lett volna használva, akkor nem jelenne meg üzenet, ha ezt az eljárást pontosan déli 12:00-kor hajtják végre. Ez elég valószínűtlen, de egy ilyen fontos programmal nem akarsz kockáztatni.
Egy ha-akkor-más példa
Az előző probléma másik megközelítése az Else záradékot használja. Ugyanaz a rutin átkódolva az If-Then-Else struktúra használatára:
Sub GreetMe3()
Ha az idő < 0,5, akkor az MsgBox „Jó reggelt” Else _
MsgBox „Jó napot”
Vége Sub
Figyeljük meg, hogy az előző példában a sorfolytató karaktert (aláhúzásjelet) használjuk. Az If-Then-Else utasítás valójában egyetlen állítás. A VBA egy kissé eltérő módot biztosít az End If utasítást használó If-Then-Else konstrukciók kódolására. Ezért a GreetMe eljárás átírható a következőre
Sub GreetMe4()
Ha az idő < 0,5 Akkor
MsgBox „Jó reggelt”
Más
MsgBox „Jó napot”
Vége Ha
Vége Sub
Valójában tetszőleges számú utasítást beszúrhat az If rész alá, és bármennyi utasítást az Else rész alá. Ez a szintaxis könnyebben olvasható, és rövidebbé teszi az utasításokat.
Mi a teendő, ha ki kell bővítenie a GreetMe rutint három feltétel kezelésére: reggel, délután és este? Két lehetősége van: Használjon három If-Then utasítást, vagy használjon beágyazott If-Then-Else struktúrát. A beágyazás azt jelenti, hogy egy If-Then-Else struktúrát helyezünk el egy másik If-Then-Else struktúrába. Az első megközelítés, amely három If-Then utasítást használ, egyszerűbb:
Sub GreetMe5()
Dim Msg As String
Ha az idő < 0,5, akkor Üzenet = „Reggel”
Ha az idő >= 0,5 és az idő < 0,75, akkor üzenet = „délután”
Ha Idő >= 0,75, akkor Üzenet = „Este”
MsgBox „Jó” és Msg
Vége Sub
Egy új csavar került hozzáadásra egy változó használatával. Az Msg változó a napszaktól függően eltérő szöveges értéket kap. Az MsgBox utasítás az üdvözlést jeleníti meg: Jó reggelt, Jó napot vagy Jó estét.
A következő rutin ugyanazt a műveletet hajtja végre, de egy If-Then-End If struktúrát használ:
Sub GreetMe6()
Dim Msg As String
Ha az idő < 0,5 Akkor
Msg = "Reggel"
Vége Ha
Ha az idő >= 0,5 és az idő < 0,75, akkor
Msg = „Délután”
Vége Ha
Ha Idő >= 0,75 Akkor
Msg = "Este"
Vége Ha
MsgBox „Jó” & Üzenet
Vége Sub
Az ElseIf használata
Az előző példákban a rutin minden utasítása végrehajtódik. Egy kicsit hatékonyabb struktúra kilép a rutinból, amint egy feltétel igaznak bizonyul. Például reggel az eljárásnak meg kell jelenítenie a Good Morning üzenetet, majd ki kell lépnie – a többi felesleges körülmény értékelése nélkül.
Egy ilyen apró rutinnal nem kell aggódnia a végrehajtási sebesség miatt. Nagyobb alkalmazások esetén azonban, ahol a sebesség kritikus, ismernie kell az If-Then szerkezet egy másik szintaxisát.
A következőképpen írhatja át a GreetMe rutint a szintaxis használatával:
Sub GreetMe7()
Dim Msg As String
Ha az idő < 0,5 Akkor
Msg = "Reggel"
ElseIf Idő >= 0,5 és idő < 0,75 Akkor
Msg = „Délután”
Más
Msg = "Este"
Vége Ha
MsgBox „Jó” és Msg
Vége Sub
Ha egy feltétel igaz, a VBA végrehajtja a feltételes utasításokat, és az If struktúra véget ér. Más szóval, ez az eljárás egy kicsit hatékonyabb, mint az előző példák. A kompromisszum az, hogy a kódot nehezebb megérteni.
Egy másik ha-akkor példa
Íme egy másik példa, amely az If-Then szerkezet egyszerű formáját használja. Ez az eljárás mennyiséget kér a felhasználótól, majd megjeleníti a megfelelő kedvezményt a felhasználó által megadott mennyiség alapján:
Sub ShowDiscount()
Dim Mennyiség Amíg
Dim kedvezmény Duplaként
Mennyiség = InputBox ("Adja meg a mennyiséget:")
Ha Mennyiség > 0 Akkor Kedvezmény = 0,1
Ha Mennyiség >= 25 Akkor Kedvezmény = 0,15
Ha Mennyiség >= 50, akkor Kedvezmény = 0,2
Ha Mennyiség >= 75 Akkor Kedvezmény = 0,25
MsgBox “Kedvezmény: “ & Kedvezmény
Vége Sub
Figyelje meg, hogy ebben a rutinban minden If-Then utasítás végrehajtásra kerül, és a Discount értéke az utasítások végrehajtásával változhat. A rutin azonban végül a megfelelő Discount értéket jeleníti meg, mivel az If-Then utasítások növekvő Kedvezményértékek sorrendjében vannak.
A következő eljárás ugyanazokat a feladatokat hajtja végre az alternatív ElseIf szintaxis használatával. Ebben az esetben a rutin azonnal véget ér egy igaz feltételre vonatkozó utasítások végrehajtása után:
Sub ShowDiscount2()
Dim Mennyiség Amíg
Dim kedvezmény Duplaként
Mennyiség = InputBox ("Adja meg a mennyiséget: ")
Ha Mennyiség > 0 és Mennyiség < 25 Akkor
Kedvezmény = 0,1
ElseIf Mennyiség >= 25 És Mennyiség < 50 Akkor
Kedvezmény = 0,15
ElseIf Mennyiség >= 50 És mennyiség < 75 Akkor
Kedvezmény = 0,2
ElseIf Mennyiség >= 75 Akkor
Kedvezmény = 0,25
Vége Ha
MsgBox “Kedvezmény: “ & Kedvezmény
Vége Sub
Ezek a többszörös If-Then struktúrák meglehetősen nehézkesek. Érdemes lehet az If-Then struktúrát csak egyszerű bináris döntésekhez használni.