TL;DR — Dimensionar es una propiedad de la columna o la fila entera, y las dos dimensiones usan unidades distintas:
ColumnWidthva en caracteres de la fuente Normal,RowHeightva en puntos. Así queColumnWidth = 10yRowHeight = 10no son el mismo tamaño en ningún sentido.AutoFites la trampa — solo se ejecuta sobre una columna o una fila entera (Columns("A:C").AutoFitorng.EntireColumn.AutoFit), y mide el texto mostrado, así que ignora en silencio las celdas combinadas.
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Report")
ws.Columns("A:C").AutoFit ' ajusta A:C a su contenido mas ancho
ws.Columns("D").ColumnWidth = 18 ' 18 caracteres de la fuente Normal
ws.Rows(1).RowHeight = 28 ' 28 puntos
Redimensionar parece lo más sencillo de la familia de formato, y en su mayoría lo es — hasta que un
AutoFit no hace nada, o un ancho que fijas no coincide con el ancho que esperabas. Ambos vienen de
la misma raíz, la idea sobre la que se construye esta guía: dimensionas la columna o la fila entera,
y el ancho y el alto hablan en unidades distintas. Ten eso presente, y la propiedad de solo lectura
.Width, las reglas de AutoFit y la confusión de «por qué no se oculta esto» se resuelven todas.
Lo que aprenderás
- El modelo mental — dimensionas la columna o la fila entera, en dos unidades distintas
- La regla más importante —
AutoFitnecesita una columna o fila entera, y mide lo que se muestra ColumnWidth(caracteres) frente al.Widthde solo lectura (puntos)RowHeight, el ajuste de texto, y cuándo una fila crece por sí sola- El punto ciego de AutoFit — las celdas combinadas
- Ocultar una columna de la forma correcta, y por qué el ancho cero es una trampa
El modelo mental: dimensionas la columna o la fila entera, en dos unidades
El ancho y el alto no pertenecen a una celda — pertenecen a la columna y la fila en que se sitúa. Puedes alcanzarlos desde una celda, pero el valor se aplica a toda la línea:
ws.Range("D5").EntireColumn.ColumnWidth = 18 ' ensancha TODA la columna D, no solo D5
ws.Range("D5").EntireRow.RowHeight = 28 ' sube el alto de TODA la fila 5
La segunda mitad del modelo son las unidades, y esta es la parte que hace tropezar a la gente.
ColumnWidth se mide en caracteres — en concreto, cuántos dígitos 0 de la fuente de estilo
Normal caben en la columna (el valor predeterminado 8.43 significa unos ocho ceros). RowHeight se
mide en puntos, la misma unidad de 1/72 de pulgada que el tamaño de fuente. Los dos números no son
comparables, y no hay conversión limpia entre ellos porque uno depende de la fuente y el otro no.
Cuando un diseño se ve raro, muy a menudo es un valor de ancho sobre el que se razonó como si fuera de
puntos.
La regla más importante: AutoFit necesita una columna o fila entera
AutoFit es la forma más rápida de dimensionar al contenido, y tiene un requisito firme: debe
llamarse sobre una columna entera o una fila entera, nunca sobre un rango de celdas arbitrario.
ws.Columns("A:C").AutoFit ' OK - columnas enteras
ws.Rows("1:5").AutoFit ' OK - filas enteras
ws.Range("A1:C5").EntireColumn.AutoFit ' OK - promovido antes a columnas enteras
ws.Range("A1:C5").AutoFit ' MAL - un bloque de celdas no es fila ni columna -> error 1004
El arreglo siempre es el mismo: promueve el rango a líneas enteras con .EntireColumn o .EntireRow
primero. La segunda mitad de la regla es más sutil — AutoFit mide lo que se muestra, no lo que se
guarda. Dimensiona al texto renderizado más ancho, así que una columna de números mostrados como
"0" se ajusta a 5, no al 5.4999 subyacente; y una columna cuyo contenido está oculto tras un
NumberFormat estrecho se ajusta al formato, no al valor.
ColumnWidth frente al Width de solo lectura
Hay dos propiedades de ancho, y solo una se puede fijar — una fuente habitual de confusión de «por qué no compila esto»:
ColumnWidthse puede fijar, medida en caracteres. Esta es la que asignas..Widthes de solo lectura, medida en puntos. Te dice el ancho renderizado de un rango en pantalla, pero no puedes asignarle —Columns("A").Width = 100falla.
ws.Columns("A").ColumnWidth = 20 ' fijalo - caracteres
Debug.Print ws.Columns("A").Width ' leelo - puntos (un numero distinto)
Si necesitas dimensionar una columna a un número concreto de puntos o píxeles, no hay asignador
directo; fijas ColumnWidth en caracteres, luego lees .Width de vuelta y ajustas en un bucle corto
hasta que los puntos coincidan. Es engorroso por diseño — el ancho de columna de Excel siempre fue una
medida en caracteres, y .Width se añadió después como una comodidad de solo lectura.
RowHeight y el ajuste de texto
RowHeight en puntos es sencillo, con un comportamiento que conviene conocer: cuando una celda tiene
el ajuste de texto activado, Excel crece el alto de fila automáticamente para acomodar las líneas
ajustadas — salvo que hayas fijado un RowHeight explícito, que lo clava y puede recortar el texto:
ws.Range("B2").WrapText = True ' deja que el texto largo se ajuste en varias lineas
ws.Rows(2).EntireRow.AutoFit ' crece la fila para acomodar el texto ajustado
' NO fijes despues Rows(2).RowHeight = 15 - eso lo clava y recorta el ajuste
La regla general: si quieres que una fila acomode contenido ajustado, activa WrapText y deja que
AutoFit (o el crecimiento automático de Excel) la dimensione. Fijar un RowHeight fijo después
anula eso y es como el texto ajustado acaba cortado.
El punto ciego de AutoFit: las celdas combinadas
Aquí está el que más tiempo hace perder, y enlaza directamente con
VBA Merge Cells: AutoFit ignora las celdas combinadas. Una fila cuyo
único contenido alto es una celda combinada y ajustada no crecerá para acomodarlo — AutoFit mide
las celdas sin combinar y no ve nada que necesite el alto extra, así que el texto queda recortado.
Esta es una razón más por la que las celdas combinadas causan problemas en código: derrotan al
mismísimo comando al que echarías mano para hacerlas legibles. Si debes mantener un bloque combinado y
ajustado, fija su RowHeight explícitamente (mide el texto y calcula el alto tú mismo); mejor aún,
evita la combinación y usa Centrar en la selección, que AutoFit sí puede ver.
Ocultar una columna: no con ancho cero
Un atajo tentador para ocultar una columna es poner su ancho a cero. Resístete — usa la propiedad
.Hidden, tratada en VBA Hide Columns:
ws.Columns("B").Hidden = True ' la forma correcta - reversible, evidente, restaura su ancho anterior
ws.Columns("B").ColumnWidth = 0 ' la trampa - "oculta" pero has perdido el ancho original
Hidden = True recuerda el ancho real de la columna y lo restaura cuando la muestras de nuevo.
ColumnWidth = 0 tira ese ancho — mostrarla más tarde significa adivinar cuál era — y una columna de
ancho cero es fácil de pasar por alto cuando alguien luego se pregunta por qué parecen faltar datos.
El ancho es para dimensionar; usa Hidden para la visibilidad.
Cómo ayuda ExcelMaster
Dimensionar esconde más aristas de las que parece: dos unidades distintas para el ancho y el alto, un
AutoFit que da error en un rango de celdas y se salta en silencio las combinadas, un .Width que
puedes leer pero no fijar, y un «ocultar» con ancho cero que pierde el tamaño original. Cada uno falla
en silencio — texto recortado, un número inesperado, o una columna que no vuelve.
ExcelMaster te deja decir qué
debe hacer el diseño. Pídele que «autoajuste las columnas de la A a la C y dé a la fila 1 algo de
aire», y promueve el rango a EntireColumn antes de llamar a AutoFit, fija RowHeight en puntos,
activa WrapText donde el texto necesita fluir, y oculta columnas con .Hidden en vez de un ancho
cero. Te quedas con el libro y con el código; te ahorras el diseño que salió recortado porque AutoFit
nunca vio la celda combinada.
Preguntas frecuentes
¿Cómo fijo el ancho de columna y el alto de fila en Excel VBA?
Asigna ColumnWidth y RowHeight sobre columnas y filas enteras: Columns("A").ColumnWidth = 20 y
Rows(1).RowHeight = 28. Recuerda que las unidades difieren — ColumnWidth va en caracteres de la
fuente Normal, RowHeight va en puntos — así que el mismo número significa tamaños distintos para
cada uno. Desde una celda, usa Range("A1").EntireColumn.ColumnWidth para dimensionar la columna
entera.
¿Cómo autoajusto columnas en VBA?
Llama a AutoFit sobre una columna o fila entera: Columns("A:C").AutoFit o
Range("A1:C5").EntireColumn.AutoFit. Llamar a AutoFit sobre un rango de celdas normal como
Range("A1:C5").AutoFit lanza el error 1004, porque AutoFit solo funciona sobre columnas o filas
enteras. Promueve el rango con .EntireColumn o .EntireRow primero.
¿Por qué AutoFit no funciona en mis celdas combinadas?
AutoFit ignora las celdas combinadas — mide solo el contenido sin combinar, así que una fila cuyo
contenido alto está en una celda combinada y ajustada no crecerá para acomodarlo y el texto queda
recortado. Fija el RowHeight explícitamente para esa fila, o evita la combinación y usa Centrar en
la selección, que AutoFit sí puede medir.
¿Cuál es la diferencia entre ColumnWidth y Width en VBA?
ColumnWidth se puede fijar y se mide en caracteres de la fuente Normal — esta es la propiedad que
asignas. .Width es de solo lectura y se mide en puntos; informa del ancho renderizado pero no puedes
fijarlo. Para dimensionar a un número concreto de puntos, fija ColumnWidth en caracteres, luego lee
.Width de vuelta y ajusta hasta que coincida.
¿Debo poner el ancho de columna a cero para ocultar una columna en VBA?
No. Usa Columns("B").Hidden = True, que oculta la columna de forma reversible y restaura su ancho
original cuando la muestras de nuevo. Poner ColumnWidth = 0 descarta el ancho original, hace que la
columna sea fácil de pasar por alto y te obliga a adivinar su tamaño más tarde. Reserva el ancho para
dimensionar y usa Hidden para la visibilidad.
Probado en
Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 14/08/2026.
Guías relacionadas: VBA Hide Columns · VBA Merge Cells · VBA Borders · VBA Range · VBA With
