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

VBA Column Width & Row Height dans Excel — redimensionner et AutoFit en code (et les unités qui vous piègent)

|

VBA Column Width & Row Height dans Excel — redimensionner et AutoFit en code (et les unités qui vous piègent)

En bref — Le dimensionnement est une propriété de la colonne ou de la ligne entière, et les deux dimensions utilisent des unités différentes : ColumnWidth est en caractères de la police Normal, RowHeight est en points. Ainsi ColumnWidth = 10 et RowHeight = 10 ne représentent en aucun cas la même taille. AutoFit est le piège — il ne s'exécute que sur une colonne ou une ligne entière (Columns("A:C").AutoFit ou rng.EntireColumn.AutoFit), et il mesure le texte affiché, donc il ignore silencieusement les cellules fusionnées.

Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Report")
ws.Columns("A:C").AutoFit                 ' ajuste A:C a leur contenu le plus large
ws.Columns("D").ColumnWidth = 18          ' 18 caracteres de la police Normal
ws.Rows(1).RowHeight = 28                 ' 28 points

Redimensionner a l'air de la chose la plus simple de la famille du formatage, et ça l'est le plus souvent — jusqu'à ce qu'un AutoFit ne fasse rien, ou qu'une largeur que vous avez définie ne corresponde pas à celle que vous attendiez. Les deux viennent de la même racine, l'idée sur laquelle repose ce guide : vous dimensionnez la colonne ou la ligne entière, et la largeur et la hauteur parlent des unités différentes. Assimilez cela, et la propriété .Width en lecture seule, les règles d'AutoFit et la confusion « pourquoi ça ne se masque pas » se résolvent toutes.

Ce que vous allez apprendre

  • Le modèle mental — vous dimensionnez la colonne ou la ligne entière, en deux unités différentes
  • La règle la plus importante — AutoFit a besoin d'une colonne ou d'une ligne entière, et mesure l'affichage
  • ColumnWidth (caractères) face à la propriété .Width en lecture seule (points)
  • RowHeight, le retour à la ligne, et quand une ligne grandit d'elle-même
  • L'angle mort d'AutoFit — les cellules fusionnées
  • Masquer une colonne correctement, et pourquoi une largeur de zéro est un piège

Le modèle mental : vous dimensionnez la colonne ou la ligne entière, en deux unités

La largeur et la hauteur n'appartiennent pas à une cellule — elles appartiennent à la colonne et à la ligne où elle se trouve. Vous pouvez les atteindre depuis une cellule, mais la valeur s'applique à l'ensemble de la colonne ou de la ligne :

ws.Range("D5").EntireColumn.ColumnWidth = 18   ' elargit TOUTE la colonne D, pas seulement D5
ws.Range("D5").EntireRow.RowHeight = 28        ' rehausse TOUTE la ligne 5

La seconde moitié du modèle, ce sont les unités, et c'est la partie qui piège les gens. ColumnWidth se mesure en caractères — précisément, combien de chiffres 0 de la police de style Normal tiennent dans la colonne (la valeur par défaut 8.43 correspond à environ huit zéros). RowHeight se mesure en points, la même unité de 1/72 de pouce que la taille de police. Les deux nombres ne sont pas comparables, et il n'existe aucune conversion propre entre eux car l'un dépend de la police et l'autre non. Quand une disposition semble fausse, c'est très souvent une valeur de largeur raisonnée comme s'il s'agissait de points.

La règle la plus importante : AutoFit a besoin d'une colonne ou d'une ligne entière

AutoFit est le moyen le plus rapide de dimensionner au contenu, et il a une exigence ferme : il doit être appelé sur une colonne entière ou une ligne entière, jamais sur une plage de cellules arbitraire.

ws.Columns("A:C").AutoFit          ' OK - colonnes entieres
ws.Rows("1:5").AutoFit             ' OK - lignes entieres
ws.Range("A1:C5").EntireColumn.AutoFit   ' OK - d'abord promu en colonnes entieres

ws.Range("A1:C5").AutoFit          ' FAUX - un bloc de cellules n'est ni une ligne ni une colonne -> error 1004

