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 avecEnd 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
- Boucle For VBA dans Excel — 8 exemples concrets
- VBA Select Case — le guide complet avec exemples
- Boucle While VBA — While, Do While et Do Until expliqué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.
