SIG DCG (UE8) : Tableur, audit de feuille et programmation

Tout le programme DCG, déjà prêt à réviser

Fiches, quiz, flashcards et infographies déjà créés, avec un tuteur IA. Paiement unique, dès 29 €.

Voir les packs DCG

Programmer dans le tableur (VBA) : les structures alternatives (tests simples, imbriqués et composés)

À retenir

Cadre programme : DCG, programme 2025 (arrêté du 4 août 2025, première session 2027), UE 8 « Systèmes d'information de gestion », partie 2 « Gérer des données du système d'information », sous-partie 2.2.3 « Mettre en œuvre des programmes au sein du tableur » (exécuter, modifier ou compléter le code d'une macro-commande, fonction ou procédure ; familles d'instructions : tests (structures alternatives) simples et imbriqués).

Pourquoi c'est central à l'examen : un test qui choisit entre plusieurs traitements est présent dans presque tous les programmes de gestion de l'épreuve : remise selon le montant, statut d'un client, validation d'une saisie. On demande de dérouler le code sur des valeurs données, de corriger un test (ordre, borne, opérateur) ou de compléter des lignes manquantes. Cette fiche prolonge le cours 32 (variables, affectation) et prépare le cours 34 (boucles).

À retenir

Rappel de cadrage : le programme ne demande ni pseudo-code ni algorithmique abstraite. Les programmes sont écrits directement dans le langage de macros du tableur (VBA).

01Le test If

1.1 Les trois formes

Test simple : une action n'est exécutée que si la condition est vraie.

If montant >= 5000 Then
    remise = 0.05
End If

Test avec alternative : deux traitements, l'un si la condition est vraie, l'autre sinon.

If montant >= 5000 Then
    remise = 0.05
Else
    remise = 0
End If

Tests en cascade : plusieurs conditions testées l'une après l'autre ; le premier test vrai l'emporte et les suivants sont ignorés.

If montant < 1000 Then
    remise = 0
ElseIf montant < 5000 Then
    remise = 0.03
Else
    remise = 0.05
End If

1.2 Règles de syntaxe

  • If condition Then : le mot Then est obligatoire ;
  • un bloc If se termine par End If ;
  • ElseIf s'écrit en un seul mot ; Else n'a pas de condition ;
  • on indente les lignes de chaque bloc : c'est ce qui rend un test imbriqué lisible ;
  • une forme à une seule ligne existe pour un test très court (If x > 0 Then y = 1), mais le bloc est préférable.

1.3 Les opérateurs de comparaison

OpérateurSensOpérateurSens
=égal<>différent
<strictement inférieur>strictement supérieur
<=inférieur ou égal>=supérieur ou égal

Dans un test, = est une comparaison et non une affectation (cours 32). Par défaut, la comparaison de textes distingue les majuscules et les minuscules : "Sud" = "sud" est faux. On neutralise la casse avec UCase (tout en majuscules) : UCase(region) = "SUD".

02Les conditions composées

OpérateurVrai quand...Exemple
Andles deux conditions sont vraiesca >= 20000 And retard = 0
Orau moins une condition est vraieretard > 30 Or solde < 0
Notla condition est fausseNot IsNumeric(saisie)

Priorité : Not, puis And, puis Or. Dans a Or b And c, c'est b And c qui est évalué d'abord. En cas de doute, on ajoute des parenthèses : (a Or b) And c.

Piège important : en VBA, And et Or évaluent toujours les deux conditions, même si la première suffit à conclure. Le test suivant échoue quand retard vaut 0 (division par zéro), alors qu'on croyait s'en protéger :

If retard > 0 And ca / retard > 100 Then   ' erreur d'exécution si retard = 0

On sépare alors en deux tests imbriqués :

If retard > 0 Then
    If ca / retard > 100 Then
        ' traitement
    End If
End If

03Tester la nature d'une valeur

Les valeurs saisies ou lues peuvent être inattendues : texte, cellule vide. On les teste avant de les utiliser.

