Testé sur : Excel 365 v2509 · Excel 2021 · Excel 2019 · dernière vérification le 05/06/2026
En bref — If...Then...Else exécute un code différent selon qu'une condition est vraie. Copiez et adaptez :
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 bloc, c'est 90 % de ce que vous ferez avec des conditions. Mais savoir quelle forme choisir — et le piège qui casse If en silence — compte plus que collectionner un extrait de plus.
L'idée centrale : If est une liste de contrôle de questions indépendantes
If...ElseIf est une liste de contrôle. VBA la lit de haut en bas, pose une question oui/non à la fois, et exécute le bloc sous la première question qui répond True — puis ignore le reste. La caractéristique clé : chaque question peut porter sur une variable différente.
If heures > 40 Then ' question sur les heures
paie = "heures sup"
ElseIf role = "Freelance" Then ' une autre question, sur le rôle
paie = "forfait"
Else
paie = "standard"
End If
Cette liberté — chaque branche interroge autre chose — est précisément la raison d'être de If. Et c'est la ligne qui vous dit quand vous l'avez dépassé : dès que chaque branche teste la même valeur (points >= 90, points >= 75…), vous avez construit un aiguillage avec des pièces de liste de contrôle. C'est le signal pour passer à Select Case.
Le piège qui casse plus de macros que n'importe quelle erreur de syntaxe : VBA n'évalue pas en court-circuit
Dans la plupart des langages, If a And b s'arrête à a quand a est faux — b n'est jamais regardé. VBA ne fait pas cela. Il évalue les deux côtés, toujours. Ceci paraît sûr et ne l'est pas :
' PLANTAGE quand rng vaut Nothing — VBA évalue quand même rng.Rows.Count
If Not rng Is Nothing And rng.Rows.Count > 0 Then ...
Comme VBA vérifie rng.Rows.Count même quand rng Is Nothing, vous obtenez une erreur d'exécution sur une ligne qui ressemble à une garde. Le correctif : rendez les questions séquentielles — imbriquez-les pour que la seconde ne s'exécute que si la première est passée :
If Not rng Is Nothing Then
If rng.Rows.Count > 0 Then ...
End If
Ce seul comportement explique une énorme part des bugs « mais ma condition If est correcte ! ». Une fois que vous savez que VBA évalue toujours les deux opérandes, vous cessez de mettre des appels risqués dans un And/Or.
L'autre règle : le If sur une ligne n'a pas de End If
Chaque If a l'une de deux formes, et les mélanger est l'erreur de compilation n° 1 (« Bloc If sans End If ») :
' Une ligne — exactement une action, PAS de End If
If cellule.Value = 0 Then cellule.Value = "n/d"
' Bloc — dès qu'il faut une deuxième ligne ou un Else, il faut End If
If cellule.Value = 0 Then
cellule.Value = "n/d"
cellule.Interior.Color = vbYellow
End If
La règle est simple : deux actions ou un Else ? Forme bloc, refermée par End If. Il n'y a pas d'entre-deux.
Les formes, comme preuve — And, Or, imbrication, IIf
Vous avez le modèle ; voici les constructions qui le mettent au travail.
And exige tout vrai ; Or en demande une — la distinction sur laquelle butent les débutants :
If montant <= 5000 And role = "Responsable" Then statut = "Approuvé auto"
If montant > 50000 Or estSignale Then statut = "À examiner"
L'imbrication gère les questions vraiment dépendantes — mais deux niveaux est la limite avant que la lisibilité ne s'effondre (et de nouveau votre signal pour Select Case) :
If pays = "FR" Then
If poids <= 1 Then livraison = "Standard" Else livraison = "Lourd"
Else
livraison = "International"
End If
IIf est une fonction, pas une instruction — pratique pour un choix à deux issues sur une ligne, mais elle évalue les deux arguments (même règle sans court-circuit), donc jamais de division par zéro ni d'appel risqué dedans :
Range("C2").Value = IIf(Range("A2").Value > 0, "Bénéfice", "Perte")
Quand utiliser If plutôt que Select Case
| Situation | À utiliser |
|---|---|
| Les branches interrogent des variables différentes | If...ElseIf |
| 1 à 2 issues | If...Else |
| 3 issues ou plus testant la même valeur | Select Case |
| Plages d'une valeur (1–10, 11–20…) | Select Case ... To |
La règle honnête : questions différentes → liste de contrôle (If) ; une valeur, plusieurs réponses → aiguillage (Select Case).
Erreurs courantes — et pourquoi elles surviennent
- « Bloc If sans End If » / « Else sans If ». Vous avez mélangé la syntaxe sur une ligne et en bloc. Réindentez ; chaque
Ifen bloc exige exactement unEnd If. - La condition est toujours vraie/fausse. Souvent un conflit de type (texte vs nombre) ou la casse (
"Oui" <> "oui"). Affichez la condition avecDebug.Print. - Une « garde » plante quand même. Pas de court-circuit — séparez le
AndenIfimbriqués. - La comparaison de texte rate.
"payée" <> "Payée". Encadrez les deux côtés parLCase(), ouOption Compare Text.
Quand les conditions survivent au code
If est le bon outil pour brancher sur des questions différentes — mais les règles métier ne tiennent pas en place. Chaque nouveau seuil signifie éditer, retester et espérer ne pas avoir cassé une branche six mois plus tard. ExcelMaster Agent vous laisse énoncer la règle en français — « 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, sans End If à oublier. Essayer gratuitement →
Guides associés
- VBA Select Case — l'aiguillage pour une valeur, plusieurs issues
- Boucle For VBA dans Excel — 8 exemples concrets
- Boucle While VBA — While, Do While et Do Until expliqués
FAQ
Quand utiliser If plutôt que Select Case ?
Quand vos branches interrogent des variables différentes, ou que vous n'avez qu'une ou deux issues. Dès que chaque branche teste la même valeur contre trois options ou plus, Select Case se lit mieux.
VBA évalue-t-il And / Or en court-circuit ?
Non. VBA évalue les deux opérandes à chaque fois. Ne mettez jamais un appel susceptible d'échouer (sur un objet Nothing, une clé absente) dans la seconde moitié d'un And — imbriquez les conditions.
Puis-je écrire If Then Else sur une seule ligne ?
Uniquement pour une action unique sans Else multiligne : If x > 0 Then y = 1. Avec un Else ou une deuxième instruction, la forme bloc avec End If est obligatoire.
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.
