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

VBA Insert Cells en Excel — inserta o elimina celdas y elige tú la dirección del desplazamiento

|

VBA Insert Cells en Excel — inserta o elimina celdas y elige tú la dirección del desplazamiento

TL;DR — Insertar o eliminar una columna o una fila entera es seguro porque solo hay una manera en que puede desplazarse. En cuanto insertas o eliminas un rango parcialRange("B2:D3").Insert— hay dos direcciones legales, así que tienes que decir cuál: Shift:=xlShiftDown o xlShiftToRight para Insert, xlShiftUp o xlShiftToLeft para Delete. Omite Shift y Excel adivina a partir de la forma del rango, y una mala conjetura desliza a tus vecinas en la dirección equivocada sin ningún error.

Sub OpenGapForNote()
    ' Empuja un bloque de 2x3 HACIA ABAJO para hacer sitio - indica la direccion, nunca dejes que Excel adivine
    Range("B2:D3").Insert Shift:=xlShiftDown, CopyOrigin:=xlFormatFromLeftOrAbove
End Sub

Sub CloseGap()
    Range("B2:D3").Delete Shift:=xlShiftUp     ' sube el bloque de abajo hacia el hueco
End Sub

Son el mismo Insert y Delete que usas en columnas enteras y filas —apuntados a un subrango en vez de a una línea completa—. Ver el caso parcial es lo que hace que todo encaje: las operaciones de línea entera son sencillamente el caso especial y seguro donde la dirección del desplazamiento está forzada. En todos los demás sitios, la dirección es una elección, y en esa elección es donde vive el fallo.

Lo que aprenderás

  • El modelo mental — un rango parcial tiene dos direcciones de desplazamiento legales, así que debes elegir una
  • Por qué las filas y columnas enteras «funcionan sin más» — el desplazamiento está forzado, no hay nada que puedas equivocar
  • El error número uno — omitir Shift y dejar que Excel adivine a partir de la forma del rango
  • Las constantes exactas — xlShiftDown / xlShiftToRight para Insert, xlShiftUp / xlShiftToLeft para Delete
  • Cuándo una inserción parcial es lo correcto, y cuándo en realidad querías una fila entera

El modelo mental: si no es una línea entera, hay una decisión

Inserta una columna entera y solo hay una cosa que Excel puede hacer: empujar las columnas hacia la derecha. Inserta una fila entera y solo puede empujar las filas hacia abajo. Una dirección, sin ambigüedad, que es exactamente por lo que Columns("C").Insert nunca te pregunta nada.

Un rango parcial rompe eso. Pídele a Excel que inserte B2:D3 —un bloque de 2 columnas por 3 filas plantado en mitad de tus datos— y algo tiene que moverse para hacer sitio, pero ¿el qué? Las celdas de abajo podrían deslizarse hacia abajo, o las celdas de la derecha podrían deslizarse hacia la derecha. Ambas son legales. Así que Range.Insert y Range.Delete toman un argumento Shift cuyo único trabajo es responder a esa pregunta. Un rango parcial es el caso general; una línea entera es el caso degenerado donde la respuesta está forzada.

La regla que más importa: pasa siempre Shift en un rango parcial

Cuando dejas Shift fuera, Excel no se niega: adivina a partir de la forma del rango. A grandes rasgos: un rango más alto que ancho se desplaza horizontalmente, un rango más ancho que alto se desplaza verticalmente, y un rango cuadrado es cara o cruz. La conjetura no está documentada en espíritu y es poco fiable en la práctica, y cuando choca con tu intención, las celdas adyacentes se deslizan en la dirección equivocada y tus columnas se desalinean —en silencio, sin ningún error.

Range("B2:D3").Insert                       ' conjetura basada en la forma - un fallo latente
Range("B2:D3").Insert Shift:=xlShiftDown    ' explicito - hace exactamente esto, siempre

La regla es incondicional: en cualquier rango parcial, nombra la dirección. Trata la heurística de la forma como un generador de fallos que apagas siendo siempre explícito. Vale la pena memorizar las constantes, porque Insert y Delete usan distintas:

Operación Mover celdas... Constante
Insert abajo xlShiftDown
Insert a la derecha xlShiftToRight
Delete arriba xlShiftUp
Delete a la izquierda xlShiftToLeft

Una trampa más con las constantes: xlDown y xlToRight son valores de XlDirection que usa Range.End para la navegaciónno son las constantes de desplazamiento—. Pasar Shift:=xlDown a Insert funciona por casualidad de valor en algunas versiones, pero es incorrecto en intención; usa la familia xlShift... para que tu código diga lo que quiere decir.

Por qué las operaciones de línea entera son el caso seguro

