L'essentiel (TL;DR) — VBA offre deux façons de dire « ce fichier » et elles ne veulent pas dire la même chose.
ThisWorkbookest le classeur où vit votre code — il ne change jamais, quoi que clique l'utilisateur.ActiveWorkbookest la fenêtre au premier plan à l'instant T — il bascule dès que l'utilisateur (ou votre propre macro) change de fichier. Lire et écrire viaActiveWorkbookest la première cause d'une macro qui corrompt ou enregistre le mauvais classeur. Capturez une référence une seule fois —Set wb = ThisWorkbookouSet wb = Workbooks.Open(...)— et ne faites plus jamais confiance à « actif ».
Un Workbook est le sommet du modèle objet : le fichier lui-même, ce qui contient
vos feuilles. Presque toutes les erreurs « ma macro a mis les données dans le mauvais
fichier » viennent d'une seule confusion — traiter le fichier où est mon code et
le fichier au premier plan comme la même chose. Ils ne le sont pas, et c'est dans
cet écart que les données se perdent.
Ce que vous allez apprendre
- La différence exacte entre
ThisWorkbooketActiveWorkbook(et quand chacun convient) - Pourquoi
Workbooks.Openvous remet une référence à capturer aussitôt - Le piège de l'extension dans
Workbooks("Data")derrière « l'indice n'appartient pas à la sélection » - La seule habitude qui fait disparaître les bugs de classeur
Le modèle mental : « le fichier où je vis » vs « le fichier au premier plan »
Voyez ThisWorkbook comme l'adresse du domicile de votre macro — fixe, inscrite à
l'acte. ActiveWorkbook, c'est « là où je me tiens pour l'instant ». Dès que votre
code ouvre un autre fichier, ou que l'utilisateur fait Alt+Tab vers un autre
classeur, « là où je me tiens » se déplace. Votre adresse, non.
Sub TwoMeaningsOfThisFile()
' ThisWorkbook = le fichier contenant CE code. Toujours.
Debug.Print ThisWorkbook.Name ' p. ex. "Reports.xlsm"
' ActiveWorkbook = ce qui est au premier plan à l'instant T.
Debug.Print ActiveWorkbook.Name ' n'importe quel fichier ouvert
' Ouvrir un second fichier — ActiveWorkbook a changé sous vos pieds
Workbooks.Open "C:\data\Sales.xlsx"
Debug.Print ThisWorkbook.Name ' toujours "Reports.xlsm"
Debug.Print ActiveWorkbook.Name ' désormais "Sales.xlsx" <-- déplacé !
End Sub
Pourquoi c'est important : la ligne qui a ouvert Sales.xlsx a changé en silence
ce que pointe ActiveWorkbook. Si les 40 lignes suivantes de votre macro écrivent via
ActiveWorkbook ou un Range(...) non qualifié, elles atterrissent maintenant dans
Sales.xlsx — pas dans le fichier pour lequel vous avez écrit le code. La macro ne
lève aucune erreur. Elle range simplement les données au mauvais endroit.
La règle qui évite les désastres de mauvais fichier
Voici le mode de défaillance dit sans détour : tout code qui dépend de
ActiveWorkbook est à un clic de l'utilisateur — ou à un Workbooks.Open — d'opérer
sur le mauvais fichier. La solution n'est pas d'être prudent. La solution est de ne
plus du tout s'appuyer sur « actif ».
Sub SafeWorkbookHandling()
' Capturez la référence à l'ouverture — n'allez pas la rechercher plus tard
Dim wbSource As Workbook
Set wbSource = Workbooks.Open("C:\data\Sales.xlsx")
' ThisWorkbook pour le fichier où vit la macro
Dim wbReport As Workbook
Set wbReport = ThisWorkbook
' Chaque opération est désormais explicite — aucune ambiguïté, aucun « actif »
wbReport.Worksheets("Summary").Range("A1").Value = _
wbSource.Worksheets("Data").Range("A1").Value
wbSource.Close SaveChanges:=False
End Sub
Workbooks.Open renvoie le classeur qu'il vient d'ouvrir. Le capturer avec
Set wb = Workbooks.Open(...) fait toute la différence entre un code robuste et une
macro qui marche sur votre poste et casse sur celui d'un autre. Même chose pour
Workbooks.Add, qui renvoie le nouveau classeur vierge.
Workbooks("Data") — le piège de l'extension
Vous pouvez saisir un classeur déjà ouvert par son nom dans la collection
Workbooks — mais la règle du nom est subtile et provoque un flot de questions
« l'indice n'appartient pas à la sélection » (erreur d'exécution 9).
Sub WorkbookByName()
' AVANT l'enregistrement, référencez SANS extension :
Dim wb1 As Workbook
Set wb1 = Workbooks("Book1") ' un classeur neuf, non enregistré
' APRÈS l'enregistrement, l'extension est OBLIGATOIRE :
Dim wb2 As Workbook
Set wb2 = Workbooks("Sales.xlsx") ' "Sales" seul -> erreur 9
' Le plus sûr : ne le cherchez pas par nom — gardez la référence
End Sub
Le jugement : chercher un classeur par son nom de chaîne est fragile par conception — ça casse au renommage, à l'enregistrement, sur une faute de frappe. Si vous avez ouvert ou créé le fichier dans la même macro, vous avez déjà la référence. Utilisez-la. Réservez la recherche par nom au cas rare où un autre processus a ouvert le fichier.
Quand ActiveWorkbook est réellement correct
ActiveWorkbook n'est pas interdit — juste étroit. C'est le bon outil quand votre
macro est un utilitaire qui agit sur ce que l'utilisateur regarde — un outil du
classeur de macros personnel, un bouton de complément qui met en forme « ce
fichier ». Dans ce seul scénario, « actif » est exactement ce que vous voulez dire.
Dans une automatisation de production qui ouvre, traite et enregistre des fichiers
précis, une référence ActiveWorkbook est presque toujours un bug latent.
Comment ExcelMaster aide
Beaucoup de VBA de jonglage entre classeurs existe pour une raison : quelqu'un devait
extraire des données d'un fichier vers un autre, régulièrement. ExcelMaster le
fait en langage naturel — vous dites « regroupe ces trois fichiers de ventes dans
l'onglet de synthèse » et il construit la fusion, sans la comptabilité de
Workbooks.Open / ActiveWorkbook qu'on peut rater.
Vous écrirez encore du VBA pour une macro permanente dans un classeur — mais pour les fusions entre fichiers et les consolidations ponctuelles, décrire la tâche bat la gestion manuelle des références de classeur.
Foire aux questions
Quelle est la différence entre ThisWorkbook et ActiveWorkbook ?
ThisWorkbook désigne toujours le classeur qui contient le code en cours
d'exécution — il ne change jamais. ActiveWorkbook désigne le classeur au premier
plan à cet instant, qui change dès que l'utilisateur change de fenêtre ou que votre
code ouvre un autre fichier. Utilisez ThisWorkbook (ou une référence
Set wb = ...) pour la fiabilité.
Pourquoi ai-je « l'indice n'appartient pas à la sélection » sur Workbooks("...") ?
Le nom passé ne correspond à aucun classeur ouvert sous cette clé exacte. Si le
fichier a été enregistré, vous devez inclure l'extension — Workbooks("Sales.xlsx"),
pas Workbooks("Sales"). Mieux encore : gardez la référence depuis l'ouverture
plutôt que de chercher par nom.
Comment référencer un classeur que je viens d'ouvrir ?
Capturez-le sur la même ligne : Set wb = Workbooks.Open("C:\chemin\fichier.xlsx").
Workbooks.Open renvoie l'objet classeur, vous n'avez donc jamais à deviner lequel
est « actif » ensuite.
ExcelMaster remplace-t-il VBA pour combiner des fichiers ?
Pour des fusions ponctuelles et planifiées entre fichiers, oui — vous décrivez la consolidation en langage naturel et ExcelMaster la construit sans comptabilité de classeurs. Pour des macros permanentes intégrées à un classeur, VBA reste adapté.
Testé sur
Testé sur : Excel 365 (Windows 11), VBA 7.1 — dernière vérification le 13/06/2026.
Guides associés : VBA Worksheet · VBA ActiveSheet · VBA Range · VBA Copy Paste · VBA For Loop
