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

VBA insertar filas y columnas en Excel — desplaza la cuadrícula en la dirección correcta (e inserta en un bucle sin caos)

|

VBA insertar filas y columnas en Excel — desplaza la cuadrícula en la dirección correcta (e inserta en un bucle sin caos)

TL;DR — Insertar es la imagen especular de eliminar. .EntireRow.Insert no saca espacio vacío de la nada — empuja hacia abajo cada fila existente para abrir un hueco, exactamente igual que eliminar las hace subir. Eso significa que se aplica el mismo problema de la cuadrícula que se mueve bajo tus pies: inserta dentro de un bucle de arriba abajo y las filas a las que aún no has llegado siguen alejándose de ti. Inserta una fila entera con .EntireRow.Insert; en un rango parcial, indica la dirección con Shift:=xlDown (o xlToRight); controla de qué vecino copia el formato la nueva fila con CopyOrigin; y para añadir muchas filas, inserta un rango de varias filas en una sola llamada en vez de recorrer un bucle.

' Inserta una fila en blanco ENCIMA de la fila 5, empujando 5, 6, 7... una posición abajo.
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Data")

ws.Rows(5).EntireRow.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove

Una vez que has conocido la trampa de eliminar filas — un bucle hacia delante que se salta filas porque eliminar hace subir la cuadrícula — insertar no depara sorpresas, porque es la misma idea funcionando en la dirección contraria. Insertar empuja la cuadrícula hacia abajo. Todo lo que hacía sutil a eliminar (los números se mueven, fila entera frente a parcial, hacerlo una vez frente a hacerlo en un bucle) tiene un homólogo exacto del lado de insertar. Esta guía los recorre en ese espejo, para que el modelo que ya tienes haga la mayor parte del trabajo.

Lo que aprenderás

  • El modelo mental — insertar empuja la cuadrícula hacia abajo, no rellena espacio vacío
  • Insertar una fila entera frente a un rango parcial, y por qué Shift decide la dirección
  • CopyOrigin — de qué vecino hereda el formato la fila o columna insertada
  • Insertar dentro de un bucle sin reprocesar tus propias filas nuevas
  • La forma de insertar muchas filas de una sola llamada

El modelo mental: insertar empuja la cuadrícula hacia abajo

Igual que eliminar una fila la quita y cierra el hueco, insertar una fila abre un hueco y empuja todo hacia abajo para hacer sitio. ws.Rows(5).EntireRow.Insert no escribe en la fila 5 — crea una fila 5 nueva y vacía, y la antigua fila 5 pasa a ser la 6, la antigua 6 pasa a ser la 7, y así sucesivamente hasta el fondo del rango usado. La nueva fila llega; cada fila existente por debajo del punto de inserción baja una posición.

Este es el único hecho al que aferrarse, porque es el origen tanto del comportamiento cotidiano como de la trampa del bucle. Insertar «encima de la fila 5» es en realidad decir «haz sitio en la 5 y desliza el resto hacia abajo». Las columnas funcionan igual pero en horizontal: Columns("C").Insert abre una nueva columna C y empuja D, E y F a la derecha. La cuadrícula es elástica, e Insert la estira — lo que significa que la dirección de todo lo que está por debajo (o a la derecha) del punto de inserción acaba de cambiar.

La regla para los rangos parciales: indica la dirección con Shift

Cuando insertas una fila o columna entera, no hay ambigüedad — una fila entera solo puede ir hacia abajo, una columna entera solo puede ir a la derecha. Pero inserta un rango parcial y Excel tiene que adivinar hacia dónde empujar a los vecinos, y su suposición se basa en la forma del rango:

ws.Range("B5:D5").Insert Shift:=xlDown      ' empuja B:D hacia abajo, deja en paz las columnas A y E
ws.Range("B5:B8").Insert Shift:=xlToRight   ' empuja estas celdas a la derecha

Omite Shift en un rango parcial y Excel elige una dirección según si el bloque es más ancho que alto — una regla que nadie recuerda, y así es como acabas con celdas empujadas de lado cuando querías que fueran hacia abajo. Siempre que el rango no sea una fila o columna completa, indica Shift de forma explícita. Y la mayoría de las veces no quieres una inserción parcial en absoluto: desplazar un subbloque de celdas desalinea cada columna que no incluye, la misma corrupción que provoca eliminar una sola celda. Recurre a .EntireRow.Insert / .EntireColumn.Insert salvo que de verdad pretendas mover un bloque:

ws.Rows(5).EntireRow.Insert          ' fila entera — cada columna se mantiene acompasada
ws.Columns("C").EntireColumn.Insert  ' columna entera — cada fila se mantiene acompasada

La regla que sorprende a la gente: CopyOrigin decide el formato

Una fila recién insertada no está vacía de formato — Excel copia el aspecto de un vecino, y CopyOrigin elige cuál. El valor por defecto es xlFormatFromLeftOrAbove, así que una nueva fila hereda el formato de la fila de encima. Suele estar bien — hasta que la fila de encima es un encabezado en negrita y sombreado, y tu nueva fila de datos llega vestida también de encabezado:

' La nueva fila copia el formato de la fila de ABAJO en lugar del encabezado de arriba.
ws.Rows(2).EntireRow.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromRightOrBelow

xlFormatFromRightOrBelow le dice a Excel que tome el formato de la fila que está debajo del punto de inserción — justo lo que quieres cuando insertas una fila de datos directamente debajo de un encabezado. Es un pequeño indicador con un resultado visible: fállalo y cada fila insertada lleva la ropa equivocada; aciértalo y las inserciones parecen nativas. Si quieres una fila realmente limpia, inserta primero y luego borra los formatos de forma explícita con .ClearFormats.

