🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA Dim dans Excel — déclarer vos variables, Option Explicit et la faute de frappe qui devient une boîte vide

|

VBA Dim dans Excel — déclarer vos variables, Option Explicit et la faute de frappe qui devient une boîte vide

TL;DRDim name As Type réserve une boîte nommée et fige sa forme avant usage : Dim total As Long. Déclarer est facultatif en VBA — et c'est précisément là le problème. Sans déclaration, un seul nom mal orthographié devient en silence un tout nouveau Variant vide, votre total reste à 0, et aucune erreur ne se déclenche jamais. Placez Option Explicit tout en haut de chaque module. Il vous force à déclarer chaque variable : ainsi une faute de frappe devient une erreur de compilation (« Variable non définie ») au lieu d'un résultat faux. C'est la ligne au meilleur rapport bénéfice/effort de tout le langage.

Option Explicit          ' <- à placer tout en haut de CHAQUE module

Sub Demo()
    Dim total As Long    ' réserve une boîte à nombre entier nommée « total »
    Dim name As String   ' réserve une boîte à texte nommée « name »

    total = 10 + 5
    name = "Invoice"
    Debug.Print name, total   ' -> Invoice      15
End Sub

Toute macro commence par nommer les choses sur lesquelles elle va travailler : un compteur de lignes, une feuille, une somme cumulée. Dim, c'est l'outil pour cela. Cela ressemble à de la paperasse, mais sauter cette étape (ou la bâcler) est à l'origine de toute une catégorie de bugs qui ne déclenchent aucune erreur — les pires, car la macro va jusqu'au bout et vous rend un nombre faux avec aplomb.

Ce que vous allez apprendre

  • Ce que fait vraiment Dim — réserver une boîte nommée et figer sa forme
  • Pourquoi Option Explicit transforme les bugs de frappe silencieux en erreurs de compilation bruyantes
  • Le piège Dim a, b As Long qui fait de a un Variant, pas un Long
  • Quand un simple = ne suffit pas et qu'il faut Set (les objets)
  • Comment l'endroit où vous déclarez une variable décide qui peut la voir et combien de temps elle vit

Le modèle mental : Dim réserve une boîte étiquetée avant que vous la remplissiez

Voyez une variable comme une boîte étiquetée en mémoire. Dim total As Long fait deux choses à la fois : elle réserve une boîte et lui donne l'étiquette total, et elle fige la forme de cette boîte en Long (un nombre entier). Dès lors, total = 15 place une valeur dans cette boîte et le nom total la relit.

L'étiquette compte plus que les débutants ne l'imaginent, à cause de ce que fait VBA face à un nom qu'il ne reconnaît pas. Par défaut — sans Option Explicit — la réaction de VBA devant un nom inconnu n'est pas « erreur ». C'est « tiens, une nouvelle variable », et il en crée une pour vous, vide, sans rien dire. Ce seul choix de conception est à l'origine du bug le plus déroutant de VBA, et la section suivante en est le remède.

La règle qui vous évite le pire bug VBA : Option Explicit

Voici le bug, en trois lignes :

Sub AddThemUp()
    total = 0
    total = totl + 10      ' faute de frappe : « totl », pas « total »
    Debug.Print total      ' -> 10, indéfiniment — la faute a créé une NOUVELLE boîte vide
End Sub

Vous vouliez total, vous avez tapé totl. Sans Option Explicit, VBA ne signale rien. Il invente un Variant tout neuf et vide nommé totl (valeur 0 / Empty), ajoute 10 à rien du tout, et votre vrai total ne s'incrémente jamais. Aucun texte en rouge, aucune boîte de message — juste un résultat faux que vous risquez de ne remarquer qu'une fois dans un rapport.

Option Explicit élimine toute cette catégorie de bugs. Placé en première ligne d'un module, il rend la déclaration obligatoire : chaque variable doit apparaître dans un Dim (ou Private / Public) avant d'être utilisée. Désormais, la faute de frappe ne peut plus créer de boîte fantôme — c'est un nom non déclaré, alors VBA s'arrête à la compilation :

Option Explicit

Sub AddThemUp()
    Dim total As Long
    total = 0
    total = totl + 10      ' Erreur de compilation : Variable non définie  (surligne « totl »)
End Sub

L'erreur pointe droit sur la faute avant même que la macro ne démarre. Activez-le partout par défaut : Outils → Options → Éditeur → « Déclaration des variables obligatoire » ajoute automatiquement Option Explicit à chaque nouveau module (vous l'ajoutez encore à la main aux modules existants). Considérez « Variable non définie » comme un cadeau — il vient d'attraper un bug gratuitement.

La règle qui lie chaque Dim à un seul type : le piège Dim a, b As Long

C'est l'erreur de déclaration que presque tout le monde commet une fois. Vous voulez trois compteurs Long, alors vous écrivez :

Dim i, j, k As Long

Vous vous attendez raisonnablement à ce que i, j et k soient tous des Long. Ce n'est pas le cas. Seul k est un Long. i et j — qui n'ont pas de clause As propre — sont des Variant. En VBA, le type ne s'applique qu'à la variable à laquelle il est directement rattaché ; il n'existe aucune règle de « propagation du type sur toute la liste ».

' FAUX — i et j sont des Variant, seul k est un Long
Dim i, j, k As Long

' CORRECT — chaque variable reçoit son propre type
Dim i As Long, j As Long, k As Long

' Le plus clair de tout — une par ligne
Dim i As Long
Dim j As Long
Dim k As Long

