Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Logica Condizionale | Fondamenti Di VBA
Excel VBA per l'Automazione Aziendale

Logica Condizionale

Scorri per mostrare il menu

Finora ci siamo concentrati sull'archiviazione e il controllo dei valori. La logica condizionale è il punto in cui il codice inizia effettivamente a prendere decisioni — eseguendo un blocco di istruzioni invece di un altro, a seconda del risultato dei controlli.

If...Then

La forma più semplice: esegue un'azione solo se una condizione è soddisfatta.

If currentStock < reorderLevel Then
    MsgBox "Reorder needed!"
End If

Se la condizione di If è False, VBA passa semplicemente a ciò che segue dopo End If — non succede nulla e non si verifica alcun errore.

If...ElseIf...Else

Gestisce più di due possibili risultati concatenando condizioni:

If currentStock = 0 Then
    status = "Out of Stock"
ElseIf currentStock < reorderLevel Then
    status = "Reorder Now"
ElseIf currentStock < reorderLevel * 2 Then
    status = "Watch Closely"
Else
    status = "Healthy"
End If

VBA controlla queste condizioni dall'alto verso il basso e si ferma alla prima che risulta True — non verifica le successive, anche se una condizione successiva sarebbe anch'essa tecnicamente True. Ecco perché l'ordine è importante: se currentStock è 0, la prima condizione (= 0) lo intercetta e status diventa immediatamente "Out of Stock". Nota che 0 è anche tecnicamente minore di reorderLevel, quindi se la riga ElseIf currentStock < reorderLevel fosse controllata per prima, segnalerebbe erroneamente "Reorder Now" per un articolo completamente esaurito. Mettere la condizione più specifica e urgente per prima — e solo successivamente quelle più generiche — è ciò che fa funzionare correttamente una catena di questo tipo.

Select Case

Quando si controlla una singola variabile rispetto a diversi valori fissi possibili, Select Case esprime lo stesso concetto di una lunga catena di ElseIf, ma in modo più leggibile:

Select Case category
    Case "Electronics"
        discountRate = 0.05
    Case "Office"
        discountRate = 0.1
    Case Else
        discountRate = 0
End Select

Select Case gestisce anche intervalli numerici in modo elegante, cosa più difficile da leggere con una catena di confronti ElseIf:

Select Case currentStock
    Case 0
        status = "Out of Stock"
    Case 1 To 19
        status = "Low"
    Case 20 To 49
        status = "Adequate"
    Case Is >= 50
        status = "Well Stocked"
End Select

Case 1 To 19 corrisponde a qualsiasi valore da 1 a 19 inclusi; Case Is >= 50 utilizza Is per confrontare rispetto alla variabile testata invece che a un intervallo fisso.

Esercizio

  1. Scrivere una Sub con un blocco Select Case (come quello sopra) che assegni una stringa di stato in base a un numero di stock predefinito.
  2. Testarla tre volte all'interno della stessa Sub cambiando il valore dello stock: prova 0, 15 e 134, stampando il risultato con Debug.Print ogni volta.
  3. Aggiungere una quarta condizione per esattamente 20 (il livello di riordino della Keyboard) e verificare quale Case la intercetta.
Suggerimento
expand arrow

1. Scrivere la Sub con Select Case

  • Dichiarare una variabile per memorizzare il numero di scorte e una per il testo risultante (status).
  • Assegnare inizialmente alla variabile delle scorte un valore fisso (ad es. stockLevel = 0), quindi utilizzarla in Select Case stockLevel — copiare la stessa struttura Case dall'esempio della sezione 2.4 (Case 0, Case 1 To 19, Case 20 To 49, Case Is > 50).
  • Ogni Case deve assegnare un valore di testo diverso a status.

2. Testare tre valori in una sola Sub

  • Non sono necessarie tre procedure separate — basta cambiare il valore della variabile, eseguire il blocco Select Case, stampare il risultato, poi cambiare nuovamente il valore ed eseguire una seconda volta, tutto all'interno della stessa Sub, uno dopo l'altro.
  • Dopo ogni assegnazione, Debug.Print status mostrerà il risultato nella Finestra Immediata senza popup che interrompano gli altri due test.

