🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA If Then Else dans Excel — 6 exemples concrets (If, ElseIf, imbriqué)

|

VBA If Then Else dans Excel — 6 exemples concrets (If, ElseIf, imbriqué)

Testé sur : Excel 365 v2509 · Excel 2021 · Excel 2019 · dernière vérification le 05/06/2026

En bref — L'instruction If...Then...Else exécute un code différent selon qu'une condition est vraie ou non. Copiez ce squelette et adaptez-le :

Sub CalculerNote()
    Dim points As Long
    points = Range("A1").Value

    If points >= 90 Then
        Range("B1").Value = "Excellent"
    ElseIf points >= 75 Then
        Range("B1").Value = "Bien"
    ElseIf points >= 60 Then
        Range("B1").Value = "Passable"
    Else
        Range("B1").Value = "Échoué"
    End If
End Sub

Ce seul bloc couvre 90 % de tout ce que vous ferez un jour avec les conditions en VBA. La suite de ce guide montre les schémas qui vous évitent les pièges classiques.

Pourquoi l'instruction If est essentielle

Toute macro qui « décide » quelque chose — signaler les factures en retard, colorer les cellules au-dessus du budget, ignorer les lignes vides — repose sur If. Maîtrisez la structure une bonne fois et vous cessez d'écrire ces conditions enchevêtrées qui rendent le VBA si pénible à maintenir.

Les quatre formes de If

Forme Quand l'utiliser Besoin de End If ?
If sur une ligne Une action courte, sans Else Non
Bloc If...End If Une branche, plusieurs lignes Oui
If...Else Deux issues Oui
If...ElseIf...Else Trois issues ou plus Oui
' Une ligne — pas de End If, une seule instruction
If cellule.Value = 0 Then cellule.Value = "n/d"

' Bloc — plusieurs lignes nécessitent End If
If cellule.Value = 0 Then
    cellule.Value = "n/d"
    cellule.Interior.Color = vbYellow
End If

Règle d'or : dès que vous avez deux actions ou un Else, passez à la forme bloc avec End If. Mélanger la syntaxe sur une ligne et la syntaxe bloc est la cause n° 1 de l'erreur de compilation « Bloc If sans End If ».

Exemple 1 — Signaler les factures en retard

Sub SignalerRetards()
    Dim r As Range
    For Each r In Range("D2:D200")          ' D = date d'échéance
        If r.Value < Date And r.Offset(0, 1).Value <> "Payée" Then
            r.Offset(0, 2).Value = "EN RETARD"
            r.Offset(0, 2).Interior.Color = RGB(255, 199, 206)
        End If
    Next r
End Sub

Deux conditions reliées par And — les deux doivent être vraies. La facture est en retard et pas encore payée.

Exemple 2 — And contre Or, enfin clair

And exige que chaque condition soit vraie. Or n'en demande qu'une seule. C'est là que les débutants trébuchent constamment :

' Approuver seulement si le montant est faible ET le demandeur est responsable
If montant <= 5000 And role = "Responsable" Then statut = "Approuvé auto"

' Faire remonter si le montant est élevé OU le compte est signalé
If montant > 50000 Or estSignale = True Then statut = "À examiner"

VBA n'évalue pas en court-circuit par défaut. N'appelez donc pas une fonction dans la seconde condition qui échouerait si la première est fausse — séparez plutôt en If imbriqués.

Exemple 3 — Le If imbriqué pour un vrai arbre de décision

Sub NiveauLivraison()
    Dim poids As Double, pays As String
    poids = Range("A2").Value
    pays = Range("B2").Value

    If pays = "FR" Then
        If poids <= 1 Then
            Range("C2").Value = "Standard 4,99 EUR"
        Else
            Range("C2").Value = "Lourd 9,99 EUR"
        End If
    Else
        Range("C2").Value = "International 24,99 EUR"
    End If
End Sub

Deux niveaux d'imbrication, c'est acceptable. Au-delà, la lisibilité s'effondre — c'est le signal pour passer à Select Case (voir plus bas).