La trampa del bucle, reflejada: inserta hacia atrás o reprocesarás tus propias filas

Insertar en un bucle tiene el mismo peligro que eliminar en un bucle, apuntado en sentido contrario. Supón que recorres hacia abajo e insertas una fila separadora en blanco después de cada fila "Total". Inserta mientras avanzas de arriba abajo y la nueva fila empuja tus filas sin recorrer aún más abajo — y, según cómo avances, el bucle puede meterse de lleno en la fila que acaba de crear e insertar otra vez, y otra. La cuadrícula crece bajo tus pies.

La solución limpia es la misma que la de eliminar: recorre de abajo arriba, para que cada inserción ocurra por debajo de las filas que aún tienes que visitar y nunca altere sus números:

Dim i As Long, lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

For i = lastRow To 2 Step -1
    If ws.Cells(i, "A").Value = "Total" Then
        ws.Rows(i + 1).EntireRow.Insert Shift:=xlDown   ' inserta debajo; las filas de arriba quedan intactas
    End If
Next i

Yendo hacia atrás, cada fila insertada aterriza debajo de celdas que ya has tratado, así que las filas que siguen esperando conservan sus direcciones. Es la misma disciplina de VBA eliminar filas — cuando un bucle cambia el número de filas, recórrelo con Step -1.

Insertar muchas filas de una vez: redimensiona, no repitas

Llamar a .Insert cien veces para añadir cien filas es lento — cada llamada reestructura la cuadrícula y recalcula. Para insertar n filas contiguas, inserta un rango de n filas en una sola operación. Toma la fila objetivo, redimensiónala con .Resize(n) a la altura que quieras e inserta eso:

' Inserta 5 filas en blanco encima de la fila 10 en una sola llamada.
ws.Rows(10).Resize(5).EntireRow.Insert Shift:=xlDown

Rows(10).Resize(5) son las filas de la 10 a la 14; insertar ese bloque abre cinco filas de golpe y empuja el resto hacia abajo en conjunto. Un cambio estructural en lugar de cinco. Para inserciones dispersas por una hoja grande, el patrón más rápido suele ser añadir una columna auxiliar, ordenar o filtrar para agrupar las filas e insertar en bloque — el mismo principio de «haz la edición estructural una sola vez» que hace rápidas las eliminaciones masivas. Envuelve las inserciones grandes en Application.ScreenUpdating = False y cálculo manual y terminan al instante.

Cómo ayuda ExcelMaster

El código de inserción falla de formas silenciosas y cosméticas: un rango parcial empujado en la dirección equivocada porque se omitió Shift, filas nuevas que llevan el formato en negrita de un encabezado, un bucle de arriba abajo que inserta en su propia salida, cien inserciones sueltas que hacen que un informe vaya a paso de tortuga. Cada una parece «la inserción no funcionó del todo» en lugar de un error claro.

ExcelMaster te deja decir lo que quieres — «añade una fila en blanco después de cada subtotal», «inserta tres filas encima del resumen», «pon una columna nueva entre C y D». Escribe .EntireRow.Insert (o .EntireColumn.Insert) con el Shift y el CopyOrigin correctos, recorre en la dirección segura, agrupa las inserciones de varias filas en una sola llamada y hace primero una copia de seguridad de la hoja. Te quedas con el libro y con el código; te ahorras las conjeturas sobre hacia dónde está a punto de moverse la cuadrícula.

Preguntas frecuentes

¿Cómo inserto una fila en VBA?

Usa .EntireRow.Insert en la fila que quieres empujar hacia abajo: ws.Rows(5).EntireRow.Insert crea una nueva fila 5 en blanco y baja una posición la antigua fila 5 y todo lo que está debajo. Añade Shift:=xlDown por claridad y CopyOrigin para controlar de qué vecino hereda el formato la nueva fila.

¿Qué hace el argumento Shift al insertar?

Shift le dice a Excel hacia dónde empujar las celdas existentes cuando insertas un rango parcialxlDown las mueve hacia abajo, xlToRight las mueve a la derecha. Es innecesario para una fila o columna entera (esas solo pueden ir en un sentido) pero importante para un subbloque, donde de lo contrario Excel adivina la dirección a partir de la forma del rango.

¿Por qué mi fila insertada tiene el formato equivocado?

Las filas insertadas copian el formato de un vecino, elegido por CopyOrigin. El valor por defecto xlFormatFromLeftOrAbove copia la fila de arriba — así que insertar debajo de un encabezado hace que la nueva fila parezca un encabezado. Pasa CopyOrigin:=xlFormatFromRightOrBelow para copiar en su lugar la fila de abajo, o llama a .ClearFormats sobre la nueva fila después de insertar.

¿Cómo inserto varias filas de una vez en VBA?

Redimensiona la fila objetivo al número que necesites e inserta ese bloque en una sola llamada: ws.Rows(10).Resize(5).EntireRow.Insert inserta cinco filas encima de la fila 10. Una única inserción de varias filas es mucho más rápida que llamar cinco veces a .Insert, porque Excel reestructura la cuadrícula una sola vez.

¿Debo recorrer hacia delante o hacia atrás al insertar filas?

Hacia atrás, por la misma razón que al eliminar. Insertar empuja las filas sin recorrer más abajo, y un bucle de arriba abajo puede acabar insertando en las filas que acaba de crear. Recorrer For i = lastRow To 2 Step -1 mantiene cada inserción por debajo de las celdas que aún tienes que procesar, así que sus números de fila nunca se desplazan.

Probado en

Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 07/08/2026.

Guías relacionadas: VBA eliminar filas · VBA ocultar columnas y filas · VBA última fila · VBA Range · VBA For Loop