3. Aggiungere un case per esattamente 20

  • Tornare all'esempio originale della sezione 2.4 e osservare attentamente dove termina Case 1 To 19 e dove inizia Case 20 To 49 — uno dei due include già il 20.
  • Poiché Select Case si ferma alla prima corrispondenza, aggiungere una riga separata Case 20 cambia qualcosa solo se la si posiziona prima del case che altrimenti la intercetterebbe.
  • Eseguire con stockLevel = 20 specificamente e verificare quale messaggio viene stampato — questo indica quale Case lo ha effettivamente intercettato, senza dover aggiungere nulla di nuovo.
Soluzione
expand arrow
Sub ClassifyStockLevels()
    Dim stockLevel As Integer
    Dim status As String

    ' --- Test 1 ---
    stockLevel = 0
    Select Case stockLevel
        Case 0
            status = "Out of Stock"
        Case 20
            status = "Exactly at Reorder Level"
        Case 1 To 19
            status = "Low"
        Case 20 To 49
            status = "Adequate"
        Case Is > 50
            status = "Well Stocked"
    End Select
    Debug.Print stockLevel & " -> " & status

    ' --- Test 2 ---
    stockLevel = 15
    Select Case stockLevel
        Case 0
            status = "Out of Stock"
        Case 20
            status = "Exactly at Reorder Level"
        Case 1 To 19
            status = "Low"
        Case 20 To 49
            status = "Adequate"
        Case Is > 50
            status = "Well Stocked"
    End Select
    Debug.Print stockLevel & " -> " & status

    ' --- Test 3 ---
    stockLevel = 134
    Select Case stockLevel
        Case 0
            status = "Out of Stock"
        Case 20
            status = "Exactly at Reorder Level"
        Case 1 To 19
            status = "Low"
        Case 20 To 49
            status = "Adequate"
        Case Is > 50
            status = "Well Stocked"
    End Select
    Debug.Print stockLevel & " -> " & status

    ' --- Test 4: exactly 20 ---
    stockLevel = 20
    Select Case stockLevel
        Case 0
            status = "Out of Stock"
        Case 20
            status = "Exactly at Reorder Level"
        Case 1 To 19
            status = "Low"
        Case 20 To 49
            status = "Adequate"
        Case Is > 50
            status = "Well Stocked"
    End Select
    Debug.Print stockLevel & " -> " & status
End Sub
Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 2. Capitolo 4

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

Logica Condizionale

Finora ci siamo concentrati sull'archiviazione e il controllo dei valori. La logica condizionale è il punto in cui il codice inizia effettivamente a prendere decisioni — eseguendo un blocco di istruzioni invece di un altro, a seconda del risultato dei controlli.

If...Then

La forma più semplice: esegue un'azione solo se una condizione è soddisfatta.

If currentStock < reorderLevel Then
    MsgBox "Reorder needed!"
End If

Se la condizione di If è False, VBA passa semplicemente a ciò che segue dopo End If — non succede nulla e non si verifica alcun errore.

If...ElseIf...Else

Gestisce più di due possibili risultati concatenando condizioni:

If currentStock = 0 Then
    status = "Out of Stock"
ElseIf currentStock < reorderLevel Then
    status = "Reorder Now"
ElseIf currentStock < reorderLevel * 2 Then
    status = "Watch Closely"
Else
    status = "Healthy"
End If

VBA controlla queste condizioni dall'alto verso il basso e si ferma alla prima che risulta True — non verifica le successive, anche se una condizione successiva sarebbe anch'essa tecnicamente True. Ecco perché l'ordine è importante: se currentStock è 0, la prima condizione (= 0) lo intercetta e status diventa immediatamente "Out of Stock". Nota che 0 è anche tecnicamente minore di reorderLevel, quindi se la riga ElseIf currentStock < reorderLevel fosse controllata per prima, segnalerebbe erroneamente "Reorder Now" per un articolo completamente esaurito. Mettere la condizione più specifica e urgente per prima — e solo successivamente quelle più generiche — è ciò che fa funzionare correttamente una catena di questo tipo.

Select Case

Quando si controlla una singola variabile rispetto a diversi valori fissi possibili, Select Case esprime lo stesso concetto di una lunga catena di ElseIf, ma in modo più leggibile:

Select Case category
    Case "Electronics"
        discountRate = 0.05
    Case "Office"
        discountRate = 0.1
    Case Else
        discountRate = 0
End Select

Select Case gestisce anche intervalli numerici in modo elegante, cosa più difficile da leggere con una catena di confronti ElseIf:

