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

VBA Freeze Panes dans Excel — figer les lignes d'en-tête sans figer les mauvaises

|

VBA Freeze Panes dans Excel — figer les lignes d'en-tête sans figer les mauvaises

TL;DRActiveWindow.FreezePanes = True verrouille tout ce qui se trouve au-dessus et à gauche de la cellule active pour que cela reste en place pendant que le reste défile. Deux choses surprennent : le figeage se fait relativement à la cellule sélectionnée, vous devez donc placer la cellule active d'abord (sélectionnez A2 pour figer la ligne 1, B2 pour figer la ligne 1 et la colonne A) ; et il vit sur la fenêtre, pas sur la feuille, ce qui explique pourquoi c'est ActiveWindow.FreezePanes et pourquoi une deuxième fenêtre sur le même fichier a son propre figeage. Désactivez-le avec = False, et défigez avant de re-figer ailleurs.

' FreezePanes fige tout ce qui est au-dessus et a gauche de la cellule ACTIVE.
Application.Goto Range("A2"), Scroll:=True  ' figer la ligne du haut : placer la cellule active EN DESSOUS
ActiveWindow.FreezePanes = True

' Figer la ligne du haut ET la premiere colonne : cellule active en B2
Worksheets("Report").Activate
Range("B2").Select
ActiveWindow.FreezePanes = True

' Defiger :
ActiveWindow.FreezePanes = False

FreezePanes est la version en code de Affichage > Figer les volets — le réglage qui garde votre ligne d'en-tête à l'écran quand vous descendez de mille lignes de données. C'est le seul ajustement d'affichage qui mérite d'être scripté dans chaque macro de rapport, parce qu'il transforme un mur de chiffres en quelque chose de réellement lisible. C'est aussi l'une des rares propriétés VBA où vous devez légitimement toucher à la cellule active et à la fenêtre active, ce qui explique précisément pourquoi elle se comporte d'une manière qui prend les gens au dépourvu.

Ce que vous allez apprendre

  • Le modèle mental — le figeage verrouille un coin de la vue, et vit sur la fenêtre
  • La seule règle qui compte — il fige relativement à la cellule active, placez-la donc d'abord
  • Pourquoi c'est ActiveWindow.FreezePanes et pourquoi chaque Nouvelle fenêtre a son propre figeage
  • Le désactiver, et pourquoi vous devez défiger avant de re-figer
  • FreezePanes face à Split, et une voie sans sélection via SplitRow
  • Où le figeage a sa place dans une macro de rapport — en dernier, sur la feuille que vous venez de construire

Le modèle mental : verrouiller un coin de la vue

Figer les volets ne change ni les données, ni la feuille, ni la moindre cellule — cela change la fenêtre à travers laquelle vous regardez. Imaginez la grille découpée en quatre quadrants par une ligne horizontale et une ligne verticale. Le quadrant en haut à gauche est épinglé ; les trois autres défilent en dessous. FreezePanes trace ces lignes et épingle le coin. C'est toute l'idée, et elle emporte deux conséquences qui expliquent tout le reste : la césure doit être positionnée quelque part, et elle appartient à la fenêtre, parce que c'est la fenêtre qui fait défiler.

Retenez « c'est un réglage d'affichage sur la fenêtre », et les deux surprises classiques — figer les mauvaises lignes et le figeage qui ne tient pas — cessent d'être des mystères.

La règle qui compte le plus : il fige à la cellule active

Voici l'erreur derrière presque tous les bugs « il a figé les mauvaises lignes ». FreezePanes ne prend ni numéro de ligne ni plage. Il fige tout ce qui se trouve au-dessus et à gauche de la cellule qui est active au moment où vous le définissez. La cellule active est donc la commande, et si vous ne la placez pas, vous figez là où le curseur se trouvait par hasard :

ActiveWindow.FreezePanes = True   ' fige a la selection actuelle - ou qu'elle se trouve

