TL;DR — L'Immediate Window (ouvrez-la avec Ctrl+G) est là où atterrit la sortie de
Debug.Printet une console vivante où vous tapez une ligne de VBA et l'exécutez à l'instant.? exprest un raccourci pourPrint expr: il évalue l'expression et affiche le résultat. Vous pouvez lire une valeur, changer une valeur, appeler unSub, ou exécuter une boucle d'une ligne — le tout sans toucher à votre code. Deux choses à savoir : une requête?exécute réellement le code (effets de bord compris), et vos variables locales ne sont vivantes que pendant que la macro est en pause à un breakpoint.
? Range("A1").Value ' lit une valeur (? est un raccourci pour Print)
Range("A1").Value = 42 ' ecrit une valeur, en direct
? ActiveSheet.Name ' inspecte l'environnement
? Cells(Rows.Count, 1).End(xlUp).Row ' teste une expression avant de vous engager
MyMacro ' appelle un Sub par son nom, tout de suite
For i = 1 To 3 : ? i * i : Next ' une boucle d'une ligne : 1 4 9
Ce que vous allez apprendre
- Le modèle mental — l'Immediate Window est une console interactive, pas seulement un journal
- Les trois observateurs, de puissance croissante, et où celui-ci se place
- Ce que fait vraiment le raccourci
?, et pourquoi il exécute votre code - Pourquoi vos variables locales se lisent comme vides tant que la macro n'est pas en pause
- Comment appeler un Sub, changer l'état, et boucler à la main depuis une seule ligne
- Quand cesser de titiller la console et mettre la logique dans un module
Le modèle mental : une console vivante, pas seulement un journal
La plupart des gens rencontrent l'Immediate Window comme l'endroit où Debug.Print écrit. C'est la
moitié de l'histoire. L'autre moitié, c'est que vous pouvez y taper — n'importe quelle ligne de VBA —
et elle s'exécute à l'instant où vous appuyez sur Entrée, en utilisant l'état vivant d'Excel et de
votre macro en pause. C'est un REPL : une boucle lire-évaluer-afficher greffée sur votre classeur.
La bonne question à se poser n'est donc pas « où est passé mon Debug.Print ? » — c'est « qu'est-ce que je
veux demander ou changer maintenant ? ». Debug.Print est une ligne que vous avez écrite plus tôt
et qui s'exécute quand le code s'exécute ; l'Immediate Window est une ligne que vous tapez cette
seconde. Cette différence — programmé d'avance contre interactif — est toute la raison d'y recourir :
c'est la façon la plus rapide de tester une intuition sans toucher à votre source.
Les trois observateurs, de puissance croissante
L'Immediate Window est le barreau du milieu d'une échelle. Quand une macro se comporte mal, ce ne sont pas les indices qui vous manquent, c'est un moyen de demander. VBA vous en donne trois, chacun répondant à une question différente :
| Observateur | La question à laquelle il répond | Son mensonge caractéristique |
|---|---|---|
Debug.Print |
Quelles étaient les valeurs pendant l'exécution ? | Imprime dans une fenêtre fermée par défaut |
| Immediate Window | Qu'est-ce qui est vrai à l'instant, à cette pause ? | Une requête ? exécute réellement le code |
| Breakpoint + F8 | Sur quelle ligne cela dérape-t-il ? | Ils disparaissent à la fermeture du classeur |
Debug.Print vous montre le passé ; un breakpoint fige la ligne présente, une
à une. L'Immediate Window se tient entre les deux : elle vous laisse interroger le présent. Mettez une
macro en pause sur un breakpoint, puis posez-lui des questions — ? total, ? cells(r, 1).Value,
? Selection.Address — et obtenez les réponses depuis l'état exact où se trouve votre code. Cette
interactivité est sa force et, comme le montre la section suivante, son piège.
Piège 1 : la requête ? exécute réellement le code
? expr ne « prévisualise » pas l'expression — il l'évalue. Pour une simple lecture de valeur, c'est
exactement ce que vous voulez. Pour tout ce qui a des effets de bord, « juste regarder » est une vraie
exécution :
? Range("A1").Value ' sur - lit une valeur
? DeleteOldRows() ' PAS sur - execute DeleteOldRows et supprime des lignes
DeleteOldRows ' l'execute aussi - un nom de Sub nu s'execute
La console n'a aucun mode simulation. Taper ? SomeFunction() pour « voir ce qu'elle renvoie » exécute
la fonction, valide ses écritures, déplace le curseur, enregistre le fichier — quoi qu'elle fasse. Gardez
vos requêtes ponctuelles à des lectures pures (.Value, .Address, .Count, une variable) et ne faites
jamais passer par ? une fonction à effets de bord juste pour inspecter son résultat. Si vous avez
besoin de la valeur de retour d'une chose qui mute aussi l'état, vous tenez déjà une conception qui
mérite qu'on s'y arrête.
Piège 2 : les variables locales sont vides tant que la macro n'est pas en pause
C'est celui qui fait croire que l'Immediate Window est cassée. Tapez ? myTotal quand rien ne tourne et
vous obtenez 0 ou une ligne blanche — pas la valeur que vous avez vue il y a un instant.
Sub Calc()
Dim myTotal As Double
myTotal = 1234.5
Stop ' pause ici, ENSUITE ? myTotal affiche 1234.5
End Sub
' Tapez ? myTotal sans macro en pause -> vide. La locale n'existe plus.
Une variable déclarée avec Dim à l'intérieur d'un Sub n'existe que pendant que ce Sub s'exécute,
et vous ne pouvez la lire que pendant que la macro est en pause en break mode dans ce Sub — à un
breakpoint ou un Stop. Une fois le Sub terminé (ou avant qu'il ne démarre), la locale a disparu, et la
console n'a donc rien à montrer. Deux contournements : mettez la macro en pause sur un
breakpoint et interrogez pendant qu'elle tient, ou promouvez la variable au
niveau du module (déclarez-la en haut du module), où elle persiste entre les exécutions et où
l'Immediate Window peut toujours la lire.
Piège 3 : les références non qualifiées s'appliquent à ce qui est actif
Une ligne que vous tapez dans la console n'a pas de Sub hôte, donc les références nues se résolvent sur l'objet actif, qui n'est peut-être pas celui auquel vous pensez :
? Range("A1").Value ' lit A1 de la feuille ACTIVE - laquelle est-ce ?
? ThisWorkbook.Sheets("Data").Range("A1").Value ' sans ambiguite
Si vous avez basculé vers une autre feuille pour regarder vos données, Range("A1") lit maintenant
cette feuille. Quand la réponse vous surprend, qualifiez pleinement la référence avec le classeur et la
feuille avant de conclure que votre macro est fausse.
Immediate Window contre Debug.Print
Même fenêtre, flux de travail opposés :
| Immediate Window | Debug.Print |
|
|---|---|---|
| Comment vous l'employez | Tapez une ligne, elle s'exécute maintenant | Écrit dans le code, s'exécute quand le code s'exécute |
| Idéal pour | Un « qu'est-ce que X en ce moment ? » ponctuel | Une journalisation répétée prévue d'avance |
| Interactif ? | Oui — lire, écrire, appeler, boucler | Non — il ne fait qu'émettre |
| Survit à l'exécution ? | Non, c'est vivant et ponctuel | Les lignes restent dans votre source |
Utilisez Debug.Print quand vous savez à l'avance quelles valeurs surveiller à chaque exécution de la
macro. Utilisez l'Immediate Window quand vous êtes en pleine enquête et voulez poser une question que
vous n'aviez pas anticipée — et pour lancer de petites expériences : appelez un Sub avec
MySub arg1, arg2 (sans parenthèses) ou Call MySub(arg1, arg2), reformatez une cellule, ou vérifiez
? Application.WorksheetFunction.Sum(Range("B:B")) avant de le figer dans une formule.
L'avis : c'est une console, pas un éditeur
L'Immediate Window est le testeur d'hypothèses le plus rapide de l'éditeur VBA, et le préfixe ? — juste
une abréviation de Print — est la frappe la plus utile que la plupart des gens n'apprennent jamais.
Appuyez-vous dessus sans retenue pour sonder : vérifiez une hypothèse, titillez une valeur, confirmez
qu'un Range se résout comme vous l'attendez avant d'écrire dix lignes qui en dépendent.
Mais c'est une console, et le travail en console est jetable. Tout ce que vous tapez qui se révèle
important a sa place dans un module, pas dans une expérience d'une ligne que vous perdrez à l'instant où
vous viderez le panneau. Et traitez ? comme une arme chargée : dans un endroit où évaluer, c'est
exécuter, faites de « je ne lis qu'ici » une habitude, pour qu'un « laisse-moi juste vérifier ce que ça
renvoie » sans réfléchir ne supprime jamais discrètement une centaine de lignes.
Quand tout le travail est de vérifier votre logique — décrivez-le plutôt
La moitié du temps, le travail en console est en réalité une seule question posée encore et encore —
« cette règle tient-elle pour chaque ligne ? ». Titiller ? Cells(r, 5).Value une cellule à la fois y
répond pour la ligne r et aucune autre, et vous revoilà à deviner quel r compte.
ExcelMaster vous laisse
poser la version colonne entière en langage courant — « montre-moi chaque ligne où la marge est sous
10 pour cent » — et il écrit du Python qui lit la feuille, sauvegarde d'abord le fichier, évalue la règle
sur toutes les données, et renvoie les lignes qui échouent. L'Immediate Window vérifie une valeur à la
fois ; décrivez le contrôle et obtenez toute la réponse d'un coup.
Foire aux questions
Qu'est-ce que l'Immediate Window en VBA ?
C'est un panneau interactif de l'éditeur VBA (ouvrez-le avec Ctrl+G) qui fait deux travaux : il
affiche la sortie de Debug.Print, et il fait office de console vivante où vous tapez une seule ligne de
VBA et l'exécutez immédiatement contre l'état courant d'Excel et de toute macro en pause.
Que signifie le ? dans l'Immediate Window ?
? est un raccourci pour l'instruction Print. ? expr évalue l'expression et imprime le résultat,
donc ? Range("A1").Value imprime la valeur de A1 et ? 6 * 7 imprime 42. C'est la façon la plus
rapide d'inspecter quoi que ce soit pendant que vous travaillez.
Pourquoi ne vois-je pas la valeur de ma variable dans l'Immediate Window ?
Une variable déclarée avec Dim à l'intérieur d'un Sub n'existe que pendant que ce Sub tourne, et vous
ne pouvez la lire que pendant que la macro est en pause en break mode dans ce Sub. Si rien n'est en
pause, ? myVar n'affiche rien. Posez un breakpoint et mettez en pause là, ou déclarez la variable au
niveau du module pour qu'elle persiste.
Puis-je lancer une macro depuis l'Immediate Window ?
Oui. Tapez le nom du Sub et appuyez sur Entrée. Pour un Sub qui prend des arguments, utilisez
MySub arg1, arg2 sans parenthèses, ou Call MySub(arg1, arg2) avec. Les fonctions s'exécutent de la
même façon, et ? MyFunction(3) imprime la valeur de retour.
Comment vider l'Immediate Window ?
Cliquez dedans, appuyez sur Ctrl+A pour tout sélectionner, puis Delete. Il n'existe aucune commande
VBA pour la vider par programme — c'est un panneau de développeur, pas quelque chose que votre macro
contrôle à l'exécution.
Testé dans
Testé dans : Excel 365 (Windows 11), VBA 7.1 — vérifié le 05/09/2026.
Guides associés : VBA Debug.Print · VBA Breakpoint · VBA MsgBox · VBA Sub · VBA Dim