FonctionRenvoie True quand...Exemple
IsNumeric(valeur)la valeur peut être lue comme un nombreIsNumeric("12,5") (avec la configuration française)
IsEmpty(cellule)la cellule est videIsEmpty(Range("B2"))
IsDate(valeur)la valeur peut être lue comme une dateIsDate("12/03/2026")
valeur = ""le texte est videIf saisie = "" Then

Avec InputBox, si l'utilisateur annule ou ne saisit rien, la variable contient un texte vide : c'est le premier test à faire.

04La variante Select Case

Quand on teste une même valeur contre plusieurs seuils ou plusieurs valeurs, Select Case est une alternative plus lisible qu'une longue cascade de ElseIf. Elle n'est pas citée par le programme : on la rencontre parfois, mais elle n'est jamais exigée.

Select Case montant
    Case Is < 1000
        remise = 0
    Case Is < 5000
        remise = 0.03
    Case Else
        remise = 0.05
End Select

Les cas sont évalués dans l'ordre ; le premier qui convient est exécuté. Case Else joue le rôle du Else.

05Du SI du tableur au If du code

Tableur (cours 26)Code
=SI(B5>=5000;0,05;0)If b5 >= 5000 Then taux = 0.05 Else taux = 0
SI(test1;a;SI(test2;b;c))If test1 Then ... ElseIf test2 Then ... Else ... End If
ET(c1;c2), OU(c1;c2), NON(c)c1 And c2, c1 Or c2, Not c

On peut donc traduire une formule en programme. Le programme est préférable quand la règle comporte beaucoup de cas, des messages, des écritures dans plusieurs cellules ; la formule reste préférable pour un calcul simple.

06Écrire une fonction de gestion : bonnes pratiques

  • Ordonner les tests du plus restrictif au moins restrictif : le premier test vrai l'emporte.
  • Décider qui appartient à la borne : < ou <= ? L'énoncé dit « à partir de » (borne dans la tranche haute) ou « jusqu'à » (borne dans la tranche basse).
  • Garantir qu'un cas est toujours traité : on termine par un Else.
  • Ne pas répéter les mêmes valeurs dans tout le code : on les déclare une fois, par exemple en Const en tête du module (une seule ligne à modifier si le barème change).
  • Passer les paramètres en arguments lorsque la fonction est utilisée dans des cellules : une fonction qui lit directement des cellules qui ne figurent pas dans ses arguments n'est pas recalculée automatiquement quand ces cellules changent.

Exemples corrigés

Cas 1 : une fonction de remise par tranches

Règle de gestion : pas de remise sous 1 000 € ; 3 % à partir de 1 000 € et jusqu'à 5 000 € exclus ; 5 % à partir de 5 000 €.

Option Explicit

Const SEUIL_1 As Double = 1000   ' début de la tranche à 3 %
Const SEUIL_2 As Double = 5000   ' début de la tranche à 5 %
Const TAUX_1 As Double = 0.03    ' taux de la tranche intermédiaire
Const TAUX_2 As Double = 0.05    ' taux de la tranche haute

Function TauxRemise(montant As Double) As Double
    ' Renvoie le taux de remise applicable à un montant de commande
    If montant < SEUIL_1 Then
        TauxRemise = 0               ' en dessous du premier seuil
    ElseIf montant < SEUIL_2 Then
        TauxRemise = TAUX_1          ' de SEUIL_1 inclus à SEUIL_2 exclu
    Else
        TauxRemise = TAUX_2          ' à partir de SEUIL_2
    End If
End Function

Utilisation dans une cellule : =TauxRemise(B5).

Trace d'exécution (le programme s'arrête au premier test vrai) :

Montantmontant < 1000montant < 5000Taux renvoyé
450Vrai(non évalué)0 %
1 000FauxVrai3 %
4 999,99FauxVrai3 %
5 000FauxFaux5 %
7 500FauxFaux5 %

La borne de 1 000 tombe dans la tranche à 3 %, celle de 5 000 dans la tranche à 5 % : le test utilise < et respecte « à partir de ». Si l'on avait écrit <=, le montant de 1 000 aurait été traité sans remise : erreur de borne.

