TL;DR —
Dim name As Typeré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 nouveauVariantvide, votre total reste à0, et aucune erreur ne se déclenche jamais. PlacezOption Explicittout 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 Explicittransforme les bugs de frappe silencieux en erreurs de compilation bruyantes - Le piège
Dim a, b As Longqui fait deaunVariant, pas unLong - Quand un simple
=ne suffit pas et qu'il fautSet(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
Subou d'uneFunction→ 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. Publicen 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
