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
- Scrivere una
Subcon un bloccoSelect Case(come quello sopra) che assegni una stringa di stato in base a un numero di stock predefinito. - Testarla tre volte all'interno della stessa
Subcambiando il valore dello stock: prova 0, 15 e 134, stampando il risultato conDebug.Printogni volta. - Aggiungere una quarta condizione per esattamente 20 (il livello di riordino della Keyboard) e verificare quale Case la intercetta.
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 inSelect Case stockLevel— copiare la stessa strutturaCasedall'esempio della sezione 2.4 (Case 0,Case 1 To 19,Case 20 To 49,Case Is > 50). - Ogni
Casedeve assegnare un valore di testo diverso astatus.
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 stessaSub, uno dopo l'altro. - Dopo ogni assegnazione,
Debug.Print statusmostrerà 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 19e dove iniziaCase 20 To 49— uno dei due include già il 20. - Poiché
Select Casesi ferma alla prima corrispondenza, aggiungere una riga separataCase 20cambia qualcosa solo se la si posiziona prima del case che altrimenti la intercetterebbe. - Eseguire con
stockLevel = 20specificamente e verificare quale messaggio viene stampato — questo indica qualeCaselo ha effettivamente intercettato, senza dover aggiungere nulla di nuovo.
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
Grazie per i tuoi commenti!
Chieda ad AI
Chieda ad AI
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
- Scrivere una
Subcon un bloccoSelect Case(come quello sopra) che assegni una stringa di stato in base a un numero di stock predefinito. - Testarla tre volte all'interno della stessa
Subcambiando il valore dello stock: prova 0, 15 e 134, stampando il risultato conDebug.Printogni volta. - Aggiungere una quarta condizione per esattamente 20 (il livello di riordino della Keyboard) e verificare quale Case la intercetta.
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 inSelect Case stockLevel— copiare la stessa strutturaCasedall'esempio della sezione 2.4 (Case 0,Case 1 To 19,Case 20 To 49,Case Is > 50). - Ogni
Casedeve assegnare un valore di testo diverso astatus.
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 stessaSub, uno dopo l'altro. - Dopo ogni assegnazione,
Debug.Print statusmostrerà 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 19e dove iniziaCase 20 To 49— uno dei due include già il 20. - Poiché
Select Casesi ferma alla prima corrispondenza, aggiungere una riga separataCase 20cambia qualcosa solo se la si posiziona prima del case che altrimenti la intercetterebbe. - Eseguire con
stockLevel = 20specificamente e verificare quale messaggio viene stampato — questo indica qualeCaselo ha effettivamente intercettato, senza dover aggiungere nulla di nuovo.
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
Grazie per i tuoi commenti!