Variante avec Select Case : celle de la section 4, qui donne les mêmes résultats.

À retenir

Conclusion à destination de la responsable des ventes : la fonction applique le barème sans ambiguïté sur les bornes, et les seuils et taux sont regroupés en tête du module : une évolution du barème ne demande de modifier que quatre lignes. Pour que les commerciaux puissent changer le barème sans ouvrir le code, il serait préférable de lire les seuils dans des cellules de paramètres et de les transmettre comme arguments de la fonction.

Cas 2 : statut d'un client avec des conditions composées

Règles, appliquées dans cet ordre :

  1. retard de paiement supérieur à 60 jours : « Bloqué » ;
  2. sinon, retard supérieur à 30 jours, ou retard (même court) pour un client de moins d'un an d'ancienneté : « À surveiller » ;
  3. sinon, chiffre d'affaires d'au moins 20 000 et aucun retard : « Privilégié » ;
  4. sinon : « Standard ».
Function StatutClient(ca As Double, retardJours As Long, anciennete As Long) As String
    ' Renvoie le statut d'un client selon son chiffre d'affaires, son retard et son ancienneté (en années)
    If retardJours > 60 Then
        StatutClient = "Bloqué"
    ElseIf retardJours > 30 Or (retardJours > 0 And anciennete < 1) Then
        StatutClient = "À surveiller"
    ElseIf ca >= 20000 And retardJours = 0 Then
        StatutClient = "Privilégié"
    Else
        StatutClient = "Standard"
    End If
End Function

Résultats attendus (trace sur six cas) :

CARetard (jours)Ancienneté (ans)Test vraiStatut
25 00005TroisièmePrivilégié
25 000455Deuxième (retard > 30)À surveiller
3 000100Deuxième (retard > 0 And ancienneté < 1)À surveiller
3 000103Aucun : ElseStandard
8 000704PremierBloqué
20 00001Troisième (borne : >=)Privilégié

Détail du troisième cas : retardJours > 60 est faux ; dans le deuxième test, retardJours > 30 est faux et (retardJours > 0 And anciennete < 1) est (Vrai And Vrai), donc vrai : le statut est « À surveiller ».

Effet de l'ordre des tests. Si l'on avait placé le test « À surveiller » avant le test « Bloqué », le client de la cinquième ligne (retard de 70 jours) aurait reçu « À surveiller » au lieu de « Bloqué », car retardJours > 30 est vrai et les tests suivants ne sont jamais lus.

Piège de l'évaluation complète. Écrire ElseIf retardJours > 0 And ca / retardJours > 100 ferait échouer le programme pour un retard nul (division par zéro), car And évalue ses deux membres. On sépare alors en deux If imbriqués.

À retenir

Conclusion à destination du responsable du crédit clients : la règle de blocage doit rester en tête : c'est le test le plus restrictif et il ne doit jamais être masqué. Sur les six clients testés, un est bloqué, deux sont à surveiller, deux sont privilégiés et un est standard : ces statuts sont à recouper avec le service commercial avant toute décision de blocage.

Cas 3 : valider une saisie avant de l'utiliser

On veut enregistrer en B2 une quantité entière comprise entre 1 et 999.

Sub VerifierQuantite()
    ' Demande une quantité et ne l'enregistre que si elle est valide
    Dim saisie As String       ' texte saisi par l'utilisateur
    Dim quantite As Double     ' valeur numérique de la saisie

    saisie = InputBox("Quantité commandée (entier de 1 à 999) ?")
    If saisie = "" Then
        MsgBox "Saisie annulée ou vide."
    ElseIf Not IsNumeric(saisie) Then
        MsgBox "La saisie n'est pas un nombre."
    Else
        quantite = CDbl(saisie)
        If quantite < 1 Or quantite > 999 Or quantite <> Int(quantite) Then
            MsgBox "Quantité refusée : entier de 1 à 999 attendu."
        Else
            Range("B2").Value = quantite
            MsgBox "Quantité enregistrée : " & quantite
        End If
    End If
End Sub

Int(x) renvoie la partie entière de x (vers le bas) : Int(12.5) vaut 12, et quantite <> Int(quantite) est vrai pour un nombre décimal.

