🚀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 — comment ça marche & quand l'utiliser (vs Select Case)

|

VBA If Then Else dans Excel — comment ça marche & quand l'utiliser (vs Select Case)

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

En brefIf...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 If en bloc exige exactement un End If.
  • La condition est toujours vraie/fausse. Souvent un conflit de type (texte vs nombre) ou la casse ("Oui" <> "oui"). Affichez la condition avec Debug.Print.
  • Une « garde » plante quand même. Pas de court-circuit — séparez le And en If imbriqués.
  • La comparaison de texte rate. "payée" <> "Payée". Encadrez les deux côtés par LCase(), ou Option 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

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.