Exemple 4 — IIf pour une affectation rapide sur une ligne

Pour un choix simple à deux issues, la fonction IIf tient sur une ligne :

Range("C2").Value = IIf(Range("A2").Value > 0, "Bénéfice", "Perte")

Attention : IIf évalue les deux arguments, même celui qui est ignoré. N'y placez jamais une division par zéro ni un appel de fonction risqué.

Exemple 5 — Tester une cellule, pas seulement une variable

Sub SurlignerVides()
    Dim r As Range
    For Each r In Range("A2:A500")
        If IsEmpty(r) Then
            r.Interior.Color = vbRed
        ElseIf Not IsNumeric(r.Value) Then
            r.Interior.Color = vbYellow
        End If
    Next r
End Sub

IsEmpty, IsNumeric et IsError sont les garde-fous qui empêchent votre If de planter sur des données sales.

Exemple 6 — Sortir tôt plutôt qu'imbriquer profondément

Sub TraiterLigne(r As Range)
    If r.Value = "" Then Exit Sub          ' clause de garde — on sort vite
    If Not IsNumeric(r.Value) Then Exit Sub

    r.Offset(0, 1).Value = r.Value * 1.2
End Sub

Les clauses de garde aplatissent le code. Au lieu de tout envelopper dans If valide Then ... End If, rejetez les cas erronés d'emblée et laissez la logique principale s'exécuter sans indentation.

Quand utiliser If plutôt que Select Case

Situation À utiliser
1 à 2 issues, ou conditions sur des variables différentes If...Else
3 issues ou plus testant la même variable Select Case
Plages de valeurs (1–10, 11–20…) Select Case ... To
Combinaison de And/Or entre variables If...ElseIf

Si vous écrivez ElseIf x = 1 ... ElseIf x = 2 ... ElseIf x = 3 sur une même variable, Select Case est plus propre et plus lisible.

Erreurs courantes (et la solution)

« Bloc If sans End If » — Vous avez ouvert un If multiligne sans le refermer. Chaque If en bloc exige exactement un End If.

« Else sans If » — Souvent un End If égaré au-dessus du Else, ou un If sur une ligne suivi d'un Else orphelin. Réindentez le bloc : l'erreur saute aux yeux.

La condition est toujours vraie/fausse — Vous avez comparé du texte à un nombre, ou écrit une faute dans l'opérateur. Affichez la condition avec Debug.Print pour voir ce que VBA évalue réellement.

La comparaison de texte échoue de façon inattendue"payée" = "Payée" vaut False. Encadrez les deux côtés par LCase(), ou placez Option Compare Text en haut du module.

Arrêtez d'écrire les conditions à la main — décrivez la règle

La logique conditionnelle est précisément l'endroit où le VBA devient fragile : un If imbriqué de trop et plus personne n'ose y toucher six mois plus tard. ExcelMaster Agent vous laisse formuler la règle en français courant — « colore en rouge les lignes de la colonne D dont la date d'échéance est dépassée et dont le statut n'est pas Payée » — et génère la logique équivalente, sans End If à oublier. Essayer gratuitement →

Guides associés

FAQ

Puis-je écrire If Then Else sur une seule ligne ? Oui, mais uniquement pour une action unique sans Else multiligne : If x > 0 Then y = 1. Dès qu'un Else ou une deuxième instruction apparaît, la forme bloc avec End If est obligatoire.

Combien de branches ElseIf puis-je avoir ? Autant que nécessaire — mais si toutes testent la même variable, Select Case devient plus lisible au-delà de trois.

Pourquoi ma condition If s'exécute-t-elle toujours ? Le plus souvent un conflit de type (texte comparé à un nombre) ou une question de casse ("Oui" <> "oui"). Affichez la condition avec Debug.Print.

Quelle est la différence entre If et IIf ? If est une instruction qui contrôle quelles lignes s'exécutent. IIf() est une fonction qui renvoie l'une de deux valeurs — et elle évalue les deux, donc gardez les expressions risquées en dehors.