Ahora la recompensa. Columns("C").Insert es en realidad «inserta un rango que resulta ser una columna entera», y una columna entera solo puede desplazarse a la derecha, así que no hay ninguna decisión de Shift que equivocar, ni ningún desgarro de fila parcial posible. Esa es toda la razón por la que las operaciones de línea entera son la opción por defecto fiable:

  • ¿Quieres mover una columna o una fila entera? Usa Columns(...) / Rows(...). No hace falta Shift, las referencias se ajustan con limpieza, nada se rasga.
  • ¿Necesitas abrir o cerrar un hueco dentro de un bloque? Usa Range(...).Insert / .Delete con un Shift:= explícito.

Eliminar un rango parcial arrastra el mismo peligro de #REF! que eliminar una columna: las celdas desaparecen, y las fórmulas que apuntaban a ellas se rompen. Y CopyOrigin funciona aquí exactamente igual que con las columnas: un bloque insertado hereda el formato de las celdas de arriba o de la izquierda salvo que digas otra cosa.

Cuándo una inserción parcial es de verdad lo correcto

Sé honesto sobre la frecuencia: la mayoría de las veces, «insertar una celda» es un trabajo de fila entera disfrazado. Si estás añadiendo un registro a una lista, quieres que se mueva la fila entera para que cada columna siga alineada —una inserción parcial que desplaza hacia abajo solo algunas columnas es precisamente la desalineación que intentas evitar—.

La inserción y la eliminación parciales se ganan su sitio con ediciones genuinamente rectangulares: desplazar hacia abajo un bloque etiquetado de un formulario para hacer sitio a un campo nuevo, cerrar un hueco que dejó una subtabla eliminada, reorganizar una disposición con forma de cuadrícula donde las filas y las columnas no son la unidad de significado. En esos casos el bloque es la cosa, y la dirección de Shift es una decisión de diseño de verdad. En todos los demás sitios, recurre antes a una fila o columna entera: es más limpio, seguro para las referencias, y nunca te pide que adivines.

Cómo te ayuda ExcelMaster

La inserción y la eliminación de rango parcial son una herramienta afilada: la dirección de Shift es obligatoria, fácil de poner al revés, y falla en silencio cuando se la dejas a Excel —y la variante Delete puede romper fórmulas igual que lo hace un borrado de columna—.

ExcelMaster te deja describir la edición —«empuja este bloque hacia abajo para hacer sitio a un campo nuevo»— y decide si una fila entera es lo que de verdad necesitas, escribe el Shift:=xlShiftDown (o xlShiftToRight) explícito en vez de fiarse de la conjetura de la forma, ajusta CopyOrigin para que encaje con el formato de alrededor, y señala una Delete parcial que rompería una referencia. Tú conservas el libro y el código.

Preguntas frecuentes

¿Cómo inserto celdas en VBA?

Llama a Insert sobre un rango e indica la dirección: Range("B2:C4").Insert Shift:=xlShiftDown mueve hacia abajo las celdas de debajo para hacer sitio, y Shift:=xlShiftToRight mueve hacia la derecha las celdas de la derecha. Pasa siempre Shift en un rango parcial: sin él, Excel adivina la dirección a partir de la forma del rango.

¿Qué hace el argumento Shift, y por qué debo pasarlo?

Shift le dice a Excel hacia dónde mover las celdas de alrededor para abrir sitio (Insert) o cerrar el hueco (Delete). Un rango parcial tiene dos direcciones legales, así que la elección es tuya. Omítelo y Excel decide según si el rango es más alto o más ancho —una conjetura que desliza en silencio a tus vecinas en la dirección equivocada cuando choca con tu intención—.

¿Cuál es la diferencia entre insertar celdas e insertar una columna entera?

Una columna entera solo puede desplazarse en un sentido (a la derecha), así que Columns("C").Insert no necesita dirección y nunca rasga la disposición. Un rango parcial puede desplazarse en dos sentidos, así que Range(...).Insert exige un Shift explícito. Si te descubres insertando celdas para añadir un registro, casi siempre querías una fila entera en su lugar.

¿Cómo elimino celdas y desplazo hacia arriba o hacia la izquierda en VBA?

Usa Range("B2:C4").Delete Shift:=xlShiftUp para subir las celdas de debajo, o Shift:=xlShiftToLeft para tirar hacia la izquierda de las celdas de la derecha. Igual que con un borrado de columna, cualquier fórmula que referenciaba las celdas eliminadas se colapsa en #REF!, así que comprueba antes las dependientes.

¿Debo usar xlDown o xlShiftDown?

Usa xlShiftDown. Las constantes xlDown y xlToRight pertenecen a XlDirection y están pensadas para la navegación con Range.End, no para el argumento Shift de Insert/Delete. Usar la familia xlShift... hace la intención explícita y evita depender de constantes que solo comparten un valor.

Probado en

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

Guías relacionadas: VBA Insert Column · VBA Delete Column · VBA Insert Rows · VBA Range · VBA Cells