La règle est de placer la cellule active juste en dessous et à droite de ce que vous voulez figer, puis de définir la propriété :

  • Figer la ligne du haut → sélectionnez A2 (tout ce qui est au-dessus de la ligne 2 est figé).
  • Figer la première colonne → sélectionnez B1.
  • Figer à la fois la ligne du haut et la première colonne → sélectionnez B2.

C'est pourquoi la macro enregistrée montre toujours un Range(...).Select juste avant ActiveWindow.FreezePanes = True. Le figeage est l'un des rares cas où sélectionner une cellule n'est pas un défaut de style — la sélection est l'argument. Réglez correctement la cellule active et le figeage atterrit exactement où vous le voulez.

Il vit sur la fenêtre, pas sur la feuille

Remarquez l'objet : ActiveWindow.FreezePanes, jamais Worksheet.FreezePanes. Le figeage est une propriété de la fenêtre à travers laquelle vous voyez une feuille — et une feuille peut être affichée dans plusieurs fenêtres. Ouvrez Affichage > Nouvelle fenêtre sur le même classeur et vous obtenez une deuxième fenêtre avec son propre état de figeage ; l'une peut avoir la ligne du haut figée et l'autre non. C'est pourquoi un figeage peut sembler « ne pas tenir » : vous l'avez défini sur une fenêtre et vous en regardez une autre.

Pour une macro, la conséquence pratique est que la feuille que vous voulez figer doit être active dans la fenêtre que vous configurez — vous ne pouvez pas figer de façon fiable les volets d'une feuille que l'utilisateur ne regarde pas. Cela fait de FreezePanes l'un des rares endroits où recourir à ActiveWindow et Activate est correct plutôt que paresseux : la fenêtre est réellement ce que vous configurez. Activez la feuille, placez la cellule active, définissez la propriété.

Le désactiver et re-figer

Défiger est une simple affectation :

ActiveWindow.FreezePanes = False

La subtilité, c'est le re-figeage. Mettre FreezePanes = True alors que les volets sont déjà figés ne fait rien — Excel ne déplace pas un figeage existant vers la nouvelle cellule active. Pour déplacer un figeage, vous devez donc l'effacer d'abord, replacer la cellule active, puis le redéfinir :

ActiveWindow.FreezePanes = False   ' effacer l'ancien figeage
Range("C3").Select                 ' repositionner
ActiveWindow.FreezePanes = True    ' figer au nouveau coin

Sautez la ligne = False et votre « nouveau » figeage est ignoré tandis que l'ancien reste en silence. Faites du défigeage la première étape chaque fois qu'une macro réapplique un figeage qu'elle a pu poser lors d'une exécution précédente.

FreezePanes face à Split, et une voie sans sélection

FreezePanes verrouille les volets solidement. ActiveWindow.Split (avec SplitRow et SplitColumn) crée à la place des barres de fractionnement déplaçables — les volets sont séparés mais l'utilisateur peut les redimensionner, et ils ne se verrouillent pas. La plupart des macros de rapport veulent un figeage, pas un fractionnement. Mais les propriétés de fractionnement vous donnent une façon nette de figer sans sélectionner de cellule, ce que certains préfèrent pour la lisibilité :

ActiveWindow.SplitRow = 1        ' fractionner sous la ligne 1
ActiveWindow.SplitColumn = 1     ' fractionner apres la colonne A
ActiveWindow.FreezePanes = True  ' transformer le fractionnement en figeage - aucun Select requis

Définir SplitRow/SplitColumn puis FreezePanes = True fige à la position de fractionnement, si bien que vous ne touchez jamais à la cellule active. Les deux styles conviennent ; utilisez celui qui vous paraît le plus clair. La version sans sélection évite de laisser l'utilisateur sur une cellule inattendue après l'exécution de la macro.

Où le figeage a sa place dans une macro de rapport

