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 parcial —
Range("B2:D3").Insert— hay dos direcciones legales, así que tienes que decir cuál:Shift:=xlShiftDownoxlShiftToRightparaInsert,xlShiftUpoxlShiftToLeftparaDelete. OmiteShifty 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
Shifty dejar que Excel adivine a partir de la forma del rango - Las constantes exactas —
xlShiftDown/xlShiftToRightpara Insert,xlShiftUp/xlShiftToLeftpara 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ón —no 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 faltaShift, las referencias se ajustan con limpieza, nada se rasga. - ¿Necesitas abrir o cerrar un hueco dentro de un bloque? Usa
Range(...).Insert/.Deletecon unShift:=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
