TL;DR —
ThisWorkbookdésigne toujours le seul classeur qui contient le code en cours d'exécution, quelle que soit la fenêtre sur laquelle l'utilisateur clique.ActiveWorkbookdésigne ce qui est au premier plan à l'instant T, et cela peut changer sous vos pieds. Un simpleRange("A1")est pire encore : il ne nomme ni classeur ni feuille, il atterrit donc sur celui qui est actif à cet instant précis. Ancrez vos écritures surThisWorkbook(ou une variable classeur que vousSetvous-même) et la macro cesse de dépendre du dernier clic de souris.
Sub WhereDoesItLand()
' ThisWorkbook = le fichier ou vit ce code - fixe pour toujours
ThisWorkbook.Worksheets("Summary").Range("A1").Value = "Report"
' ActiveWorkbook = ce qui est au premier plan quand cette ligne s'execute - versatile
Debug.Print ThisWorkbook.Name ' p. ex. Macros.xlsm - toujours
Debug.Print ActiveWorkbook.Name ' ce que l'utilisateur a clique en dernier
End Sub
Ce que vous allez apprendre
- Le modèle mental — ThisWorkbook est une adresse fixe, ActiveWorkbook une adresse mouvante
- Les trois outils pour dire quel objet vous visez, et pourquoi une référence non qualifiée est dangereuse
- ThisWorkbook face à ActiveWorkbook, la distinction la plus importante d'un VBA fiable
- Le piège silencieux — pourquoi une macro qui marche à votre poste corrompt le fichier ouvert d'un collègue
- Comment référencer un autre classeur ouvert par son nom, et comment en ouvrir un en gardant sa référence
- L'avis — qualifiez chaque référence, et prenez ThisWorkbook par défaut
Le modèle mental : une adresse fixe, pas une adresse mouvante
Chaque référence en VBA répond à une question : quel classeur, quelle feuille, quelle cellule.
ThisWorkbook répond à la première et ne change jamais sa réponse. C'est le classeur qui contient le code
que vous exécutez — le fichier où vivent vos modules et vos macros. Ouvrez dix autres classeurs, cliquez à
travers chacun d'eux, et ThisWorkbook pointe toujours vers le même fichier qu'au démarrage de la macro.
ActiveWorkbook répond à la même question par ce qui se trouve au premier plan à cet instant. C'est une
cible mouvante par nature : dès que l'utilisateur clique sur une autre fenêtre, ou que votre propre code
ouvre un nouveau fichier, le classeur actif change. Les deux sont utiles — mais ils ne sont pas
interchangeables, et prendre l'un pour l'autre est à la racine de toute une famille de bugs « ma macro a
modifié le mauvais fichier ».
Trois façons de dire quel objet vous visez
ThisWorkbook est l'un des trois outils que VBA vous donne pour nommer l'objet que vous voulez au lieu
de laisser le code deviner. Ils déterminent si votre macro est fiable ou fragile, et ils sont la colonne
vertébrale de ce court ensemble.
| Outil | Ce qu'il désigne | Quand y recourir |
|---|---|---|
ThisWorkbook |
Le classeur qui contient ce code — fixe | Lire des réglages ou écrire une sortie qui appartient à la macro |
| ActiveWorkbook / ActiveSheet | Ce qui est au premier plan en ce moment — versatile | Un outil générique agissant sur « ce que l'utilisateur a ouvert » |
| Worksheets(...) | Une feuille nommée dans un classeur — la collection | Adresser un onglet précis par nom, index ou CodeName |
La règle qui les relie : une référence non qualifiée saisit ce qui est actif. Écrivez Range("A1") = 1
sans classeur ni feuille devant, et VBA comble les blancs avec le classeur actif et la feuille active à cet
instant. C'est pratique dans la fenêtre Exécution et catastrophique dans une macro enregistrée.
ThisWorkbook face à ActiveWorkbook : le fixe et le versatile
C'est la distinction à graver dans votre mémoire. Imaginez votre macro logée dans Macros.xlsm, et
l'utilisateur a aussi ouvert Sales.xlsx et le regarde quand il appuie sur votre bouton.
Sub FixedVsFickle()
ThisWorkbook.Worksheets(1).Range("A1").Value = "written by the macro"
' ^ atterrit toujours dans Macros.xlsm, le fichier ou vit ce code
ActiveWorkbook.Worksheets(1).Range("A1").Value = "written by the macro"
' ^ atterrit dans Sales.xlsx - car c'est ce que l'utilisateur regardait
End Sub
Un code d'apparence identique, deux fichiers différents. ThisWorkbook est le choix honnête quand la cible
est « le fichier auquel appartient ma macro » — une feuille de réglages, un journal, un onglet de sortie
livré avec l'outil. ActiveWorkbook n'est correct que lorsque vous voulez vraiment dire « ce que
l'utilisateur a amené au premier plan ». Si jamais vous hésitez sur celui que vous vouliez, c'était
ThisWorkbook : c'est celui qui ne peut pas vous surprendre.
Un cousin bon à connaître : ThisWorkbook n'est pas toujours le classeur actif, et ce n'est pas toujours
celui qui a été ouvert en premier. C'est simplement celui qui contient le code. Quand une macro de
Macros.xlsm ouvre Report.xlsx, le nouveau fichier devient ActiveWorkbook, mais ThisWorkbook ne bouge
pas d'un pouce.
Le piège silencieux : ça marche à votre poste et casse au leur
Voici comment le bug est réellement livré. Vous écrivez et testez la macro avec un seul classeur ouvert — le
vôtre. Avec un unique classeur, le classeur actif est votre classeur, si bien qu'un Range("A1") non
qualifié et un Range("A1") qualifié par ThisWorkbook se comportent de façon identique. Chaque test passe.
Puis un collègue la lance avec trois classeurs ouverts. Désormais « actif » désigne ce qu'il regardait, les
écritures non qualifiées atterrissent dans son fichier, et votre macro écrase en silence une cellule d'un
rapport qu'elle n'aurait jamais dû toucher. Aucune erreur n'est levée — le code a fait exactement ce qu'il
disait : « écrire dans ce qui est actif ». Le remède n'est pas un gestionnaire On Error ; c'est de cesser
de laisser le classeur sans nom.
' FRAGILE - depend de ce que l'utilisateur a clique en dernier
Range("A1").Value = total
' FIABLE - nomme le classeur et la feuille, a chaque fois
ThisWorkbook.Worksheets("Summary").Range("A1").Value = total
Qualifiez la référence et la macro se comporte pareil sur chaque poste, quel que soit le nombre de fichiers
ouverts. C'est pourquoi l'habitude la plus précieuse du VBA au niveau classeur est celle-ci : ne laissez
jamais un appel Range ou Cells flotter sans un classeur et une feuille devant lui.
Référencer un autre classeur ouvert par son nom
Parfois vous avez réellement besoin d'un autre classeur — un fichier de données que l'utilisateur a ouvert,
ou un que vous ouvrez vous-même. Ne passez pas par ActiveWorkbook en espérant. Nommez-le, ou gardez-en une
référence.
Sub TalkToAnotherFile()
Dim src As Workbook
' Deja ouvert ? Saisissez-le par son nom de fichier (avec extension)
Set src = Workbooks("Sales.xlsx")
' Pas encore ouvert ? Ouvrez-le et gardez la reference que Open renvoie
Set src = Workbooks.Open("C:\Data\Sales.xlsx")
' Maintenant chaque reference est explicite - aucune devinette de fichier
Debug.Print src.Worksheets("Jan").Range("A1").Value
ThisWorkbook.Worksheets("Summary").Range("A1").Value = _
src.Worksheets("Jan").Range("A1").Value
End Sub
Deux règles rendent cela sûr. D'abord, Workbooks("Sales.xlsx") a besoin du nom du fichier avec son
extension, et le fichier doit déjà être ouvert, sinon il lève Subscript out of range. Ensuite,
Workbooks.Open renvoie le classeur qu'il a ouvert — capturez-le dans une variable avec Set sur la
même ligne, pour ne jamais avoir à demander « lequel est actif maintenant ». Une variable classeur que vous
Set vous-même vaut encore mieux que ThisWorkbook : elle est fixe et explicite sur le fichier que vous
visez.
L'avis : qualifiez tout, prenez ThisWorkbook par défaut
Chaque référence dans une macro devrait nommer son classeur et sa feuille, et le classeur par défaut devrait
être ThisWorkbook. Les références non qualifiées ne sont pas un code plus court qui vaut la peine — ce sont
un pari sur le fait que le bon fichier sera actif à l'instant précis où la ligne s'exécute, et ce pari est
perdu le jour où quelqu'un d'autre lance votre macro avec plus d'un fichier ouvert.
La discipline est minime et elle paie pour toujours : recourez à ThisWorkbook quand la cible appartient à
votre outil, faites Set sur une variable Workbook quand vous visez un autre fichier précis, et réservez
ActiveWorkbook au cas rare où « ce que l'utilisateur a devant lui » est vraiment la bonne cible. Traitez un
simple Range sans classeur devant lui comme une ligne inachevée, exactement comme vous traiteriez une
variable non déclarée.
Quand le vrai travail dépasse le choix du bon classeur
Obtenir la bonne référence est le minimum vital ; le vrai travail est d'habitude la logique par-dessus — rapprocher ces deux fichiers, extraire les lignes du mois dernier, totaliser par région dans la synthèse. Écrire cela à la main, c'est réussir la référence de classeur et la boucle et les cas limites, à chaque fois. ExcelMaster vous laisse décrire le résultat en langage courant — « compare Sales.xlsx à l'onglet de synthèse de ce fichier et signale les lignes qui ne correspondent pas » — et il écrit et exécute le code, en sauvegardant d'abord votre classeur et en qualifiant chaque référence à votre place. Vous indiquez les fichiers que vous visez ; il s'occupe de la plomberie dont parle cet article.
Foire aux questions
Quelle est la différence entre ThisWorkbook et ActiveWorkbook en VBA ?
ThisWorkbook désigne toujours le classeur qui contient le code en cours d'exécution et ne change jamais.
ActiveWorkbook désigne le classeur qui est au premier plan au moment où la ligne s'exécute, ce qui change
dès que l'utilisateur clique sur une autre fenêtre ou que votre code ouvre un nouveau fichier. Utilisez
ThisWorkbook quand vous visez le fichier propre à la macro, et ActiveWorkbook seulement quand vous voulez
vraiment dire « ce que l'utilisateur a devant lui ».
ThisWorkbook est-il toujours le classeur actif ?
Non. ThisWorkbook est le fichier qui contient le code ; le classeur actif est ce qui se trouve au premier
plan. Ils coïncident seulement quand le fichier propre à votre macro est justement celui au premier plan. Dès
qu'un autre classeur devient actif — l'utilisateur l'a cliqué, ou votre macro l'a ouvert — les deux pointent
vers des fichiers différents.
Comment référencer un autre classeur en VBA ?
S'il est déjà ouvert, utilisez Workbooks("Name.xlsx") avec le nom du fichier et son extension. S'il n'est
pas ouvert, utilisez Set wb = Workbooks.Open("C:\chemin\Name.xlsx"), qui renvoie le classeur pour que vous
en gardiez une référence. Qualifiez ensuite chaque référence via cette variable au lieu de vous fier au
classeur actif.
Pourquoi ma macro écrit-elle dans le mauvais classeur ?
Presque toujours parce qu'un appel Range ou Cells n'a aucun classeur devant lui, il atterrit donc sur ce
qui est actif quand la ligne s'exécute. Ça marche tant que vous testez avec un seul fichier ouvert, puis ça
écrit dans le fichier d'un collègue quand plusieurs sont ouverts. Qualifiez la référence avec ThisWorkbook
ou une variable classeur et elle atterrit dans le bon fichier à chaque fois.
ThisWorkbook fonctionne-t-il dans un complément (add-in) ?
Oui, et c'est précisément là qu'il prouve sa valeur. Dans un complément (add-in), ThisWorkbook désigne le
fichier du complément lui-même, tandis que les données de l'utilisateur sont dans un autre classeur. Utilisez
ThisWorkbook pour les ressources propres du complément et une variable classeur définie avec Set (ou
ActiveWorkbook, délibérément) pour les données de l'utilisateur.
Testé dans
Testé dans : Excel 365 (Windows 11), VBA 7.1 — vérifié le 07/09/2026.
Guides associés : VBA ActiveWorkbook · VBA Worksheets · VBA Workbook · VBA Range · VBA Dim