Le figeage est une touche finale, il vient donc en dernier — après avoir écrit les données, appliqué les formats de nombre et lancé l'AutoFit. Figer tôt puis insérer ou supprimer des lignes peut déplacer l'endroit où atterrit le figeage. Le motif fiable est : construisez la feuille, dimensionnez-la, activez la feuille que vous avez construite, placez la cellule active (ou définissez le fractionnement), puis ActiveWindow.FreezePanes = True. Ne vous fiez pas au Range("A2").Select codé en dur qu'un enregistreur a écrit sur une autre disposition de feuille — décidez le coin de figeage à partir du rapport que vous avez réellement généré, et placez-y la cellule active délibérément.

Comment ExcelMaster aide

Figer les volets est le réglage qui rend un rapport généré utilisable d'un coup d'œil, et aussi celui qui fige discrètement de la ligne 1 à la ligne 40 parce que la cellule active était à un endroit inattendu, ou qui semble ne pas fonctionner parce qu'il a été défini sur la mauvaise fenêtre, ou qui refuse de bouger parce que l'ancien figeage n'a jamais été effacé.

ExcelMaster vous laisse dire ce que vous voulez garder à l'écran — « fige la ligne d'en-tête », « verrouille les deux premières colonnes et la ligne du haut » — et il écrit le figeage comme dernière étape de la routine : il active la bonne feuille, place la cellule active (ou définit SplitRow/SplitColumn pour un figeage sans sélection) pour que la césure atterrisse exactement où vous l'entendiez, et efface tout ancien figeage avant d'en appliquer un nouveau. Vous gardez le classeur et le code.

Questions fréquentes

Pourquoi VBA fige-t-il les mauvaises lignes ?

Parce que FreezePanes fige relativement à la cellule active, pas à un numéro de ligne, et que la cellule active n'était pas là où vous le pensiez. Il verrouille tout ce qui se trouve au-dessus et à gauche de la sélection. Placez la cellule active d'abord — sélectionnez A2 pour figer la ligne du haut, B2 pour figer la ligne du haut et la première colonne — puis définissez ActiveWindow.FreezePanes = True.

Comment figer la ligne du haut en VBA ?

Faites de A2 la cellule active (une ligne sous l'en-tête), puis figez : Range("A2").Select suivi de ActiveWindow.FreezePanes = True. Ou sautez complètement la sélection avec ActiveWindow.SplitRow = 1 puis ActiveWindow.FreezePanes = True. La feuille doit être active dans la fenêtre que vous configurez.

Comment défiger les volets en VBA ?

Mettez la propriété à False : ActiveWindow.FreezePanes = False. Notez que pour déplacer un figeage vous devez d'abord défiger — mettre FreezePanes = True alors que les volets sont déjà figés ne fait rien, alors effacez l'ancien figeage, replacez la cellule active, puis redéfinissez-le.

Pourquoi ActiveWindow.FreezePanes ne fonctionne-t-il pas ?

Généralement l'une de ces trois choses. La feuille que vous voulez figer n'est pas active dans la fenêtre courante — activez-la d'abord. Ou les volets sont déjà figés, si bien que remettre True est ignoré — mettez False, repositionnez, puis True. Ou vous regardez une fenêtre différente de celle que vous avez configurée : le figeage est une propriété par fenêtre, et Nouvelle fenêtre crée une deuxième fenêtre avec son propre état.

FreezePanes est-il sur la feuille de calcul ou sur la fenêtre ?

La fenêtre. C'est ActiveWindow.FreezePanes, pas une propriété de feuille de calcul, parce que le figeage configure la façon dont une fenêtre défile sur une feuille. La même feuille affichée dans deux fenêtres (via Affichage > Nouvelle fenêtre) peut avoir des états de figeage différents. C'est aussi pourquoi la feuille doit être active dans la fenêtre que vous configurez.

Testé dans

Testé dans : Excel 365 (Windows 11), VBA 7.1 — vérifié le 10/09/2026.

Guides connexes : VBA AutoFit · VBA Renvoyer à la ligne · VBA Worksheets · VBA Largeur de colonne · VBA Range