Trace sur huit saisies (configuration française : la virgule est le séparateur décimal) :

SaisieTest appliquéRésultat
(vide ou annulation)saisie = "" vrai« Saisie annulée ou vide. »
abcNot IsNumeric vrai« La saisie n'est pas un nombre. »
12Dans le Else : bornes et entier vérifiésB2 = 12 ; « Quantité enregistrée : 12 »
0quantite < 1 vrai« Quantité refusée... »
12,5quantite <> Int(quantite) : 12,5 ≠ 12, vrai« Quantité refusée... »
1000quantite > 999 vrai« Quantité refusée... »
999Aucune condition de refus vraieB2 = 999 (borne incluse)
1Aucune condition de refus vraieB2 = 1 (borne incluse)

Les tests sont imbriqués : on vérifie d'abord que la saisie existe, puis qu'elle est numérique, puis seulement alors qu'elle respecte les bornes. L'ordre est nécessaire : CDbl("abc") provoquerait une erreur d'exécution.

À retenir

Conclusion à destination du responsable des commandes : le programme refuse 0, les décimaux, les valeurs hors bornes et les textes, et accepte les deux bornes. Les règles sont les mêmes que celles d'une validation de données du tableur (cours 29) ; la macro y ajoute des messages adaptés et pourra servir de base à un contrôle plus riche.

Cas 4 : compléter un programme

Énoncé. Une prime d'ancienneté est versée : 0 € en dessous de 2 ans ; 150 € de 2 ans à moins de 5 ans ; 300 € à partir de 5 ans. Une prime de performance de 100 € s'y ajoute pour tout salarié ayant au moins 2 ans d'ancienneté et un chiffre d'affaires d'au moins 15 000 €. Compléter les lignes marquées ____.

Function PrimeTotale(anciennete As Long, ca As Double) As Double
    ' Renvoie la prime d'ancienneté et de performance
    Dim prime As Double
    prime = 0
    If anciennete >= 5 Then
        prime = ____
    ElseIf anciennete ____ Then
        prime = 150
    End If
    If ____ And ca >= 15000 Then
        prime = prime + 100
    End If
    PrimeTotale = prime
End Function

Corrigé :

Function PrimeTotale(anciennete As Long, ca As Double) As Double
    ' Renvoie la prime d'ancienneté et de performance
    Dim prime As Double
    prime = 0                                  ' initialisation : aucune prime
    If anciennete >= 5 Then
        prime = 300                            ' 5 ans et plus
    ElseIf anciennete >= 2 Then
        prime = 150                            ' de 2 ans à moins de 5 ans
    End If
    If anciennete >= 2 And ca >= 15000 Then
        prime = prime + 100                    ' prime de performance : cumul avec la précédente
    End If
    PrimeTotale = prime
End Function

Justification : le premier test regarde la tranche la plus haute, sans quoi anciennete >= 2 capterait aussi les salariés de plus de 5 ans ; le deuxième bloc If est indépendant du premier (un If distinct et non un ElseIf), car la prime de performance se cumule avec la prime d'ancienneté.

Trace sur six cas :

AnciennetéCAPrime d'anciennetéPerformanceTotal
316 000150100250
612 0003000300
120 00000 (ancienneté insuffisante)0
215 000150100 (bornes incluses)250
514 999,993000300
1030 000300100400

À retenir

Conclusion à destination de la direction des ressources humaines : la fonction respecte les bornes fixées (2 ans, 5 ans, 15 000 €). Le salarié de 1 an qui réalise 20 000 € de chiffre d'affaires ne touche rien : c'est la conséquence de la règle, à confirmer si elle n'est pas voulue. Si le ElseIf avait été remplacé par un second If indépendant, le salarié de 6 ans verrait sa prime d'ancienneté ramenée de 300 € à 150 €, la seconde affectation écrasant la première : erreur typique de l'énoncé à compléter.

Vocabulaire essentiel

