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

VBA AutoFit dans Excel — ajuster colonnes et lignes à leur contenu, de la bonne façon

|

VBA AutoFit dans Excel — ajuster colonnes et lignes à leur contenu, de la bonne façon

TL;DRAutoFit mesure 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. Utilisez Columns("A:D").AutoFit pour la largeur et Rows("1:100").AutoFit pour la hauteur ; quand vous partez d'une plage partielle, passez par .EntireColumn sinon 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 — AutoFit est 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.AutoFit bouge toujours alors que Rows.AutoFit souvent non
  • Ajuster une plage partielle avec .EntireColumn, et toute la feuille avec Cells.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.AutoFitCells 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