Questo tutorial spiegherà come usare IIF in VBA
La funzione VBA IIF è simile all'utilizzo della funzione SE in Excel. Verifica se una condizione è soddisfatta, restituendo un valore (o calcolo) se VERO, un altro valore (o calcolo) se FALSO.
È simile all'istruzione If di VBA, molti lo considerano una scorciatoia per utilizzare questo metodo poiché è sufficiente scrivere una riga di codice per ottenere il risultato desiderato anziché utilizzare un Se… Allora… Altrimenti… Fine Se routine. Tuttavia, deve essere utilizzato correttamente in quanto può portare a problemi nel codice.
Sintassi IIF
La funzione IFF è composta da 3 parti: il test logico, la parte vera e la parte falsa.
- Espressione:Il test logico che deve aver luogo.
- Parte vera: Il risultato che verrà restituito se il test logico è TRUE.
- parte falsa: Il risultato che verrà restituito se il test logico è FALSE.
Scrivere una procedura per la funzione IIF
123 | Funzione GetNames (strName As String) As StringGetNames = IIf(strName = "John", "Il nome è John", "Il nome non è John")Fine funzione |
Nella funzione sopra, possiamo usare una sottoprocedura per verificare se la variabile che passiamo alla funzione è la stringa "John"
123 | Sub TestGetNamaes()MsgBox GetNames("Giovanni")Fine sottotitolo |
Se dovessimo eseguire la procedura secondaria TestGetNames, chiamerebbe la funzione GetNames e restituirebbe una finestra di messaggio.
Se invece avessimo usato il metodo If, il codice sarebbe stato simile a questo:
1234567 | Funzione GetNames (strName As String) As StringIf(strName = "John") ThenGetNames = "Il nome è John"AltroGetNames = "Il nome non è John"Finisci seFine funzione |
Abbiamo effettivamente scritto una riga di codice invece di 5 righe di codice - impressionante!
Perché usare If invece?
Considera quanto segue
123 | Funzione GetNames (strName As String) As StringGetNames = IIf(strName = "John", MsgBox ("Il nome è John"), MsgBox ("Il nome non è John"))Fine funzione |
Ora, se esegui la seguente procedura secondaria per chiamare la tua funzione
123 | Sub TestGetNames()GetNames ("John")Fine sottotitolo |
Otterresti la stessa finestra di messaggio di prima, ma subito dopo otterresti la finestra di messaggio successiva!
La funzione IIF esegue entrambe le sezioni TRUE e FALSE della riga di codice - non esce dal codice una volta che ha trovato la condizione come vera - esegue comunque anche la sezione falsa - dandoci così un messaggio falso nel seconda casella di messaggio. Se avessi usatoSe… Allora… Altrimenti… Fine Se - ciò non si sarebbe verificato - la funzione SE esegue solo la sezione VERO o FALSO del codice - a seconda della logica passata al codice.
Il codice è mal progettato (apposta!) con le finestre di messaggio tenute all'interno della riga di codice su cui si trova l'istruzione IIF anziché dopo il codice o nella subroutine. Poiché la funzione IIF esegue entrambe le sezioni TRUE e FALSE dell'istruzione, vengono restituiti entrambi i messaggi.
Potremmo correggere questo errore spostando la finestra di messaggio sotto la riga della funzione IIF, come nel codice seguente, o spostando la finestra di messaggio nella procedura secondaria come nel primo esempio in questo articolo.
1234 | Funzione GetNames (strName As String) As StringGetNames = IIf(strName = "John", "Il nome è John", "Il nome non è John")MsgBox (GetNames)Fine funzione |
Se stai attento quando scrivi il codice, la funzione IIF può farti risparmiare molte righe di codice e digitazione extra!
IIF annidati
Possiamo nidificare la funzione IIF in modo simile all'annidamento della funzione IF ma, ancora una volta, tutto viene eseguito in una riga.
123 | Funzione GetDiscount (dblPrice As Double) As DoubleGetDiscount = IIf(dblPrice >= 500, 10, IIf(dblPrice >= 250, 5, IIf(dblPrice >= 100, 2.5, 0)))Fine funzione |
Potremmo quindi chiamare questa funzione da una procedura secondaria
12345 | Sotto TrovaSconto()Dim dblP come doppiodblP = 899MsgBox ("Lo sconto che puoi ottenere è " & GetDiscount(dblP) & "%")Fine sottotitolo |
oppure puoi chiamarlo da Excel, usandolo come UDF (funzione definita dall'utente)