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

VBA ThisWorkbook dans Excel — pourquoi ce n'est pas la même chose qu'ActiveWorkbook

|

VBA ThisWorkbook dans Excel — pourquoi ce n'est pas la même chose qu'ActiveWorkbook

TL;DRThisWorkbook dé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. ActiveWorkbook désigne ce qui est au premier plan à l'instant T, et cela peut changer sous vos pieds. Un simple Range("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 sur ThisWorkbook (ou une variable classeur que vous Set vous-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