TOP

VBA-Lezione 7.1. Condizioni (Condizioni)

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.


Se...Allora...Altrimenti

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
NOTNOT [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

AltroSe

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

Select Caso

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