La solution est toujours la même : promouvoir d'abord la plage en lignes ou colonnes entières avec .EntireColumn ou .EntireRow. La seconde moitié de la règle est plus subtile — AutoFit mesure ce qui est affiché, pas ce qui est stocké. Il dimensionne au texte rendu le plus large, si bien qu'une colonne de nombres affichés sous la forme "0" s'ajuste à 5, pas au 5.4999 sous-jacent ; et une colonne dont le contenu est caché derrière un NumberFormat étroit s'ajuste au format, pas à la valeur.

ColumnWidth face à la propriété Width en lecture seule

Il existe deux propriétés de largeur, et une seule est définissable — source fréquente de la confusion « pourquoi ça ne compile pas » :

  • ColumnWidth est définissable, mesurée en caractères. C'est celle à laquelle vous affectez une valeur.
  • .Width est en lecture seule, mesurée en points. Elle vous indique la largeur rendue d'une plage à l'écran, mais vous ne pouvez pas lui affecter de valeur — Columns("A").Width = 100 échoue.
ws.Columns("A").ColumnWidth = 20          ' definir - caracteres
Debug.Print ws.Columns("A").Width          ' lire - points (un nombre different)

Si vous devez dimensionner une colonne à un nombre précis de points ou de pixels, il n'y a pas de setter direct ; vous réglez ColumnWidth en caractères, puis relisez .Width et ajustez dans une courte boucle jusqu'à ce que les points correspondent. C'est fastidieux par conception — la largeur de colonne d'Excel a toujours été une mesure en caractères, et .Width a été greffée après coup comme une commodité en lecture seule.

RowHeight et le retour à la ligne

RowHeight en points est simple, avec un comportement à connaître : quand une cellule a le retour à la ligne activé, Excel augmente automatiquement la hauteur de ligne pour tenir les lignes renvoyées — sauf si vous avez défini un RowHeight explicite, qui la fige et peut tronquer le texte :

ws.Range("B2").WrapText = True     ' laisser le texte long se renvoyer sur plusieurs lignes
ws.Rows(2).EntireRow.AutoFit       ' agrandir la ligne pour tenir le texte renvoye
' NE definissez PAS ensuite Rows(2).RowHeight = 15 - cela la fige et tronque le renvoi

Règle empirique : si vous voulez qu'une ligne tienne un contenu renvoyé, activez WrapText et laissez AutoFit (ou la croissance automatique d'Excel) la dimensionner. Définir un RowHeight fixe ensuite l'emporte sur cela, et c'est ainsi que le texte renvoyé finit coupé.

L'angle mort d'AutoFit : les cellules fusionnées

Voici celui qui fait perdre le plus de temps, et il renvoie directement à VBA Merge Cells : AutoFit ignore les cellules fusionnées. Une ligne dont le seul contenu haut est une cellule fusionnée et renvoyée ne grandira pas pour le contenir — AutoFit mesure les cellules non fusionnées et ne voit rien qui réclame la hauteur supplémentaire, si bien que le texte reste tronqué. C'est une raison de plus pour laquelle les cellules fusionnées posent problème en code : elles font échouer la commande même vers laquelle vous vous tourneriez pour les rendre lisibles. Si vous devez garder un bloc fusionné et renvoyé, définissez son RowHeight explicitement (mesurez le texte et calculez la hauteur vous-même) ; mieux, évitez la fusion et utilisez Center Across Selection, qu'AutoFit peut voir.

Masquer une colonne : pas une largeur de zéro

Un raccourci tentant pour masquer une colonne consiste à mettre sa largeur à zéro. Résistez — utilisez la propriété .Hidden, traitée dans VBA Hide Columns :

ws.Columns("B").Hidden = True      ' la bonne facon - reversible, evidente, restaure son ancienne largeur
ws.Columns("B").ColumnWidth = 0    ' le piege - "masquee" mais vous avez perdu la largeur d'origine