Select Case currentStock
    Case 0
        status = "Out of Stock"
    Case 1 To 19
        status = "Low"
    Case 20 To 49
        status = "Adequate"
    Case Is >= 50
        status = "Well Stocked"
End Select

Case 1 To 19 corrisponde a qualsiasi valore da 1 a 19 inclusi; Case Is >= 50 utilizza Is per confrontare rispetto alla variabile testata invece che a un intervallo fisso.

Esercizio

  1. Scrivere una Sub con un blocco Select Case (come quello sopra) che assegni una stringa di stato in base a un numero di stock predefinito.
  2. Testarla tre volte all'interno della stessa Sub cambiando il valore dello stock: prova 0, 15 e 134, stampando il risultato con Debug.Print ogni volta.
  3. Aggiungere una quarta condizione per esattamente 20 (il livello di riordino della Keyboard) e verificare quale Case la intercetta.
Suggerimento
expand arrow

1. Scrivere la Sub con Select Case

  • Dichiarare una variabile per memorizzare il numero di scorte e una per il testo risultante (status).
  • Assegnare inizialmente alla variabile delle scorte un valore fisso (ad es. stockLevel = 0), quindi utilizzarla in Select Case stockLevel — copiare la stessa struttura Case dall'esempio della sezione 2.4 (Case 0, Case 1 To 19, Case 20 To 49, Case Is > 50).
  • Ogni Case deve assegnare un valore di testo diverso a status.

2. Testare tre valori in una sola Sub

  • Non sono necessarie tre procedure separate — basta cambiare il valore della variabile, eseguire il blocco Select Case, stampare il risultato, poi cambiare nuovamente il valore ed eseguire una seconda volta, tutto all'interno della stessa Sub, uno dopo l'altro.
  • Dopo ogni assegnazione, Debug.Print status mostrerà il risultato nella Finestra Immediata senza popup che interrompano gli altri due test.

3. Aggiungere un case per esattamente 20

  • Tornare all'esempio originale della sezione 2.4 e osservare attentamente dove termina Case 1 To 19 e dove inizia Case 20 To 49 — uno dei due include già il 20.
  • Poiché Select Case si ferma alla prima corrispondenza, aggiungere una riga separata Case 20 cambia qualcosa solo se la si posiziona prima del case che altrimenti la intercetterebbe.
  • Eseguire con stockLevel = 20 specificamente e verificare quale messaggio viene stampato — questo indica quale Case lo ha effettivamente intercettato, senza dover aggiungere nulla di nuovo.
Soluzione
expand arrow
Sub ClassifyStockLevels()
    Dim stockLevel As Integer
    Dim status As String

    ' --- Test 1 ---
    stockLevel = 0
    Select Case stockLevel
        Case 0
            status = "Out of Stock"
        Case 20
            status = "Exactly at Reorder Level"
        Case 1 To 19
            status = "Low"
        Case 20 To 49
            status = "Adequate"
        Case Is > 50
            status = "Well Stocked"
    End Select
    Debug.Print stockLevel & " -> " & status

    ' --- Test 2 ---
    stockLevel = 15
    Select Case stockLevel
        Case 0
            status = "Out of Stock"
        Case 20
            status = "Exactly at Reorder Level"
        Case 1 To 19
            status = "Low"
        Case 20 To 49
            status = "Adequate"
        Case Is > 50
            status = "Well Stocked"
    End Select
    Debug.Print stockLevel & " -> " & status

    ' --- Test 3 ---
    stockLevel = 134
    Select Case stockLevel
        Case 0
            status = "Out of Stock"
        Case 20
            status = "Exactly at Reorder Level"
        Case 1 To 19
            status = "Low"
        Case 20 To 49
            status = "Adequate"
        Case Is > 50
            status = "Well Stocked"
    End Select
    Debug.Print stockLevel & " -> " & status

    ' --- Test 4: exactly 20 ---
    stockLevel = 20
    Select Case stockLevel
        Case 0
            status = "Out of Stock"
        Case 20
            status = "Exactly at Reorder Level"
        Case 1 To 19
            status = "Low"
        Case 20 To 49
            status = "Adequate"
        Case Is > 50
            status = "Well Stocked"
    End Select
    Debug.Print stockLevel & " -> " & status
End Sub
Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 2. Capitolo 4
some-alt