Le mode de défaillance est subtil : le code tourne quand même, car un Variant accueille sans problème un nombre. Vous perdez la sûreté de type et la vitesse que vous croyiez avoir, et le bug ne se révèle que plus tard, lorsqu'une de ces variables « Long » accepte en silence du texte ou une valeur gigantesque qu'elle ne devrait pas. Donnez à chaque variable son propre As Type.

La règle pour les objets : un simple = ne suffit pas, il faut Set

Les variables qui contiennent une valeur — un nombre, du texte, une date — s'affectent avec =. Les variables qui contiennent un objet — un Worksheet, un Range, un Workbook — doivent s'affecter avec Set. Oublier Set est l'autre erreur classique du débutant.

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Data")   ' Set est obligatoire pour les objets
Debug.Print ws.Range("A1").Value

Dim rng As Range
Set rng = ws.Range("A1:A10")               ' encore Set

Omettez Set et VBA n'affecte pas l'objet — il tente plutôt de lire la valeur par défaut de l'objet, et vous obtenez « Variable objet ou variable de bloc With non définie » (erreur 91) ou « Objet requis » (erreur 424). La règle est mécanique et mérite d'être mémorisée : les types valeur utilisent =, les types objet utilisent Set. Si un nom de type désigne une chose du modèle objet d'Excel (Worksheet, Range, Chart, Workbook), il lui faut Set.

L'endroit où vous placez Dim décide de la portée et de la durée de vie

L'endroit où vous écrivez Dim n'est pas cosmétique — il décide qui peut voir la variable et combien de temps elle survit :

  • À l'intérieur d'un Sub ou d'une Function → la variable est locale. Elle naît au démarrage de la procédure et disparaît à sa fin. Rien à l'extérieur ne peut la voir.
  • En haut d'un module, au-dessus de la première procédure → elle est visible par toutes les procédures de ce module. Utilisez Private à cet endroit pour la garder limitée au module.
  • Public en haut d'un module → c'est une globale, visible par tout le projet. Puissant, mais facile à détourner ; une valeur que n'importe quel code peut modifier depuis n'importe où devient difficile à suivre.

En règle générale, déclarez vos variables aussi localement que possible — directement dans la procédure qui les utilise. Ne recourez au niveau module ou à Public que lorsqu'une valeur doit vraiment être partagée. La portée est un sujet à part entière ; si vous faites circuler des valeurs entre procédures, voyez comment les arguments transitent dans VBA Sub et VBA ByRef contre ByVal.

Comment ExcelMaster aide

Dim, Option Explicit et une portée disciplinée sont ce qui distingue une macro qui survit à un an de modifications d'une macro qui pourrit. C'est aussi de la friction — les déclarations minutieuses que vous écrivez avant d'arriver à la partie qui vous intéresse vraiment.

ExcelMaster vous laisse aller droit au résultat. Décrivez la tâche en langage courant — « dans la feuille Commandes, additionne la colonne D lorsque le statut est Payé, groupé par mois » — et il écrit et exécute la logique à votre place, en déclarant les bonnes variables et les bons types de façon robuste, au lieu de vous laisser penser à Option Explicit. Quand vous avez réellement besoin d'une macro écrite à la main et planifiée, c'est vous qui ferez encore les Dim. Pour la tâche quotidienne « fais juste le boulot sur les données d'aujourd'hui », décrire le résultat vaut mieux que réussir chaque déclaration à la main.

Questions fréquentes

Faut-il déclarer ses variables en VBA ?

Techniquement non — VBA vous laisse utiliser une variable jamais déclarée, en la traitant comme un Variant. En pratique, vous devriez tout déclarer, car les variables non déclarées permettent à une simple faute de frappe de créer en silence une nouvelle boîte vide et de produire un résultat faux sans aucune erreur. Placez Option Explicit en haut de chaque module pour rendre la déclaration obligatoire.

Que signifie Dim en VBA ?

Dim est l'abréviation de « dimension » — cela remonte à l'époque où l'on réservait les dimensions d'un tableau dans les premiers BASIC. Aujourd'hui, cela signifie simplement « déclarer une variable » : réserver un emplacement nommé en mémoire et, avec As Type, figer le genre de valeur qu'il contient, par exemple Dim count As Long.

Est-ce que Dim a, b As Long déclare a et b tous deux en Long ?

Non. Seul b est un Long ; a est un Variant, car la clause As ne s'applique qu'à la variable à laquelle elle est directement rattachée. Pour rendre les deux Long, écrivez Dim a As Long, b As Long — donnez à chaque variable son propre As Type.

Qu'est-ce qu'Option Explicit et où le placer ?

Option Explicit force chaque variable à être déclarée avant usage. Placez-le en première ligne de chaque module, au-dessus de toutes les procédures. Il transforme les bugs silencieux de « faute de frappe non déclarée » en une erreur de compilation claire, « Variable non définie ». Activez Outils → Options → Éditeur → Déclaration des variables obligatoire pour l'ajouter automatiquement aux nouveaux modules.

Quand utiliser Set plutôt que = dans une affectation ?

Utilisez Set quand la variable contient un objet du modèle objet d'Excel — un Worksheet, un Range, un Workbook, un Chart, etc. : Set ws = ActiveSheet. Utilisez un simple = pour les valeurs — nombres, texte, dates, booléens. Oublier Set sur un objet donne « Variable objet ou variable de bloc With non définie » (erreur 91).

Testé dans

Testé dans : Excel 365 (Windows 11), VBA 7.1 — dernière vérification le 31/07/2026.

Guides associés : VBA Data Types · VBA Const · VBA Sub · VBA ByRef contre ByVal · VBA Range