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 :
ColumnWidthest en caractères de la police Normal,RowHeightest en points. AinsiColumnWidth = 10etRowHeight = 10ne représentent en aucun cas la même taille.AutoFitest le piège — il ne s'exécute que sur une colonne ou une ligne entière (Columns("A:C").AutoFitourng.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 —
AutoFita besoin d'une colonne ou d'une ligne entière, et mesure l'affichage ColumnWidth(caractères) face à la propriété.Widthen 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 » :
ColumnWidthest définissable, mesurée en caractères. C'est celle à laquelle vous affectez une valeur..Widthest 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
