TL;DR —
AutoFitmesure le contenu présent à l'instant où il s'exécute et y fige une taille fixe. C'est un instantané, pas une règle vivante : ajoutez plus tard une valeur plus longue et la colonne est de nouveau tronquée. Sa place est donc sur la dernière ligne de votre macro, après chaque écriture. UtilisezColumns("A:D").AutoFitpour la largeur etRows("1:100").AutoFitpour la hauteur ; quand vous partez d'une plage partielle, passez par.EntireColumnsinon vous n'ajustez qu'une seule ligne. Les cellules fusionnées mettent discrètement en échec l'AutoFit de ligne — c'est la première raison pour laquelle il « ne fait rien ».
' AutoFit mesure ce qui est present MAINTENANT, donc lancez-le APRES avoir ecrit les donnees.
Columns("A:D").AutoFit ' ajuste ces colonnes a leur valeur la plus longue actuelle
Rows("1:100").AutoFit ' ajuste ces lignes (ne grandit que pour du texte renvoye ou haut)
Cells.EntireColumn.AutoFit ' ajuste en une ligne chaque colonne utilisee de la feuille
' Vous partez d'une plage partielle ? Elargissez toute la colonne, pas seulement la plage :
Range("A1:D1").EntireColumn.AutoFit
AutoFit est la version en code du double-clic sur la bordure entre deux en-têtes de colonne — le geste
qui ajuste une colonne pour tenir exactement sa cellule la plus large. C'est l'une des lignes les plus
utilisées de toute macro de génération de rapport, et aussi l'une des plus mal comprises, parce qu'on la
traite comme un réglage qui reste correct. Il ne l'est pas. Dès que vous la voyez comme une mesure
prise à un instant unique, chaque comportement étrange — colonnes tronquées, lignes qui refusent de
grandir, un appel qui semble ne rien faire — tombe sous le sens.
Ce que vous allez apprendre
- Le modèle mental —
AutoFitest une mesure ponctuelle, pas une règle qui ré-ajuste sans cesse - La règle qui évite la plupart des bugs — lancez-le en dernier, après l'écriture des données
- Largeur contre hauteur — pourquoi
Columns.AutoFitbouge toujours alors queRows.AutoFitsouvent non - Ajuster une plage partielle avec
.EntireColumn, et toute la feuille avecCells.EntireColumn.AutoFit - Pourquoi les cellules fusionnées cassent en silence l'AutoFit de ligne
- Quand une largeur fixe que vous maîtrisez vaut mieux que de relancer AutoFit
Le modèle mental : une mesure, pas une règle
Imaginez AutoFit comme une règle graduée posée sur la valeur la plus longue du moment dans une
colonne, dont il verrouille la largeur. C'est toute l'idée — et le mot clé est du moment. AutoFit
n'installe pas une règle qui dirait « sois toujours assez large ». Il lit les cellules une fois, fixe une
largeur, et s'en va. La colonne est désormais une colonne ordinaire à largeur fixe qui se trouve tenir
les données présentes au moment de la mesure.
C'est pourquoi la plainte classique — « j'ai fait un autofit de la colonne mais elle est de nouveau
tronquée » — n'est pas un bug. Vous avez mesuré, puis les données ont changé. Une cellule qui reçoit
ensuite une chaîne plus longue, un nombre plus grand ou un format de date plus large déborde de la
largeur que vous aviez verrouillée, et Excel affiche ####. AutoFit a fait exactement ce que vous lui
avez demandé ; il a simplement posé une question sur le passé. Retenez cela et le reste de l'article
coule de source.
La règle qui compte le plus : AutoFit s'exécute en dernier
Comme AutoFit mesure le contenu actuel, l'erreur de loin la plus fréquente est de le lancer avant que le contenu existe :
Columns("A:D").AutoFit ' FAUX : les colonnes sont encore vides - ajuste sur du vide
' ... code qui ecrit les en-tetes et les donnees dans A:D ...
Ici la macro ajuste quatre colonnes vides à une largeur de cheveu, puis les remplit, et tout est tronqué. Le correctif est une discipline : AutoFit est la dernière chose qu'une macro fait à une plage, jamais la première. Écrivez les en-têtes, écrivez les données, appliquez les formats de nombre, puis AutoFit. Si une routine écrit et met en forme, placez l'appel à AutoFit tout à la fin pour qu'il mesure le produit fini. La même règle vaut à l'intérieur d'une boucle de construction — ne faites pas d'AutoFit sur chaque ligne au fur et à mesure ; écrivez toutes les lignes, puis faites l'AutoFit du bloc en une fois.
La largeur bouge toujours ; la hauteur souvent non
Columns.AutoFit et Rows.AutoFit semblent symétriques mais se comportent différemment, et savoir
pourquoi vous épargne un après-midi. L'AutoFit de colonne mesure la largeur de la valeur la plus longue
et il y a presque toujours quelque chose à ajuster, si bien qu'il bouge visiblement à chaque fois.
L'AutoFit de ligne mesure la hauteur dont le contenu a besoin — et une cellule normale d'une seule
ligne a besoin exactement de la hauteur par défaut, si bien que l'AutoFit de ligne semble « ne rien
faire ».
La hauteur de ligne ne grandit que lorsqu'une cellule est vraiment plus haute qu'une ligne : du texte
avec le renvoi à la ligne activé, du texte avec un saut de ligne forcé (Chr(10)), ou une police plus
grande. C'est le vrai lien entre AutoFit et Renvoyer à la ligne automatiquement
: vous activez le renvoi pour que le texte se répartisse sur plusieurs lignes dans une largeur de
colonne fixe, et alors Rows.AutoFit a une forme plus haute à mesurer et agrandit la ligne pour la
révéler. Faites un autofit de hauteur de ligne sans renvoi et avec une largeur fixe en place, et vous
continuerez à vous demander pourquoi rien ne se passe.
Ajuster une plage partielle, et toute la feuille
AutoFit élargit des colonnes, mais il vous laisse l'appeler depuis une plage — et c'est un piège.
Appelé sur une plage partielle, il ajuste les colonnes en n'utilisant que les cellules de cette plage :
Range("A1:D1").AutoFit ' ajuste A:D en utilisant seulement la ligne 1 - souvent bien trop etroit
Range("A1:D1").EntireColumn.AutoFit ' ajuste A:D en utilisant chaque cellule de ces colonnes
La première ligne ne mesure que la ligne d'en-tête et ignore les données en dessous, si bien que le
résultat est presque toujours trop serré. Passez par .EntireColumn (ou .EntireRow pour les hauteurs)
chaque fois que votre point de départ est un bloc de cellules plutôt qu'une colonne entière. Pour ajuster
la feuille entière en une seule instruction, utilisez Cells.EntireColumn.AutoFit — Cells sans
argument désigne chaque cellule utilisée, et .EntireColumn élève cela à chaque colonne qui contient des
données. C'est la ligne unique et nette sur laquelle finissent la plupart des macros de rapport.
Là où AutoFit ne fait rien en silence : les cellules fusionnées
La panne la plus déroutante n'a rien à voir avec un code erroné. L'AutoFit de ligne ignore les lignes
qui contiennent des cellules fusionnées. C'est une limitation ancienne d'Excel : une cellule fusionnée
peut s'étendre sur plusieurs colonnes, Excel ne peut pas décider quelle colonne devrait absorber la
hauteur, alors il renonce tout simplement à redimensionner la ligne. Activez le renvoi à la ligne dans
une cellule de titre fusionnée, appelez Rows.AutoFit, et la ligne reste haute d'une seule ligne avec le
texte tronqué — aucune erreur, aucun avertissement.
Si un rapport s'appuie sur des cellules fusionnées pour ses en-têtes, vous ne pouvez pas y compter sur
l'AutoFit de ligne ; vous devez définir un RowHeight explicite que vous calculez vous-même, ou éviter
la fusion (un alignement horizontal « centré sur plusieurs colonnes » donne l'aspect sans la fusion).
C'est une raison de plus pour laquelle les cellules fusionnées causent plus
d'ennuis qu'elles n'en valent la peine dans tout ce qu'une macro doit maintenir.
Quand une largeur fixe l'emporte sur AutoFit
AutoFit est parfait pour un instantané final — vous avez construit un rapport, les données sont
arrêtées, et vous voulez dimensionner chaque colonne une fois avant de le transmettre ou de l'exporter.
C'est le mauvais outil pour une feuille vivante. Sur un tableau de bord dont les nombres s'actualisent,
relancer AutoFit à chaque changement fait sautiller les colonnes à mesure que les valeurs grandissent
et rétrécissent, et faire l'AutoFit de milliers de colonnes à chaque modification est réellement lent.
Là, vous voulez une règle, pas un instantané : définissez une
largeur de colonne explicite que vous maîtrisez
(Columns("A:D").ColumnWidth = 14) pour que la disposition reste stable quoi que fassent les données. Le
jugement est simple : AutoFit quand le contenu est terminé et que vous voulez qu'il tienne une fois ;
largeur fixe quand le contenu change sans cesse et que vous voulez que la disposition tienne.
Comment ExcelMaster aide
AutoFit a l'air anodin puis vous coûte discrètement un après-midi — l'appel se trouve au-dessus de
l'écriture au lieu d'en dessous et ajuste des colonnes vides, une plage partielle s'ajuste à la seule
ligne d'en-tête, ou un titre fusionné refuse de grandir et le texte est tronqué dans la copie qui part.
Rien de tout cela ne déclenche d'erreur, alors vous l'apprenez quand quelqu'un voit ####.
ExcelMaster vous laisse dire ce que
vous voulez — « ajuste chaque colonne à ses données », « fais que cette colonne de description se renvoie
à la ligne et grandisse pour tenir » — et il écrit l'AutoFit à la fin de la routine, là où il a sa place,
passe par .EntireColumn quand vous partez d'une plage, associe le renvoi à la ligne à l'AutoFit de
ligne pour que le texte haut s'affiche vraiment, et vous prévient quand une cellule fusionnée signifie
qu'AutoFit ne peut pas faire le travail. Vous gardez le classeur et le code.
Questions fréquentes
Pourquoi mon AutoFit VBA ne fonctionne-t-il pas ?
Presque toujours l'une de ces trois choses. Soit vous avez lancé AutoFit avant d'écrire les données,
il a donc mesuré des cellules vides — déplacez l'appel à la fin de la routine. Soit vous l'avez appelé
sur une plage partielle, il a donc ajusté les colonnes à ces seules quelques cellules — utilisez plutôt
.EntireColumn.AutoFit. Soit la ligne contient une cellule fusionnée, et l'AutoFit de ligne ignore les
lignes fusionnées par conception — définissez-y plutôt un RowHeight explicite.
Comment faire un AutoFit de toutes les colonnes d'une feuille en VBA ?
Utilisez Cells.EntireColumn.AutoFit. Cells sans argument désigne chaque cellule utilisée, et
.EntireColumn élève cela à chaque colonne qui contient des données, si bien que toute la feuille est
ajustée en une ligne. Pour les lignes aussi, ajoutez Cells.EntireRow.AutoFit. Pour le limiter à un
bloc, nommez les colonnes : Columns("A:H").AutoFit.
Quelle est la différence entre Columns.AutoFit et Rows.AutoFit ?
Columns.AutoFit règle la largeur de chaque colonne sur sa valeur la plus longue et bouge visiblement
presque à chaque fois. Rows.AutoFit règle la hauteur de chaque ligne sur le contenu qu'elle doit
montrer, mais une cellule normale d'une seule ligne tient déjà dans la hauteur par défaut, si bien qu'il
ne change quelque chose que lorsqu'une cellule est plus haute — texte renvoyé, saut de ligne forcé, ou
police plus grande. Hauteur de ligne et renvoi à la ligne vont de pair.
Pourquoi AutoFit ne change-t-il pas la hauteur de ligne ?
Parce que le contenu tient encore sur une seule ligne. La hauteur de ligne ne grandit que pour un contenu
vraiment haut. Activez WrapText = True (avec une largeur de colonne fixe pour que le texte ait quelque
chose contre quoi se renvoyer), ou utilisez un saut de ligne forcé, et alors appelez Rows.AutoFit. Si
la ligne contient une cellule fusionnée, AutoFit ne la redimensionnera pas du tout — c'est une limitation
distincte d'Excel.
Faut-il faire un AutoFit ou définir une largeur de colonne fixe ?
AutoFit quand les données sont terminées et que vous voulez dimensionner chaque colonne une fois — un
rapport que vous êtes sur le point d'exporter ou de transmettre. Définissez un ColumnWidth fixe quand
la feuille change sans cesse, comme un tableau de bord qui s'actualise : une largeur fixe garde la
disposition stable, évite que les colonnes sautillent, et est bien plus rapide que de relancer AutoFit
sur de nombreuses colonnes à chaque mise à jour.
Testé dans
Testé dans : Excel 365 (Windows 11), VBA 7.1 — vérifié le 10/09/2026.
Guides connexes : VBA Renvoyer à la ligne · VBA Figer les volets · VBA Largeur de colonne · VBA Fusionner les cellules · VBA Range
