TL;DR — Insertar es la imagen especular de eliminar.
.EntireRow.Insertno 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 conShift:=xlDown(oxlToRight); controla de qué vecino copia el formato la nueva fila conCopyOrigin; 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é
Shiftdecide 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
parcial — xlDown 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
