Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Apprendre Logique conditionnelle | Fondamentaux de VBA
VBA Excel Pour l'Automatisation des Entreprises

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

  1. Écrire une Sub avec un bloc Select Case (comme ci-dessus) qui attribue une chaîne de statut en fonction d'un nombre de stock codé en dur.
  2. La tester trois fois dans la même Sub en changeant la valeur du stock : essayer 0, 15 et 134, et afficher le résultat avec Debug.Print à chaque fois.
  3. Ajouter une quatrième condition pour exactement 20 (le niveau de réapprovisionnement du Keyboard) et vérifier quel Case l'intercepte.
Astuce
expand arrow

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 dans Select Case stockLevel — recopier la même structure de Case que dans l'exemple de la section 2.4 (Case 0, Case 1 To 19, Case 20 To 49, Case Is > 50).
  • Chaque Case doit 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ême Sub, l'une après l'autre.
  • Après chaque affectation, Debug.Print status affichera 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 19 et où commence Case 20 To 49 — l'un des deux inclut déjà 20.
  • Puisque Select Case s'arrête à la première correspondance, ajouter une ligne Case 20 sé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 = 20 spécifiquement et vérifiez quel message s'affiche — cela vous indique quel Case l'a réellement capturé, sans avoir besoin d'ajouter quoi que ce soit de nouveau.
Solution
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
Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 2. Chapitre 4

Demandez à l'IA

expand

Demandez à l'IA

ChatGPT

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

  1. Écrire une Sub avec un bloc Select Case (comme ci-dessus) qui attribue une chaîne de statut en fonction d'un nombre de stock codé en dur.
  2. La tester trois fois dans la même Sub en changeant la valeur du stock : essayer 0, 15 et 134, et afficher le résultat avec Debug.Print à chaque fois.
  3. Ajouter une quatrième condition pour exactement 20 (le niveau de réapprovisionnement du Keyboard) et vérifier quel Case l'intercepte.
Astuce
expand arrow

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 dans Select Case stockLevel — recopier la même structure de Case que dans l'exemple de la section 2.4 (Case 0, Case 1 To 19, Case 20 To 49, Case Is > 50).
  • Chaque Case doit 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ême Sub, l'une après l'autre.
  • Après chaque affectation, Debug.Print status affichera 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 19 et où commence Case 20 To 49 — l'un des deux inclut déjà 20.
  • Puisque Select Case s'arrête à la première correspondance, ajouter une ligne Case 20 sé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 = 20 spécifiquement et vérifiez quel message s'affiche — cela vous indique quel Case l'a réellement capturé, sans avoir besoin d'ajouter quoi que ce soit de nouveau.
Solution
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
Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 2. Chapitre 4
some-alt