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

Macros du tableur : enregistrement, modèle d'objets, procédures, fonctions et variables (langage VBA)

À 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 » (enregistrer une macro-commande ; exécuter, modifier ou compléter le code d'une macro-commande, fonction ou procédure ; modèle d'objets associé à un tableur ; familles d'instructions : affectation de valeurs, d'objets, de variables et de paramètres ; instructions d'entrée, de calcul, de cumul et de sortie).

Pourquoi c'est central à l'examen : l'énoncé donne un programme écrit dans le langage de macros du tableur (VBA) et demande de l'interpréter (quel est le résultat ?), de le modifier ou de le compléter. Le programme limite l'étude aux concepts de base : objets fondamentaux (classeur, feuille, colonne, ligne, plage), sans classes personnalisées, ni application complexe, ni optimisation. Le candidat doit pouvoir lire chaque ligne et dérouler le programme à la main.

À retenir

Ce cours et les cours 33 et 34 : le programme ne demande ni pseudo-code ni algorithmique abstraite. La programmation s'apprend ici directement dans le langage de macros du tableur (VBA), sur des problèmes de gestion.

01Les macros-commandes

1.1 Définition

Une macro-commande (ou macro) est une suite d'instructions enregistrée sous un nom, qui automatise des gestes répétitifs (mise en forme, copie, calcul, impression). On la déclenche par un raccourci clavier, un bouton ou la commande d'exécution.

1.2 Enregistrer une macro

  1. Lancer l'enregistreur de macros.
  2. Donner un nom (sans espace, commençant par une lettre) et, si l'on veut, un raccourci clavier ; choisir où stocker la macro (dans ce classeur).
  3. Effectuer les gestes à automatiser : l'enregistreur les traduit en instructions.
  4. Arrêter l'enregistrement.
  5. Tester sur d'autres données, lire le code produit et le corriger si nécessaire.

Choix à connaître : l'enregistrement en références absolues (la macro agit toujours sur les mêmes cellules) ou relatives (la macro agit à partir de la cellule active, par exemple pour traiter la ligne en cours).

Un classeur qui contient des macros doit être enregistré dans un format qui les conserve. À l'ouverture d'un classeur reçu, on n'active jamais des macros dont on ignore l'origine : une macro peut effacer des données ou propager un logiciel malveillant (cours 10 et 11).

1.3 Lire le code produit par l'enregistreur

Après avoir mis en forme une ligne d'en-têtes (gras, fond gris, centrage, largeur des colonnes ajustée), le code enregistré ressemble à ceci :

Sub MiseEnFormeEntetes()
'
' MiseEnFormeEntetes Macro
'
    Range("A1:E1").Select
    Selection.Font.Bold = True
    Selection.Interior.Color = 14277081
    Selection.HorizontalAlignment = xlCenter
    Columns("A:E").EntireColumn.AutoFit
    Range("A2").Select
End Sub
LigneSignification
Sub MiseEnFormeEntetes() ... End SubDébut et fin de la procédure
Lignes commençant par 'Commentaires : ignorés à l'exécution
Range("A1:E1").SelectSélectionne la plage A1:E1
Selection.Font.Bold = TrueMet en gras la police de la sélection
Selection.Interior.Color = 14277081Applique une couleur de fond (un nombre représente la couleur)
Selection.HorizontalAlignment = xlCenterCentre le contenu (xlCenter est une constante du langage)
Columns("A:E").EntireColumn.AutoFitAjuste la largeur des colonnes A à E
Range("A2").SelectReplace le curseur en A2

Les défauts du code enregistré :

  • il est verbeux (il sélectionne avant d'agir : Select puis Selection) : on peut l'écrire plus directement, par exemple Range("A1:E1").Font.Bold = True ;
  • il est figé sur des adresses (A1:E1) : pour traiter une liste de longueur variable, il faut un programme (cours 34) ;
  • il enregistre tout ce qu'on fait, y compris les gestes inutiles ou erronés.

02Le modèle d'objets du tableur

2.1 La hiérarchie

Le tableur est représenté par des objets emboîtés. On les désigne en partant du plus général, avec un point entre chaque niveau.

ObjetReprésenteExemples d'expressions
ApplicationLe tableur lui-mêmeApplication
Workbook (classeur)Un fichier ouvertThisWorkbook (le classeur qui contient la macro), Workbooks(1) (le premier classeur ouvert)
Worksheet (feuille)Une feuille d'un classeurWorksheets("Ventes"), ActiveSheet (feuille active)
Range (plage)Une ou plusieurs cellulesRange("A1"), Range("A1:E1")
CellsUne cellule désignée par numérosCells(2, 4) désigne la ligne 2, colonne 4, soit D2
Rows, ColumnsUne ligne, une colonneRows(3), Columns("B")

Deux règles de lecture :

  • Cells(ligne, colonne) : la ligne d'abord, puis la colonne (Cells(2, 4) est D2, et non B4). Avec cette notation, on peut faire varier la ligne ou la colonne par un calcul ou une variable (cours 34) ;
  • une expression complète se lit de gauche à droite : Worksheets("Ventes").Range("D2").Value signifie « la valeur de la cellule D2 de la feuille Ventes ». Sans le nom de feuille, le programme agit sur la feuille active.

2.2 Propriétés et méthodes

NotionDéfinitionSyntaxeExemples
PropriétéUne caractéristique de l'objet, que l'on lit ou modifieObjet.Propriété = valeurRange("A1").Value = 100 ; Range("A1").Font.Bold = True ; Worksheets("Ventes").Name
MéthodeUne action que l'objet sait exécuterObjet.Méthode (avec ou sans arguments)Range("A1:E1").ClearContents ; Range("A1").Select ; Worksheets("Ventes").Activate

Propriétés fréquentes : Value (contenu), Formula (formule), Name (nom), Count (nombre d'éléments), Row et Column (position), Address (adresse). Méthodes fréquentes : Select, Clear, ClearContents (efface le contenu), Copy, Delete, Activate.

03Procédures et fonctions

Procédure (Sub)Fonction (Function)
RôleExécuter une suite d'actions (mise en forme, copie, écriture de cellules)Renvoyer une valeur à partir de paramètres
Se termine parEnd SubEnd Function
Valeur de retourAucuneOui : on affecte le résultat au nom de la fonction
DéclenchementBouton, raccourci, commande d'exécution, appel par une autre procédureUtilisation dans une cellule (=PrixTTC(B5;Taux_TVA)) ou dans le code

Exemple de fonction personnalisée :

Function PrixTTC(prixHT As Double, taux As Double) As Double
    PrixTTC = prixHT * (1 + taux)    ' le résultat est affecté au nom de la fonction
End Function
  • prixHT et taux sont les paramètres (ou arguments) ; As Double donne leur type ;
  • le As Double final est le type de la valeur renvoyée ;
  • dans une cellule, les arguments sont séparés par un point-virgule (comme dans les formules, cours 25) : =PrixTTC(B5;Taux_TVA) ;
  • dans le code, les arguments sont séparés par une virgule : PrixTTC(250, 0.2).

Une fonction appelée depuis une cellule peut calculer et renvoyer une valeur ; elle ne peut pas modifier d'autres cellules. Pour modifier la feuille, on utilise une procédure.

3.1 Passer des paramètres

Les paramètres sont des variables locales de la procédure qui les reçoit. Par défaut, ils sont passés par référence (ByRef) : la procédure appelée travaille sur la variable de l'appelant, qu'elle peut modifier. Avec ByVal, elle reçoit une copie : la variable de l'appelant n'est jamais modifiée. En cas de doute, on écrit ByVal pour les paramètres que l'on ne veut pas voir changer.

04Variables, types et affectation

4.1 Déclarer une variable

Une variable est un emplacement mémoire nommé qui contient une valeur le temps de l'exécution. On la déclare avec Dim, en précisant son type :

TypeContenuExemple
IntegerEntier de -32 768 à 32 767Dim i As Integer
LongGrand entier (numéro de ligne, quantités élevées)Dim ligne As Long
DoubleNombre décimal (montants, taux)Dim montant As Double
StringTexteDim nom As String
BooleanTrue ou FalseDim paye As Boolean
DateDateDim echeance As Date
Worksheet, RangeUn objet feuille ou plageDim ws As Worksheet

La ligne Option Explicit, placée en tête du module, oblige à déclarer toutes les variables : une faute de frappe dans un nom est alors signalée au lieu de créer silencieusement une nouvelle variable vide. Une constante se déclare avec Const : Const TVA As Double = 0.2.

Règles de nommage : une lettre au début, pas d'espace ni d'accent dans les noms de variables par prudence, des noms parlants (totalHT plutôt que x).

4.2 L'affectation

L'affectation range une valeur dans une variable ou une propriété. Le signe = y joue le rôle d'une flèche : on calcule le membre de droite, puis on le range dans celui de gauche.

FormeSyntaxeExemple
Valeurvariable = expressiontotal = prixHT * quantite
ObjetSet variable = objet (mot Set obligatoire)Set ws = Worksheets("Ventes")
Cumulvariable = variable + valeurtotal = total + montant
Paramètreà l'appel : NomProcédure argument1, argument2AfficherTTC 250, 0.2

Attention à la double lecture du signe = : en total = total + 1 il s'agit d'une affectation (la nouvelle valeur est l'ancienne plus 1) ; dans un test (If total = 10 Then), c'est une comparaison (cours 33).

4.3 Conventions d'écriture du code

ÉlémentDans le codeDans une formule de cellule (tableur en français)
Séparateur d'argumentsVirgule : PrixTTC(250, 0.2)Point-virgule : =PrixTTC(250;0,2)
Séparateur décimal d'un nombre écrit dans le codePoint : 0.2Virgule : 0,2
Chaînes de texteEntre guillemets : "Ventes"Entre guillemets
CommentaireCommence par une apostrophe 'Pas de commentaire

Le code est écrit avec les noms anglais des instructions et des objets, quelle que soit la langue du tableur.

05Les familles d'instructions

5.1 Entrée

InstructionRôleExemple
Lecture d'une celluleLire la propriété Valueprix = Range("B2").Value
InputBoxDemander une valeur à l'utilisateur ; renvoie toujours du textesaisie = InputBox("Prix HT ?")

Le texte renvoyé par InputBox se convertit pour les calculs : CDbl(saisie) (décimal), CLng(saisie) (entier long). Avec la configuration française, CDbl("49,9") donne 49,9. L'instruction Val ne reconnaît que le point : Val("49,9") donne 49 ; on évite Val pour les nombres saisis à la française. Si l'utilisateur annule ou saisit du texte, la conversion provoque une erreur d'exécution : on la prévient par un test (IsNumeric, cours 33).

5.2 Calcul et cumul

Opérateurs : +, -, *, / (division), ^ (puissance), \ (division entière), Mod (reste de la division entière), & (concaténation de textes).

ExpressionRésultat
17 \ 53
17 Mod 52
7 / 23,5

Un cumul est une affectation de la forme total = total + valeur, précédée d'une initialisation (total = 0) : une variable numérique déclarée vaut 0 au départ, mais on l'écrit explicitement pour que le programme se lise sans ambiguïté.

Attention à l'arrondi : la fonction Round du langage de macros arrondit « au pair » lorsque la décimale est exactement 5 : Round(2.5, 0) donne 2, Round(3.5, 0) donne 4, alors que ARRONDI(2,5;0) du tableur donne 3. Pour les montants, on s'assure du comportement voulu avant de choisir (le principe d'arrondi doit être précisé par l'énoncé).

5.3 Sortie

InstructionRôleExemple
MsgBoxAfficher un messageMsgBox "TTC : " & prixTTC
Écriture dans une celluleAffecter la propriété ValueRange("B4").Value = prixTTC

Dans MsgBox, l'opérateur & assemble du texte et des variables ; un nombre est converti en texte avec la virgule décimale si la configuration est française.

Exemples corrigés

Cas 1 : lire et améliorer une macro enregistrée

Le code de la section 1.3 (MiseEnFormeEntetes) est demandé en lecture. Réponses :

  1. Rôle : mettre en gras, centrer et griser la ligne 1 des colonnes A à E, ajuster la largeur de ces colonnes, puis placer le curseur en A2.
  2. Effet sur une autre feuille : la macro agit sur la feuille active au moment de l'exécution, puisque les adresses ne précisent aucune feuille.
  3. Défaut : si la liste comptait une colonne F, elle ne serait pas traitée.

Version simplifiée équivalente, sans sélection :

Sub MiseEnFormeEntetes()
    With Range("A1:E1")             ' tout ce qui suit s'applique à la plage A1:E1
        .Font.Bold = True           ' gras
        .Interior.Color = 14277081  ' fond gris clair
        .HorizontalAlignment = xlCenter
    End With
    Columns("A:E").AutoFit          ' ajuste la largeur des colonnes
End Sub

À retenir

Conclusion à destination du responsable administratif : la macro enregistrée automatise bien la mise en forme, mais elle ne s'adapte pas à un tableau plus large. Pour un usage durable, on garde l'enregistreur comme point de départ, puis on lit et on nettoie le code ; pour un tableau de longueur variable, on passe à un programme avec boucle (cours 34).

Cas 2 : une procédure avec entrée, calcul et sortie

La cellule B2 de la feuille active contient le taux de TVA (20 %, soit la valeur 0,2).

Option Explicit

Sub CalculerTTC()
    ' Calcule le prix TTC d'un article à partir d'un prix HT saisi
    Dim prixHT As Double        ' prix hors taxe saisi
    Dim tauxTVA As Double       ' taux de TVA lu dans la feuille
    Dim montantTVA As Double    ' montant de la TVA
    Dim prixTTC As Double       ' prix toutes taxes comprises

    tauxTVA = Range("B2").Value                        ' entrée : lecture de la cellule B2
    prixHT = CDbl(InputBox("Prix HT de l'article ?"))  ' entrée : saisie, convertie en nombre
    montantTVA = prixHT * tauxTVA                      ' calcul de la TVA
    prixTTC = prixHT + montantTVA                      ' calcul du TTC
    Range("B4").Value = prixTTC                        ' sortie : écriture dans B4
    MsgBox "TVA : " & montantTVA & " ; TTC : " & prixTTC   ' sortie : message
End Sub

Trace d'exécution (état des variables après chaque instruction ; l'utilisateur saisit 250) :

InstructiontauxTVAprixHTmontantTVAprixTTCSortie
(déclarations)0000
tauxTVA = Range("B2").Value0,2000
prixHT = CDbl(InputBox(...))0,225000
montantTVA = prixHT * tauxTVA0,2250500
prixTTC = prixHT + montantTVA0,225050300
Range("B4").Value = prixTTC
B4 contient 300
MsgBox ...
« TVA : 50 ; TTC : 300 »

Vérification : 250 × 0,2 = 50 ; 250 + 50 = 300.

Second jeu d'essai (saisie 49,9) : prixHT = 49,9 ; montantTVA = 49,9 × 0,2 = 9,98 ; prixTTC = 59,88 ; message : « TVA : 9,98 ; TTC : 59,88 » (la configuration française affiche une virgule décimale).

Points de lecture : Option Explicit oblige à déclarer les variables ; CDbl convertit le texte saisi ; si l'utilisateur annule la boîte de saisie, InputBox renvoie un texte vide et CDbl("") provoque une erreur d'exécution (à traiter au cours 33).

À retenir

Conclusion à destination du responsable des devis : la procédure automatise le calcul et affiche le résultat sans toucher à la formule du tableur, et le taux de TVA reste dans une cellule de paramètre, lu à chaque exécution (aucune valeur en dur dans le code, comme dans une formule). Elle ne contrôle pas encore la saisie : c'est l'objet du cours suivant.

Cas 3 : une fonction personnalisée utilisée dans une cellule et dans le code

Function PrixTTC(prixHT As Double, taux As Double) As Double
    ' Renvoie le prix TTC pour un prix HT et un taux de TVA donnés
    PrixTTC = prixHT * (1 + taux)
End Function

Sub AfficherPrix()
    ' Appelle la fonction PrixTTC depuis le code
    Dim ht As Double
    ht = 250
    MsgBox "Prix TTC : " & PrixTTC(ht, 0.2)
End Sub

Dans la feuille : B5 contient 250, Taux_TVA vaut 0,2 ; =PrixTTC(B5;Taux_TVA) renvoie 300. Avec B5 égal à 49,9, le résultat est 59,88 (49,9 × 1,2).

Trace de AfficherPrix : ht = 250 ; l'appel PrixTTC(ht, 0.2) transmet 250 au paramètre prixHT et 0,2 au paramètre taux ; la fonction calcule 250 × (1 + 0,2) = 300 et le range dans PrixTTC ; le message affiche « Prix TTC : 300 ».

À retenir

Conclusion à destination du service comptable : la fonction se comporte comme une fonction du tableur et se recopie dans toute une colonne. Elle centralise la règle de calcul : si la règle change, on la modifie à un seul endroit. Elle ne contient pas de taux en dur, qui est transmis en paramètre.

Cas 4 : affecter un objet et cumuler

La feuille Ventes contient les trois premières ventes en D2, D3 et D4 : 4 200, 1 350 et 6 800.

Option Explicit

Sub CumulerTroisVentes()
    ' Cumule les trois premières ventes de la feuille Ventes
    Dim ws As Worksheet          ' variable de type objet : une feuille
    Dim cumul As Double          ' cumul du chiffre d'affaires

    Set ws = Worksheets("Ventes")            ' affectation d'un objet : Set obligatoire
    cumul = 0                                ' initialisation du cumul
    cumul = cumul + ws.Range("D2").Value     ' 1re vente
    cumul = cumul + ws.Range("D3").Value     ' 2e vente
    cumul = cumul + ws.Range("D4").Value     ' 3e vente
    ws.Range("F2").Value = cumul             ' sortie : écriture dans F2
    MsgBox "Cumul des trois premières ventes : " & cumul
End Sub

Trace d'exécution :

Instructioncumul
cumul = 00
cumul = cumul + ws.Range("D2").Value4 200
cumul = cumul + ws.Range("D3").Value5 550
cumul = cumul + ws.Range("D4").Value12 350

Sortie : F2 contient 12 350 et le message affiche « Cumul des trois premières ventes : 12350 ».

Si le mot Set est oublié (ws = Worksheets("Ventes")), l'instruction provoque une erreur d'exécution : une feuille est un objet, il faut Set. À l'inverse, on n'écrit pas Set pour une valeur simple (cumul = 0).

À retenir

Conclusion à destination du responsable du contrôle de gestion : le programme est correct mais ne traite que trois lignes ; pour cumuler toute la liste, quel qu'en soit le nombre, on remplace les trois lignes de cumul par une boucle (cours 34). Le résultat est conforme à la somme manuelle 4 200 + 1 350 + 6 800 = 12 350.

Vocabulaire essentiel

TermeDéfinition
Macro-commandeSuite d'instructions enregistrée sous un nom
Enregistreur de macrosOutil qui traduit les gestes de l'utilisateur en code
ModuleZone où est stocké le code
ObjetÉlément du tableur manipulable par le code (classeur, feuille, plage)
Propriété, méthodeCaractéristique d'un objet ; action qu'il exécute
Procédure (Sub)Bloc d'instructions qui exécute des actions
Fonction (Function)Bloc d'instructions qui renvoie une valeur
VariableEmplacement mémoire nommé et typé
AffectationRangement d'une valeur ou d'un objet dans une variable
ParamètreVariable qui reçoit une valeur transmise à l'appel

Points clés à retenir

  1. L'enregistreur produit un code verbeux (Select puis Selection) et figé sur des adresses : on le lit et on le nettoie.
  2. Le modèle d'objets s'écrit du général au particulier : classeur, feuille, plage ; Cells(ligne, colonne) donne la ligne d'abord.
  3. Une propriété se lit ou se modifie ; une méthode exécute une action.
  4. Une procédure agit ; une fonction renvoie une valeur en affectant son nom.
  5. On déclare les variables avec Dim et un type ; Option Explicit rend la déclaration obligatoire.
  6. Valeur : x = ... ; objet : Set x = ....
  7. Dans le code : virgule entre arguments, point décimal ; dans une cellule : point-virgule et virgule décimale.
  8. InputBox renvoie du texte à convertir ; Round du langage arrondit au pair (Round(2.5, 0) donne 2).

Pièges fréquents

  1. Oublier Set pour affecter un objet (ou le mettre pour une valeur simple).
  2. Confondre Cells(2, 4) et D2/B4 : la ligne vient en premier.
  3. Écrire 0,2 dans le code : le séparateur décimal du code est le point.
  4. Séparer par un point-virgule les arguments dans le code ou par une virgule dans une cellule.
  5. Oublier de convertir le texte de InputBox avant un calcul.
  6. Utiliser Val pour un nombre saisi avec une virgule : Val("49,9") donne 49.
  7. Lire = comme une égalité dans une affectation : total = total + 1 n'est pas une équation.
  8. Supposer que Round arrondit comme ARRONDI : le langage arrondit « au pair ».

Q&R pour le tuteur IA

Q : Quelle est la différence entre une procédure (Sub) et une fonction (Function) ? R : Une procédure exécute des actions et ne renvoie rien. Une fonction renvoie une valeur, obtenue en affectant le résultat au nom de la fonction ; elle s'utilise dans une cellule comme une fonction du tableur.

Q : Que désigne Cells(3, 2) ? R : La cellule située à la ligne 3, colonne 2, c'est-à-dire B3. La ligne est toujours donnée en premier.

Q : Pourquoi écrit-on Set ws = Worksheets("Ventes") et non ws = ... ? R : Parce que ws est une variable d'objet : l'affectation d'un objet exige le mot Set. Pour une valeur simple (nombre, texte), on écrit l'affectation sans Set.

Q : Que fait total = total + montant ? R : C'est un cumul : on calcule la somme de la valeur actuelle de total et de montant, puis on range le résultat dans total. La variable doit avoir été initialisée (total = 0) avant le premier cumul.

Q : Comment lire le prix saisi par l'utilisateur et l'utiliser dans un calcul ? R : Avec InputBox, qui renvoie du texte, converti par CDbl : prix = CDbl(InputBox("Prix HT ?")). On prévoit le cas d'une saisie vide ou non numérique, qui provoquerait une erreur.

Q : Pourquoi Round(2.5, 0) ne donne-t-il pas 3 ? R : Parce que la fonction Round du langage arrondit au nombre pair le plus proche quand la décimale est exactement 5 : 2,5 donne 2 et 3,5 donne 4. Le tableur, avec ARRONDI, arrondit 2,5 à 3. L'énoncé doit préciser la règle à appliquer.

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