TermeDéfinition
Structure alternativeInstruction qui choisit entre plusieurs traitements selon une condition
ConditionExpression dont le résultat est True ou False
Test imbriquéTest placé à l'intérieur d'un autre test
Condition composéeCombinaison de conditions par And, Or, Not
BorneValeur exacte qui sépare deux cas
CascadeSuite de ElseIf dont seul le premier test vrai s'exécute
Évaluation complèteParticularité de And et Or du langage : les deux membres sont toujours évalués
Select CaseVariante qui teste une valeur contre plusieurs cas

Points clés à retenir

  1. Un bloc If se termine par End If ; ElseIf et Else forment la cascade.
  2. Dans une cascade, le premier test vrai l'emporte : on place le plus restrictif en premier.
  3. Une borne se traite par < ou <= selon la règle « à partir de » ou « jusqu'à ».
  4. And, Or, Not combinent les conditions ; priorité : Not, And, Or, et on utilise des parenthèses dans le doute.
  5. And et Or évaluent toujours les deux conditions : on protège une division par des If imbriqués.
  6. On teste la nature d'une saisie (IsNumeric, texte vide) avant de la convertir ou de la calculer.
  7. Un If indépendant (et non un ElseIf) permet de cumuler deux règles.
  8. Un ElseIf ou un Else final garantit qu'aucun cas n'échappe au traitement.

Pièges fréquents

  1. Mauvais ordre des tests : le cas le plus restrictif est masqué par un test plus large.
  2. < au lieu de <= (ou l'inverse) : la valeur exacte du seuil change de tranche.
  3. ElseIf à la place d'un If indépendant : la seconde règle n'est plus cumulée.
  4. Oublier End If ou Then : erreur de syntaxe.
  5. Croire que And s'arrête à la première condition fausse : la division par zéro se produit quand même.
  6. Comparer des textes sans tenir compte de la casse : "Sud" et "sud" diffèrent.
  7. Convertir une saisie avant de la tester : CDbl("abc") provoque une erreur.
  8. Écrire = dans un test en pensant affectation (ou l'inverse).

Q&R pour le tuteur IA

Q : Comment écrire en code une remise de 3 % à partir de 1 000 € et de 5 % à partir de 5 000 € ? R : If montant < 1000 Then taux = 0 ElseIf montant < 5000 Then taux = 0.03 Else taux = 0.05 End If, écrit en bloc. La borne de 1 000 tombe dans la tranche à 3 % et celle de 5 000 dans la tranche à 5 %, grâce à <.

Q : Quelle est la différence entre ElseIf et un second If ? R : Avec ElseIf, le second test n'est évalué que si le premier est faux : les cas s'excluent. Avec un If indépendant, il est toujours évalué : on peut cumuler deux règles, comme une prime d'ancienneté et une prime de performance.

Q : Pourquoi If retard > 0 And ca / retard > 100 Then peut-il échouer ? R : Parce que And évalue ses deux membres même si le premier est faux. Si retard vaut 0, la division par zéro produit une erreur d'exécution. Il faut imbriquer deux If.

Q : Comment vérifier qu'une saisie est un entier entre 1 et 999 ? R : On teste d'abord que la saisie n'est pas vide, puis IsNumeric, puis on convertit avec CDbl et on refuse si quantite < 1 Or quantite > 999 Or quantite <> Int(quantite).

Q : Comment traduire =SI(ET(B5>=8000;C5>=5000);100;0) en code ? R : If b5 >= 8000 And c5 >= 5000 Then prime = 100 Else prime = 0. ET devient And, OU devient Or, NON devient Not.

Q : Select Case est-il au programme ? R : Il n'est pas cité par le programme. On peut le rencontrer comme variante d'une cascade If ... ElseIf, mais on ne l'exige jamais ; savoir écrire If, ElseIf et Else suffit.

Tu as lu le cours. Passe maintenant à la pratique :

SIG DCG (UE8) : Tableur, audit de feuille et programmation

Ajoute gratuitement le Kit à ton espace, puis utilise tes jetons pour générer un quiz, créer des flashcards ou poser tes questions au Tuteur IA.

Quiz, flashcards et fiches déjà prêts

Voir les packs DCG