Le condizioni sono molto utili nella programmazione perché ci permettono di eseguire azioni in base a criteri impostati (si utilizza lo stesso principio della funzione IF Excel).
L'istruzione VBA If...Then...Else esegue una serie di istruzioni a seconda che la condizione specificata sia vera o meno. Se la condizione (test logico) viene soddisfatta, viene eseguita una serie di azioni. Tuttavia, se la condizione è falsa, viene eseguita una serie alternativa di azioni.
Tuttavia, per motivi di leggibilità, è possibile utilizzare l'istruzione Select Case invece di più livelli di istruzioni nidificate If...Then...Else.
Quindi, la funzione più importante che imposta la condizione è IF e ora vedremo come funziona:
If [TERMINI QUI] Then '=> SE la condizione è vera ALLORA 'Istruzioni se "vero" Else '=> ALTRIMENTI 'Istruzioni se "bugia" End If
Torniamo alla pratica e torniamo all'esempio che abbiamo utilizzato nella lezione sulle variabili. Lo scopo di questa procedura era visualizzare una finestra di dialogo che visualizzasse il valore della stringa specificata nella cella F5:
Se digiti una lettera nella cella F5, causerà un errore. Vogliamo impedirlo.
Sub variables() 'Dichiarazione di variabili Dim last_name As String, first_name As String, age As Integer, row_number As Integer 'Assegnazione di valori alle variabili row_number = Range("F5") + 1 last_name = Cells(row_number, 1) first_name = Cells(row_number, 2) age = Cells(row_number, 3) 'La finestra di dialogo MsgBox last_name & " " & first_name & ", " & age & "anni" End Sub
Aggiungiamo una condizione che controllerà se il valore immesso nella cella F5 è un numero prima che il codice venga eseguito.
Utilizzeremo la funzione IsNumeric per testare la condizione:
Sub variables() 'Se il valore tra parentesi (cella F5) è numerico (quindi la CONDIZIONE IF È VERA) allora 'eseguire le istruzioni che seguono POI If IsNumeric(Range("F5")) Then 'Dichiarazione di variabili Dim last_name As String, first_name As String, age As Integer, row_number As Integer 'Assegnazione di valori alle variabili row_number = Range("F5") + 1 last_name = Cells(row_number, 1) first_name = Cells(row_number, 2) age = Cells(row_number, 3) 'La finestra di dialogo MsgBox last_name & " " & first_name & ", " & age & "anni" End If End Sub
Dobbiamo anche scrivere istruzioni se la condizione che abbiamo impostato non è soddisfatta:
Sub variables() If IsNumeric(Range("F5")) Then 'Se la condizione è soddisfatta 'Dichiarazione di variabili Dim last_name As String, first_name As String, age As Integer, row_number As Integer 'Assegnazione di valori alle variabili row_number = Range("F5") + 1 last_name = Cells(row_number, 1) first_name = Cells(row_number, 2) age = Cells(row_number, 3) 'La finestra di dialogo MsgBox last_name & " " & first_name & ", " & age & "anni" Else 'Se la condizione non è soddisfatta 'Finestra di dialogo: avviso MsgBox "Valore inserito" & Range("F5") & "non è vero!" 'Elimina il contenuto della cella F5 Range("F5").ClearContents End If End Sub
Ora un valore non numerico non causerà alcun problema.
Lavorando con il nostro array che contiene 16 righe di dati, il nostro prossimo passo sarà verificare se la variabile row_number è: "maggiore o uguale a 2" e "minore o uguale a 17".
Ma prima, diamo un'occhiata agli operatori di confronto:
= | esattamente |
<> | non esattamente |
< | meno di |
<= | minore o uguale a |
> | più di |
>= | maggiore o uguale a |
e questi utili operatori:
AND | [condizione1] AND [condizione2] Devono essere soddisfatte due condizioni |
OR | [condizione1] OR [condizione2] Che almeno 1 delle 2 condizioni deve essere soddisfatta |
NOT | NOT [condizione1] La condizione non deve essere soddisfatta |
Ora aggiungiamo una delle condizioni AND sopra tra gli operatori di confronto:
Sub variables() If IsNumeric(Range("F5")) Then 'Se un valore numerico Dim last_name As String, first_name As String, age As Integer, row_number As Integer row_number = Range("F5") + 1 If row_number >= 2 And row_number <= 17 Then 'Se il numero corretto last_name = Cells(row_number, 1) first_name = Cells(row_number, 2) age = Cells(row_number, 3) MsgBox last_name & " " & first_name & ", " & age & "anni" Else 'Se il numero non è corretto MsgBox "Numero inserito" & Range("F5") & "non è corretto!" Range("F5").ClearContents End If Else 'Se non è un valore numerico MsgBox "Valore inserito" & Range("F5") & "non è vero!" Range("F5").ClearContents End If End Sub
Se vogliamo rendere la nostra macro più pratica, possiamo sostituire 17 con una variabile che contenga il numero di righe. Ciò ci consentirebbe di aggiungere e rimuovere righe dall'array senza dover modificare questo limite ogni volta.
Per fare ciò, dobbiamo creare una variabile nb_rows e aggiungere questa funzione.
In questo caso, utilizzeremo la funzione WorksheetFunction.CountA, che è analoga alla funzione COUNTA in Excel stesso.
Vogliamo che questa funzione conti il numero di celle non vuote nella prima colonna e scriva il valore risultante nella variabile nb_rows:
Sub variables() If IsNumeric(Range("F5")) Then 'SE NUMERO Dim last_name As String, first_name As String, age As Integer, row_number As Integer Dim nb_rows As Integer row_number = Range("F5") + 1 nb_rows = WorksheetFunction.CountA(Range("A:A")) 'La funzione di contare il numero di righe If row_number >= 2 And row_number <= nb_rows Then 'SE NUMERO VALIDO last_name = Cells(row_number, 1) first_name = Cells(row_number, 2) age = Cells(row_number, 3) MsgBox last_name & " " & first_name & ", " & age & "anni" Else 'SE IL NUMERO NON È CORRETTO MsgBox "Numero inserito" & Range("F5") & "non è corretto!" Range("F5").ClearContents End If Else 'SE NON NUMERO MsgBox "Valore inserito" & Range("F5") & "non è vero!" Range("F5").ClearContents End If End Sub
ElseIf rende possibile aggiungere ulteriori condizioni dopo il comando IF:
If [CONDIZIONE 1] Then '=> SE la condizione 1 è vera ALLORA 'Istruzioni 1 ElseIf [CONDIZIONE 2] Then '=> SE la condizione 1 è falsa ma la condizione 2 è vera ALLORA 'Istruzioni 2 Else '=> ALTRIMENTI 'Istruzioni 3 End If
Se la CONDIZIONE 1 è vera, l'istruzione 1 eseguirà e uscirà dall'istruzione IF (che inizia con IF e termina con End If). Se la CONDIZIONE 2 restituisce false, verrà eseguita l'istruzione 2 e, se restituisce false, verrà eseguita l'istruzione 3 (sotto Else).
Ecco un esempio con i voti da 1 a 6 nella cella A1 e un commento su tali voti nella cella B1:
Sub scores_comment() 'Variabili Dim note As Integer, score_comment As String note = Range("A1") 'Commenti in base al punteggio ricevuto If note = 6 Then score_comment = "Ottimo punteggio!" ElseIf note = 5 Then score_comment = "Buon punto" ElseIf note = 4 Then score_comment = "Punteggio soddisfacente" ElseIf note = 3 Then score_comment = "Punteggio insoddisfacente" ElseIf note = 2 Then score_comment = "Punteggio pessimo" ElseIf note = 1 Then score_comment = "Punteggio terribile" Else score_comment = "Punteggio zero" End If 'Commento nella cella B1 Range("B1") = score_comment End Sub
Esiste un'alternativa all'utilizzo di If con molte istruzioni ElseIf, vale a dire il comando Select Case, che è più adatto a questo tipo di situazione.
Consideriamo un esempio di macro con l'operatore Select Case:
Sub scores_comment() 'Variabili Dim note As Integer, score_comment As String note = Range("A1") 'Commenti in base al punteggio ricevuto Select Case note '=> punteggio del test (punti) Case Is = 6 '=> se valore = 6 score_comment = "Ottimo punteggio!" Case Is = 5 '=> se valore = 5 score_comment = "Buon punto" Case Is = 4 '=> se valore = 4 score_comment = "Punteggio soddisfacente" Case Is = 3 '=> se valore = 3 score_comment = "Punteggio insoddisfacente" Case Is = 2 '=> se valore = 2 score_comment = "Punteggio pessimo" Case Is = 1 '=> se valore = 1 score_comment = "Punteggio terribile" Case Else '=> se il valore non è uguale a nessuno dei precedenti score_comment = "Punteggio zero" End Select 'Commento nella cella B1 Range("B1") = score_comment End Sub
Vale la pena notare che potremmo utilizzare anche altri operatori di confronto:
Case Is >= 6 'se valore >= 6
Esempi con significati diversi:
Case Is = 6, 7 'se valore = 6 o 7 Case Is <> 6, 7 'se il valore non è uguale a 6 o 7
Case 6 To 10 'se valore = qualsiasi numero da 6 a 10