Logique conditionnelle
Glissez pour afficher le menu
Jusqu'à présent, tout portait sur le stockage et le test de valeurs. La logique conditionnelle est l'endroit où votre code commence réellement à prendre des décisions — en exécutant un bloc d'instructions plutôt qu'un autre, selon le résultat de ces tests.
If...Then
La forme la plus simple : exécuter une action uniquement si une condition est remplie.
If currentStock < reorderLevel Then
MsgBox "Reorder needed!"
End If
Si la condition du If est False, VBA passe simplement à ce qui suit le End If — rien ne se passe et aucune erreur ne se produit.
If...ElseIf...Else
Permet de gérer plus de deux résultats possibles en enchaînant les conditions :
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 vérifie ces conditions de haut en bas et s'arrête à la toute première qui est True — il ne vérifie jamais les suivantes, même si une condition ultérieure serait également techniquement True. C'est précisément pour cela que l'ordre est important : si currentStock vaut 0, la première condition (= 0) l'intercepte et status devient immédiatement "Out of Stock". Remarquez que 0 est aussi techniquement inférieur à reorderLevel, donc si la ligne ElseIf currentStock < reorderLevel était vérifiée en premier, elle indiquerait à tort "Reorder Now" pour un article totalement épuisé. Placer la condition la plus spécifique et la plus urgente en premier — et ne recourir aux conditions plus larges qu'ensuite — permet à une chaîne comme celle-ci de fonctionner correctement.
Select Case
Lorsque vous vérifiez une seule variable par rapport à plusieurs valeurs fixes possibles, Select Case exprime la même logique qu'une longue chaîne de ElseIf mais de façon plus lisible :
Select Case category
Case "Electronics"
discountRate = 0.05
Case "Office"
discountRate = 0.1
Case Else
discountRate = 0
End Select
Select Case gère également élégamment les plages de nombres, ce qui est plus difficile à lire sous forme de chaîne de 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 correspond à toute valeur de 1 à 19 inclus ; Case Is >= 50 utilise Is pour comparer avec la variable testée plutôt qu'une plage fixe.
Exercice
- Écrire une
Subavec un blocSelect Case(comme ci-dessus) qui attribue une chaîne de statut en fonction d'un nombre de stock codé en dur. - La tester trois fois dans la même
Suben changeant la valeur du stock : essayer 0, 15 et 134, et afficher le résultat avecDebug.Printà chaque fois. - Ajouter une quatrième condition pour exactement 20 (le niveau de réapprovisionnement du Keyboard) et vérifier quel Case l'intercepte.
1. Écriture de la Sub avec Select Case
- Déclarer une variable pour stocker le numéro de stock, et une autre pour le texte résultant (
status). - Attribuer d'abord une valeur codée en dur à la variable de stock (par exemple,
stockLevel = 0), puis l'utiliser dansSelect Case stockLevel— recopier la même structure deCaseque dans l'exemple de la section 2.4 (Case 0,Case 1 To 19,Case 20 To 49,Case Is > 50). - Chaque
Casedoit attribuer une valeur de texte différente àstatus.
2. Tester trois valeurs dans une seule Sub
- Il n'est pas nécessaire d'avoir trois procédures distinctes — il suffit de changer la valeur de la variable, d'exécuter le bloc
Select Case, d'afficher le résultat, puis de changer à nouveau la valeur et de l'exécuter une seconde fois, tout cela dans la mêmeSub, l'une après l'autre. - Après chaque affectation,
Debug.Print statusaffichera le résultat dans la fenêtre Exécution immédiate sans aucune fenêtre contextuelle interrompant les deux autres tests.
3. Ajouter un cas pour exactement 20
- Revenir à l'exemple original de la section 2.4 et observer attentivement où se termine
Case 1 To 19et où commenceCase 20 To 49— l'un des deux inclut déjà 20. - Puisque
Select Cases'arrête à la première correspondance, ajouter une ligneCase 20séparée ne change quelque chose que si vous la placez avant le cas qui l'aurait autrement capturée. - Exécutez-le avec
stockLevel = 20spécifiquement et vérifiez quel message s'affiche — cela vous indique quelCasel'a réellement capturé, sans avoir besoin d'ajouter quoi que ce soit de nouveau.
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
Merci pour vos commentaires !
Demandez à l'IA
Demandez à l'IA
Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion
Logique conditionnelle
Jusqu'à présent, tout portait sur le stockage et le test de valeurs. La logique conditionnelle est l'endroit où votre code commence réellement à prendre des décisions — en exécutant un bloc d'instructions plutôt qu'un autre, selon le résultat de ces tests.
If...Then
La forme la plus simple : exécuter une action uniquement si une condition est remplie.
If currentStock < reorderLevel Then
MsgBox "Reorder needed!"
End If
Si la condition du If est False, VBA passe simplement à ce qui suit le End If — rien ne se passe et aucune erreur ne se produit.
If...ElseIf...Else
Permet de gérer plus de deux résultats possibles en enchaînant les conditions :
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 vérifie ces conditions de haut en bas et s'arrête à la toute première qui est True — il ne vérifie jamais les suivantes, même si une condition ultérieure serait également techniquement True. C'est précisément pour cela que l'ordre est important : si currentStock vaut 0, la première condition (= 0) l'intercepte et status devient immédiatement "Out of Stock". Remarquez que 0 est aussi techniquement inférieur à reorderLevel, donc si la ligne ElseIf currentStock < reorderLevel était vérifiée en premier, elle indiquerait à tort "Reorder Now" pour un article totalement épuisé. Placer la condition la plus spécifique et la plus urgente en premier — et ne recourir aux conditions plus larges qu'ensuite — permet à une chaîne comme celle-ci de fonctionner correctement.
Select Case
Lorsque vous vérifiez une seule variable par rapport à plusieurs valeurs fixes possibles, Select Case exprime la même logique qu'une longue chaîne de ElseIf mais de façon plus lisible :
Select Case category
Case "Electronics"
discountRate = 0.05
Case "Office"
discountRate = 0.1
Case Else
discountRate = 0
End Select
Select Case gère également élégamment les plages de nombres, ce qui est plus difficile à lire sous forme de chaîne de 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 correspond à toute valeur de 1 à 19 inclus ; Case Is >= 50 utilise Is pour comparer avec la variable testée plutôt qu'une plage fixe.
Exercice
- Écrire une
Subavec un blocSelect Case(comme ci-dessus) qui attribue une chaîne de statut en fonction d'un nombre de stock codé en dur. - La tester trois fois dans la même
Suben changeant la valeur du stock : essayer 0, 15 et 134, et afficher le résultat avecDebug.Printà chaque fois. - Ajouter une quatrième condition pour exactement 20 (le niveau de réapprovisionnement du Keyboard) et vérifier quel Case l'intercepte.
1. Écriture de la Sub avec Select Case
- Déclarer une variable pour stocker le numéro de stock, et une autre pour le texte résultant (
status). - Attribuer d'abord une valeur codée en dur à la variable de stock (par exemple,
stockLevel = 0), puis l'utiliser dansSelect Case stockLevel— recopier la même structure deCaseque dans l'exemple de la section 2.4 (Case 0,Case 1 To 19,Case 20 To 49,Case Is > 50). - Chaque
Casedoit attribuer une valeur de texte différente àstatus.
2. Tester trois valeurs dans une seule Sub
- Il n'est pas nécessaire d'avoir trois procédures distinctes — il suffit de changer la valeur de la variable, d'exécuter le bloc
Select Case, d'afficher le résultat, puis de changer à nouveau la valeur et de l'exécuter une seconde fois, tout cela dans la mêmeSub, l'une après l'autre. - Après chaque affectation,
Debug.Print statusaffichera le résultat dans la fenêtre Exécution immédiate sans aucune fenêtre contextuelle interrompant les deux autres tests.
3. Ajouter un cas pour exactement 20
- Revenir à l'exemple original de la section 2.4 et observer attentivement où se termine
Case 1 To 19et où commenceCase 20 To 49— l'un des deux inclut déjà 20. - Puisque
Select Cases'arrête à la première correspondance, ajouter une ligneCase 20séparée ne change quelque chose que si vous la placez avant le cas qui l'aurait autrement capturée. - Exécutez-le avec
stockLevel = 20spécifiquement et vérifiez quel message s'affiche — cela vous indique quelCasel'a réellement capturé, sans avoir besoin d'ajouter quoi que ce soit de nouveau.
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
Merci pour vos commentaires !