TL;DR —
ActiveWorkbookest le classeur au premier plan à l'instant T, etActiveSheetest l'onglet que vous y regardez. Ce sont des cibles mouvantes : dès que l'utilisateur clique ailleurs — ou que votre propre code sélectionne quelque chose — elles changent. Voilà pourquoi le schéma classique des macros enregistrées,Sheets("Jan").SelectpuisSelection.Value = 1, est si fragile. Référencez plutôt la feuille et la cellule directement, et si vous devez utiliser l'objet actif, lisez-le une seule fois dans une variable au lieu d'y recourir ligne après ligne.
Sub ActiveIsAMovingTarget()
' Fragile : selectionne, puis agit sur ce qui est selectionne
Worksheets("Jan").Select
Range("A1").Select
Selection.Value = 100 ' depend entierement du focus
' Fiable : nomme la feuille et la cellule, sans selectionner
ThisWorkbook.Worksheets("Jan").Range("A1").Value = 100
End Sub
Ce que vous allez apprendre
- Le modèle mental — l'objet actif est une cible mouvante, pas une adresse
- Les trois outils pour nommer un objet, et la place de l'objet actif parmi eux
- ActiveWorkbook face à ThisWorkbook, et pourquoi l'actif peut vous surprendre
- L'anti-modèle Select et Activate, et pourquoi l'enregistreur de macros l'enseigne
- Quand agir sur l'objet actif est réellement le bon choix
- L'avis — lisez l'actif une fois, puis référencez directement
Le modèle mental : une cible mouvante, pas une adresse
ActiveWorkbook et ActiveSheet ne sont pas des noms pour un fichier ou un onglet précis. Ce sont des
noms pour une position : « celui qui est au premier plan ». Cette position bouge. Un utilisateur qui clique
sur une autre fenêtre la déplace. Une macro qui ouvre un fichier la déplace. Une ligne de votre propre code
qui appelle .Select ou .Activate la déplace. Parce que la cible bouge, un code qui demande sans cesse
« qu'est-ce qui est actif maintenant ? » demande en réalité « où pointe la souris ? » — et ce n'est pas une
question dont une macro fiable devrait dépendre.
Comparez cela à une adresse. ThisWorkbook.Worksheets("Jan").Range("A1") nomme d'emblée le fichier, la
feuille et la cellule. Peu lui importe ce qui est actif. Tout le savoir-faire du VBA au niveau classeur tient
à préférer les adresses aux positions.
L'objet actif parmi les trois outils de référence
L'objet actif est l'un des trois outils que VBA vous donne pour dire sur quel objet une ligne agit. Savoir lequel est le bon dans chaque cas est la colonne vertébrale de cet ensemble.
| Outil | Ce qu'il désigne | Le piège |
|---|---|---|
| ThisWorkbook | Le classeur qui contient ce code — fixe | Jamais le mauvais fichier, mais jamais un autre fichier non plus |
ActiveWorkbook / ActiveSheet |
Ce qui est au premier plan en ce moment | Bouge dès que le focus bouge — y compris depuis votre propre .Select |
| Worksheets(...) | Une feuille nommée dans un classeur | Vous devez connaître le nom, l'index ou le CodeName |
L'objet actif gagne sa place pour exactement un travail : un outil générique qui doit agir sur « ce que l'utilisateur regarde » — un complément de mise en forme, un utilitaire rapide lié à un bouton. Pour tout ce qui appartient à un fichier précis ou à une feuille précise, une adresse bat l'objet actif à tous les coups.
ActiveWorkbook face à ThisWorkbook : celui qui vous surprend
ActiveWorkbook et ThisWorkbook sont des images en miroir. ThisWorkbook est
fixé au fichier propre de la macro ; ActiveWorkbook suit l'utilisateur. Ils coïncident seulement tant qu'un
unique classeur est ouvert, ce qui est précisément pourquoi la différence se cache pendant les tests et
apparaît en production.
Sub Mirror()
Debug.Print ThisWorkbook.Name ' le fichier avec le code - toujours le meme
Debug.Print ActiveWorkbook.Name ' le fichier au premier plan - n'importe quel fichier ouvert
End Sub
Il y a une seconde surprise à nommer : ActiveWorkbook peut valoir Nothing. Si toutes les fenêtres de
classeur sont masquées, ou si seul l'éditeur VBA est affiché, il n'y a aucun classeur actif et le toucher
lève une erreur. ThisWorkbook existe toujours. En cas de doute sur celui auquel le code devrait se fier,
fiez-vous à celui qui ne peut pas disparaître.
L'anti-modèle Select et Activate
Activez l'enregistreur de macros, cliquez sur un onglet, cliquez sur une cellule, tapez une valeur, et il écrit ceci :
Sheets("Jan").Select
Range("A1").Select
ActiveCell.Value = 100
Toute macro enregistrée est bâtie sur .Select et .Activate car c'est littéralement ce que l'enregistreur
vous regarde faire. Ça marche, alors les débutants le gardent — puis se heurtent à trois problèmes. C'est
lent (chaque sélection redessine l'écran), c'est fragile (chaque ligne suivante s'appuie sur
Selection / ActiveCell, si bien qu'un clic égaré ou un MsgBox qui vole le focus la fait dérailler), et
ça ne peut pas agir sur une feuille que l'utilisateur ne regarde pas sans balader sa vue de force.
Le remède est de sauter entièrement la sélection et de nommer ce que vous visez :
' Anti-modele - selectionne, puis agit sur la selection
Sheets("Jan").Select
Range("A1").Select
Selection.Value = 100
' Direct - une ligne, aucun changement de focus, marche sur n'importe quelle feuille
ThisWorkbook.Worksheets("Jan").Range("A1").Value = 100
Vous n'avez presque jamais besoin de .Select ou .Activate dans du vrai code. Les rares exceptions sont
quand vous voulez laisser l'utilisateur sur une feuille précise à la fin, ou une API qui exige réellement
une sélection. Tout le reste devrait référencer l'objet directement.
Quand agir sur l'objet actif est réellement le bon choix
L'objet actif n'a pas toujours tort — il a tort par défaut. Il a exactement raison quand la macro est un outil générique dont tout le but est « fais ceci sur ce que l'utilisateur a ouvert » : un utilitaire qui met en forme la sélection courante, applique un style maison à la feuille active, ou exporte le classeur de devant en PDF. Dans ces cas, l'objet actif est la cible voulue, et coder en dur un nom de classeur serait le bug.
Même là, lisez-le une seule fois dans une variable en haut et travaillez via cette variable, pour que la cible ne puisse pas glisser en cours de macro :
Sub FormatWhateverIsOpen()
Dim ws As Worksheet
Set ws = ActiveSheet ' capture la cible une fois, maintenant
ws.UsedRange.Font.Bold = False
ws.Range("A1").Value = "Reviewed"
' ...plus rien ici ne depend de ce qui est actif...
End Sub
L'avis : lisez l'actif une fois, puis référencez directement
Ne recourez à ActiveWorkbook ou ActiveSheet que lorsque « ce que l'utilisateur a devant lui » est
vraiment ce que vous voulez dire — et quand c'est le cas, capturez-le dans une variable dès la première ligne
et ne touchez plus jamais l'objet actif en direct. Pour tout le reste, nommez l'objet : ThisWorkbook pour
votre propre fichier, une variable classeur définie avec Set pour un autre fichier précis, et un
Worksheets(...) qualifié pour la feuille. Supprimez .Select et .Activate des macros que l'enregistreur
vous a données ; ils sont le signe le plus clair qu'une macro s'appuie sur le focus au lieu de dire ce
qu'elle veut dire.
Quand vous préféreriez ne pas gérer tout cela à la main
Réécrire une macro enregistrée pour en retirer chaque .Select et qualifier chaque référence est exactement
le genre de nettoyage qui vaut la peine et qui est fastidieux à faire.
ExcelMaster prend le résultat en
langage courant — « mets les totaux du mois dernier sur l'onglet de synthèse de ce fichier, sans changer ce
que l'utilisateur regarde » — écrit le code direct et qualifié, sauvegarde votre classeur et l'exécute. Vous
décrivez le résultat ; il produit un code qui ne dépend jamais de ce qui se trouve être actif.
Foire aux questions
Quelle est la différence entre ActiveWorkbook et ThisWorkbook ?
ActiveWorkbook est le classeur au premier plan au moment où une ligne s'exécute, il change donc au fur et à
mesure que l'utilisateur ou votre code change de focus. ThisWorkbook est le classeur qui contient le code en
cours d'exécution et ne change jamais. Utilisez ThisWorkbook pour le fichier propre à votre macro et
ActiveWorkbook seulement quand vous voulez délibérément dire ce que l'utilisateur a devant lui.
Comment éviter Select et Activate en VBA ?
Référencez l'objet directement au lieu de le sélectionner. Remplacez Range("A1").Select puis
Selection.Value = 1 par un seul ThisWorkbook.Worksheets("Jan").Range("A1").Value = 1. Définissez une
variable Worksheet une fois avec Set et travaillez via elle, pour qu'aucune ligne ne dépende de ce qui
est sélectionné à cet instant.
Pourquoi ActiveSheet est-il risqué dans une macro ?
Parce que c'est une cible mouvante : c'est l'onglet au premier plan quand la ligne s'exécute, ce qui peut
changer si l'utilisateur clique ailleurs ou si votre propre code active autre chose. Une macro qui recourt
sans cesse à ActiveSheet peut agir sur la mauvaise feuille sans la moindre erreur. Capturez-le dans une
variable une fois, ou nommez la feuille directement.
Comment affecter la feuille active à une variable ?
Utilisez Dim ws As Worksheet puis Set ws = ActiveSheet en haut de la macro, et servez-vous de ws
ensuite. Lire la feuille active une seule fois fige votre cible pour qu'elle ne puisse pas glisser en cours de
macro, ce qui est la façon sûre d'utiliser l'objet actif quand c'est vraiment ce que vous voulez dire.
Quand faut-il vraiment utiliser ActiveWorkbook ?
Quand la macro est un outil générique destiné à agir sur ce que l'utilisateur a ouvert — un outil de mise en
forme, un utilitaire rapide, un bouton d'export — plutôt que sur un fichier précis. Dans ces cas,
ActiveWorkbook est la cible voulue ; pour tout ce qui est lié à un fichier particulier, utilisez plutôt
ThisWorkbook ou une variable classeur.
Testé dans
Testé dans : Excel 365 (Windows 11), VBA 7.1 — vérifié le 07/09/2026.
Guides associés : VBA ThisWorkbook · VBA Worksheets · VBA ActiveSheet · VBA Range · VBA Worksheet