Hidden = True mémorise la vraie largeur de la colonne et la restaure quand vous la réaffichez. ColumnWidth = 0 jette cette largeur — la réafficher plus tard revient à deviner ce qu'elle valait — et une colonne de largeur nulle est facile à manquer quand quelqu'un se demande plus tard pourquoi des données semblent absentes. La largeur sert à dimensionner ; utilisez Hidden pour la visibilité.

Comment ExcelMaster aide

Le dimensionnement cache plus de pièges qu'il n'y paraît : deux unités différentes pour la largeur et la hauteur, un AutoFit qui échoue sur une plage de cellules et saute en silence les cellules fusionnées, une .Width que vous pouvez lire mais pas définir, et un « masquage » par largeur nulle qui perd la taille d'origine. Chacun échoue en silence — texte tronqué, nombre inattendu, ou colonne qui ne revient plus.

ExcelMaster vous laisse dire ce que la disposition doit faire. Demandez-lui d'« ajuster automatiquement les colonnes A à C et de donner un peu d'air à la ligne 1 », et il promeut la plage en EntireColumn avant d'appeler AutoFit, règle RowHeight en points, active WrapText là où le texte doit s'étaler, et masque les colonnes avec .Hidden plutôt qu'une largeur nulle. Vous gardez le classeur et le code ; vous vous épargnez la disposition sortie tronquée parce qu'AutoFit n'a jamais vu la cellule fusionnée.

Questions fréquentes

Comment définir la largeur de colonne et la hauteur de ligne en VBA Excel ?

Affectez ColumnWidth et RowHeight sur des colonnes et des lignes entières : Columns("A").ColumnWidth = 20 et Rows(1).RowHeight = 28. Rappelez-vous que les unités diffèrent — ColumnWidth est en caractères de la police Normal, RowHeight est en points — donc le même nombre désigne des tailles différentes pour chacune. Depuis une cellule, utilisez Range("A1").EntireColumn.ColumnWidth pour dimensionner toute la colonne.

Comment faire un AutoFit des colonnes en VBA ?

Appelez AutoFit sur une colonne ou une ligne entière : Columns("A:C").AutoFit ou Range("A1:C5").EntireColumn.AutoFit. Appeler AutoFit sur une simple plage de cellules comme Range("A1:C5").AutoFit lève error 1004, car AutoFit ne fonctionne que sur des colonnes ou des lignes entières. Promouvez d'abord la plage avec .EntireColumn ou .EntireRow.

Pourquoi AutoFit ne fonctionne-t-il pas sur mes cellules fusionnées ?

AutoFit ignore les cellules fusionnées — il ne mesure que le contenu non fusionné, si bien qu'une ligne dont le contenu haut se trouve dans une cellule fusionnée et renvoyée ne grandira pas pour le contenir et le texte reste tronqué. Définissez le RowHeight explicitement pour cette ligne, ou évitez la fusion et utilisez Center Across Selection, qu'AutoFit peut mesurer.

Quelle est la différence entre ColumnWidth et Width en VBA ?

ColumnWidth est définissable et mesurée en caractères de la police Normal — c'est la propriété à laquelle vous affectez une valeur. .Width est en lecture seule et mesurée en points ; elle rapporte la largeur rendue mais vous ne pouvez pas la définir. Pour dimensionner à un nombre précis de points, réglez ColumnWidth en caractères, puis relisez .Width et ajustez jusqu'à ce qu'elle corresponde.

Dois-je mettre la largeur de colonne à zéro pour masquer une colonne en VBA ?

Non. Utilisez Columns("B").Hidden = True, qui masque la colonne de façon réversible et restaure sa largeur d'origine quand vous la réaffichez. Mettre ColumnWidth = 0 jette la largeur d'origine, rend la colonne facile à oublier, et vous force à deviner sa taille plus tard. Gardez la largeur pour le dimensionnement et utilisez Hidden pour la visibilité.

Testé dans

Testé dans : Excel 365 (Windows 11), VBA 7.1 — dernière vérification le 14/08/2026.

Guides associés : VBA Hide Columns · VBA Merge Cells · VBA Borders · VBA Range · VBA With