If-Then és l'estructura de control més important de VBA. Probablement utilitzareu aquesta ordre cada dia. Utilitzeu l'estructura If-Then quan vulgueu executar una o més sentències de manera condicional. La clàusula Else opcional, si s'inclou, us permet executar una o més declaracions si la condició que esteu provant no és certa. Aquí teniu un procediment CheckUser senzill, recodificat per utilitzar l'estructura If-Then-Else:
Sub CheckUser2()
UserName = InputBox ("Introduïu el vostre nom: ")
Si UserName = "Satya Nadella" Aleshores
MsgBox ("Benvingut Satya...")
'...[Més codi aquí]...
Altrament
MsgBox "Ho sento. Només Satya Nadella pot fer-ho".
Acaba si
End Sub
Si-Llavors exemples
La rutina següent mostra l'estructura If-Then sense la clàusula Else opcional:
Sub GreetMe ()
Si el temps < 0,5, MsgBox "Bon dia"
End Sub
El procediment GreetMe utilitza la funció de temps de VBA per obtenir l'hora del sistema. Si l'hora actual és inferior a .5, la rutina mostra una salutació amistosa. Si el temps és superior o igual a 0,5, la rutina s'acaba i no passa res.
Per mostrar una salutació diferent si el temps és superior o igual a 0,5, podeu afegir una altra declaració If-Then després de la primera:
Sub GreetMe2()
Si el temps < 0,5, MsgBox "Bon dia"
Si el temps >= 0,5, MsgBox "Bona tarda"
End Sub
Observeu que >= (més gran o igual a) s'utilitza per a la segona instrucció If-Then. Això garanteix que tot el dia estigui cobert. Si s'hagués utilitzat > (més que) no apareixeria cap missatge si aquest procediment s'executés precisament a les 12:00 del migdia. Això és bastant improbable, però amb un programa important com aquest, no voleu córrer cap risc.
Un exemple If-Then-Else
Una altra aproximació al problema anterior utilitza la clàusula Else. Aquí teniu la mateixa rutina recodificada per utilitzar l'estructura If-Then-Else:
Sub GreetMe3()
Si el temps < 0,5 Aleshores MsgBox "Bon dia" Si no _
MsgBox "Bona tarda"
End Sub
Tingueu en compte que el caràcter de continuació de línia (guió baix) s'utilitza a l'exemple anterior. La declaració If-Then-Else és en realitat una declaració única. VBA proporciona una manera lleugerament diferent de codificar construccions If-Then-Else que utilitzen una instrucció End If. Per tant, el procediment GreetMe es pot reescriure com
Sub GreetMe4()
Si Temps < 0,5 Aleshores
MsgBox "Bon dia"
Altrament
MsgBox "Bona tarda"
Acaba si
End Sub
De fet, podeu inserir qualsevol nombre d'instruccions a la part If i qualsevol nombre d'instruccions a la part Else. Aquesta sintaxi és més fàcil de llegir i fa que les declaracions siguin més curtes.
Què passa si necessiteu ampliar la rutina GreetMe per gestionar tres condicions: matí, tarda i vespre? Teniu dues opcions: Utilitzeu tres sentències If-Then o utilitzeu una estructura imbricada If-Then-Else. La nidificació significa col·locar una estructura If-Then-Else dins d'una altra estructura If-Then-Else. El primer enfocament, utilitzant tres declaracions If-Then, és més senzill:
Sub GreetMe5()
Atenuar el missatge com a cadena
Si el temps < 0,5, Msg = "Matí"
Si el temps >= 0,5 i el temps < 0,75, Msg = "Tarda"
Si el temps >= 0,75, Msg = "Vitre"
MsgBox "Bo" i Msg
End Sub
S'ha afegit un nou gir amb l'ús d'una variable. La variable Msg obté un valor de text diferent, depenent de l'hora del dia. La declaració MsgBox mostra la salutació: Bon dia, Bona tarda o Bona tarda.
La rutina següent realitza la mateixa acció però utilitza una estructura If-Then-End If:
Sub GreetMe6()
Atenuar el missatge com a cadena
Si Temps < 0,5 Aleshores
Msg = "Matí"
Acaba si
Si el temps >= 0,5 i el temps <0,75 aleshores
Msg = "Tarda"
Acaba si
Si Temps >= 0,75 Aleshores
Msg = "Vitre"
Acaba si
MsgBox "Bo" i Msg
End Sub
Utilitzant ElseIf
En els exemples anteriors, s'executa cada instrucció de la rutina. Una estructura una mica més eficient sortiria de la rutina tan bon punt es descobri que una condició és certa. Al matí, per exemple, el procediment hauria de mostrar el missatge Bon dia i després sortir, sense avaluar les altres condicions superflues.
Amb una petita rutina com aquesta, no us haureu de preocupar per la velocitat d'execució. Però per a aplicacions més grans en què la velocitat és crítica, hauríeu de conèixer una altra sintaxi per a l'estructura If-Then.
A continuació s'explica com podeu reescriure la rutina GreetMe utilitzant aquesta sintaxi:
Sub GreetMe7()
Atenuar el missatge com a cadena
Si Temps < 0,5 Aleshores
Msg = "Matí"
ElseIf Temps >= 0,5 I Temps <0,75 Aleshores
Msg = "Tarda"
Altrament
Msg = "Vitre"
Acaba si
MsgBox "Bo" i Msg
End Sub
Quan una condició és certa, VBA executa les declaracions condicionals i acaba l'estructura If. En altres paraules, aquest procediment és una mica més eficient que els exemples anteriors. La compensació és que el codi és més difícil d'entendre.
Un altre exemple Si-Llavors
Aquí hi ha un altre exemple que utilitza la forma simple de l'estructura If-Then. Aquest procediment demana a l'usuari una quantitat i després mostra el descompte adequat, en funció de la quantitat que introdueixi l'usuari:
Sub ShowDiscount()
Dim Quantitat As Long
Redueix el descompte com a doble
Quantitat = InputBox ("Introdueix la quantitat:")
Si Quantitat > 0, descompte = 0,1
Si la quantitat >= 25, aleshores descompte = 0,15
Si Quantitat >= 50 Aleshores Descompte = 0,2
Si la quantitat >= 75, aleshores descompte = 0,25
MsgBox "Descompte: " & Descompte
End Sub
Observeu que cada instrucció If-Then d'aquesta rutina s'executa i el valor de Descompte pot canviar a mesura que s'executen les sentències. Tanmateix, la rutina finalment mostra el valor correcte de Descompte perquè les declaracions If-Then estan en ordre ascendent dels valors de Descompte.
El procediment següent realitza les mateixes tasques utilitzant la sintaxi alternativa ElseIf. En aquest cas, la rutina acaba immediatament després d'executar les declaracions per a una condició veritable:
Sub ShowDiscount2()
Dim Quantitat As Long
Redueix el descompte com a doble
Quantitat = InputBox("Introdueix la quantitat: ")
Si Quantitat > 0 I Quantitat < 25 Aleshores
Descompte = 0,1
ElseIf Quantitat >= 25 I Quantitat < 50 Aleshores
Descompte = 0,15
ElseIf Quantitat >= 50 I Quantitat < 75 Aleshores
Descompte = 0,2
ElseIf Quantitat >= 75 Aleshores
Descompte = 0,25
Acaba si
MsgBox "Descompte: " & Descompte
End Sub
Aquestes múltiples estructures If-Then són bastant feixugues. És possible que vulgueu utilitzar l'estructura If-Then només per a decisions binàries simples.