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

VBA Column Width y Row Height en Excel — redimensionar y AutoFit desde código (y las unidades que te hacen tropezar)

|

VBA Column Width y Row Height en Excel — redimensionar y AutoFit desde código (y las unidades que te hacen tropezar)

TL;DR — Dimensionar es una propiedad de la columna o la fila entera, y las dos dimensiones usan unidades distintas: ColumnWidth va en caracteres de la fuente Normal, RowHeight va en puntos. Así que ColumnWidth = 10 y RowHeight = 10 no son el mismo tamaño en ningún sentido. AutoFit es la trampa — solo se ejecuta sobre una columna o una fila entera (Columns("A:C").AutoFit o rng.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 — AutoFit necesita una columna o fila entera, y mide lo que se muestra
  • ColumnWidth (caracteres) frente al .Width de 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»:

  • ColumnWidth se puede fijar, medida en caracteres. Esta es la que asignas.
  • .Width es de solo lectura, medida en puntos. Te dice el ancho renderizado de un rango en pantalla, pero no puedes asignarle — Columns("A").Width = 100 falla.
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 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