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

VBA Move Rows en Excel — cortar e insertar sin sobrescribir (no cortar y pegar)

|

VBA Move Rows en Excel — cortar e insertar sin sobrescribir (no cortar y pegar)

TL;DR — Para mover una fila sin arrasar con los datos, la cortas y luego la insertas con Insert —no la pegas—. Rows(5).Cut Destination:=Rows(20) deja caer la fila encima de la fila 20 y sobrescribe lo que hubiera allí. Rows(5).Cut seguido de Rows(20).Insert abre un hueco en la fila 20, deja caer la fila dentro y cierra el hueco del que salió —no se destruye nada—. Mover es un desplazamiento, así que cuidado con la trampa: cuando mueves una fila hacia abajo, el hueco que deja arrastra cada fila que tiene debajo —incluida tu fila objetivo— una posición hacia arriba.

Sub MoveRow()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Data")
    ws.Rows(5).Cut                 ' levanta la fila (hormigas en marcha), el origen aun no se va
    ws.Rows(20).Insert Shift:=xlDown ' INSERTA la fila cortada antes de la fila 20, desplazando el resto hacia abajo
    Application.CutCopyMode = False  ' limpia el estado del portapapeles al terminar
End Sub

Mover filas, mover columnas y el verbo Cut que hay debajo de ambos son una sola idea: levantas los datos y luego eliges cómo soltarlos. Insert abre un hueco y lo conserva todo; Paste cae encima y sobrescribe. Domina el caso de las filas —cortar, insertar, cuidado con el desplazamiento— y mover columnas es el mismo movimiento girado noventa grados, construido sobre el mismo Range.Cut.

Lo que aprenderás

  • El modelo mental — mover es cortar e insertar, e insertar es un desplazamiento, no un pegado
  • El error número uno — Cut Destination:= y pegar sobrescriben el destino y pierden datos
  • Por qué mover una fila hacia abajo renumera todo lo que hay debajo del origen, así que el objetivo sube una posición
  • Cómo mover varias filas a la vez sin que acaben en el orden equivocado (ve de abajo arriba)
  • Por qué las referencias de las fórmulas siguen a una fila cortada en vez de romperse en #REF! como al eliminar

El modelo mental: mover es un desplazamiento, no un pegado

Dentro de «mueve esta fila» se esconden dos movimientos. Primero la levantasRows(5).Cut pone la fila en el portapapeles en modo cortar (las hormigas en marcha)—. Luego la sueltas, y aquí empieza cada historia de pérdida de datos, porque hay dos maneras completamente distintas de hacerlo:

  • Pegarla (Cut Destination:=Rows(20), o un .Cut manual seguido de .Paste) deja caer la fila encima de la fila 20. El contenido antiguo de la fila 20 desaparece, en silencio, sin aviso.
  • Insertarla (Rows(5).Cut y luego Rows(20).Insert) abre un hueco nuevo en la fila 20, deja caer dentro la fila cortada y cierra el hueco allá en la fila 5. Todo lo demás se corre para hacer sitio. No se pierde nada.

Mover una fila es siempre el segundo movimiento. Es el mismo desplazamiento que ya conoces de insertar y eliminar filas: la cuadrícula se abre y se cierra físicamente, y todo lo que queda por debajo del cambio se renumera. Quédate con esto —mover es cortar e insertar (abrir un hueco), no pegar—: todo el artículo se deriva de ahí.

El error número uno: pegar encima sobrescribe el destino

Esto parece que mueve una fila, y es la forma más habitual en que la gente destruye datos en una macro:

ws.Rows(5).Cut Destination:=ws.Rows(20)    ' MAL para mover - esto PEGA sobre la fila 20

Cut Destination:= es un pegado. Copia las celdas de la fila 5 sobre la fila 20, sobrescribiendo los datos de la fila 20, y luego vacía la fila 5. Si la fila 20 contenía algo, se ha perdido. Eso está bien cuando la fila 20 es de verdad un espacio de trabajo vacío, pero es un desastre cuando tu intención era «encajar esta fila entre las demás».

El movimiento que conserva tus datos es cortar y luego Insert:

ws.Rows(5).Cut                              ' levantala
ws.Rows(20).Insert Shift:=xlDown            ' BIEN - abre un hueco, la mete, no sobrescribe nada

Cuando el portapapeles contiene celdas cortadas, .Insert ejecuta un insertar celdas cortadas —hace sitio en lugar de caer encima—. La regla es tajante: para mover, inserta lo que cortaste; nunca lo pegues. Recurre a Cut Destination:= solo cuando de verdad quieras sobrescribir un destino vacío.

La trampa del desplazamiento: mover hacia abajo renumera tu objetivo

Aquí está la sorpresa que llena los foros de ayuda —«corté una fila, la inserté más abajo, y todos mis datos subieron»—. No es un fallo; es el desplazamiento siendo coherente.

El corte y la inserción ocurren como una sola operación. Cuando mueves la fila 5 hacia abajo, a la fila 20, el hueco de la fila 5 se cierra como parte del mismo movimiento, así que las filas de la 6 a la 20 se corren cada una una posición hacia arriba —y la fila que era la 20 ahora está en la 19—. Tu fila cae respecto a la cuadrícula ya desplazada, no a los números de fila que tenías en la cabeza cuando escribiste 20.

El arreglo es dejar de mover por números de fila fijos, porque esos números se te mueven debajo. Localiza la referencia por valor e inserta relativo a ella, para que el desplazamiento no pueda engañarte:

Dim target As Range
Set target = ws.Columns("A").Find("Subtotal", LookAt:=xlWhole)   ' encuentra DONDE, no un numero
ws.Rows(5).Cut
target.EntireRow.Insert Shift:=xlDown        ' inserta sobre la fila Subtotal real, con o sin desplazamiento
Application.CutCopyMode = False

Si tienes que usar números, recuerda la dirección: mover hacia arriba (origen debajo del objetivo) deja intacto el número del objetivo; mover hacia abajo (origen encima del objetivo) sube el objetivo una posición. Ante la duda, inserta encima de una referencia encontrada por valor.

Mover varias filas: ve de abajo arriba

Mueve las filas de una en una en un bucle hacia delante y cada movimiento renumera las que aún no has tocado, así que el segundo movimiento agarra la fila equivocada. Es la misma disciplina que eliminar filas en un bucle —procesa de abajo arriba— para que los desplazamientos ocurran debajo de tu cursor, donde no pueden perturbar las filas que todavía tienes que mover:

Dim i As Long
For i = lastRow To firstRow Step -1          ' de abajo arriba: los desplazamientos caen debajo, no encima
    If ws.Cells(i, "D").Value = "Archive" Then
        ws.Rows(i).Cut
        ws.Rows(archiveTop).Insert Shift:=xlDown
    End If
Next i
Application.CutCopyMode = False

Para un bloque contiguo, muévelo de una sola vez —ws.Rows("5:9").Cut y luego un único .Insert— en vez de dar cinco vueltas al bucle peleándote con cinco desplazamientos. Un corte, una inserción, ninguna sorpresa de renumeración a mitad de bucle.

Cut mueve las referencias; delete las rompe

Hay una razón más por la que Cut + Insert es el movimiento seguro: Excel lo sigue. Una fórmula situada en otro sitio que lee =Data!B5 se reescribe para apuntar al nuevo hogar de la fila tras el movimiento, así que sigue leyendo los mismos datos. Es lo contrario de eliminar una fila, donde una fórmula que apunta dentro de la fila eliminada colapsa a =#REF! y se queda rota. Un movimiento reubica los datos y se lleva sus referencias consigo; una eliminación destruye los datos y las deja huérfanas. Cuando tu objetivo es «los mismos números, en otro sitio», ese es exactamente el comportamiento que quieres.

Cómo te ayuda ExcelMaster

Mover una fila son tres decisiones disfrazadas de una sola línea —insertar frente a pegar (datos conservados o destruidos), en qué dirección corre el desplazamiento (y si tu número de objetivo sigue significando lo que crees), y si mover un bloque en una llamada o iterar de abajo arriba— y equivocarte en cualquiera de ellas falla en silencio: una fila objetivo sobrescrita sin ruido, filas que caen una posición desviadas, o medio bucle movido a las ranuras equivocadas.

ExcelMaster te deja decir lo que quieres —«mueve cada fila Archive al principio del bloque de archivo, conservando los datos que ya están allí»— y corta e inserta en vez de pegar, encuentra la referencia por valor para que el desplazamiento no pueda engañarlo, e itera de abajo arriba cuando hay varias. Tú conservas el libro y el código.

Preguntas frecuentes

¿Cómo muevo una fila en VBA sin sobrescribir datos?

Corta la fila y luego insértala con Insert, no la pegues: ws.Rows(5).Cut seguido de ws.Rows(20).Insert Shift:=xlDown. El Insert abre un hueco en el destino y desplaza las demás filas hacia abajo, así que no se sobrescribe nada. Rows(5).Cut Destination:=Rows(20) pega encima de la fila 20 y destruye su contenido —úsalo solo cuando el destino esté vacío—.

¿Por qué mis datos suben después de cortar e insertar una fila?

Porque el movimiento es un único desplazamiento. Cuando cortas una fila y la insertas más abajo, el hueco que la fila deja se cierra como parte de la misma operación, así que cada fila por debajo del origen —incluida la que apuntabas— sube una posición. Inserta relativo a una referencia que encuentres por valor en lugar de a un número de fila fijo, y el desplazamiento deja de importar.

¿Cómo muevo varias filas a la vez en VBA?

Para un bloque contiguo, corta todo el rango e inserta una vez: ws.Rows("5:9").Cut y luego .Insert. Para filas dispersas seleccionadas por una condición, itera desde la última fila hacia la primera (Step -1) para que cada movimiento desplace las filas por debajo de tu posición, nunca las que todavía tienes que mover.

¿Cómo muevo una fila a otra hoja?

Corta la fila e insértala en la otra hoja: ThisWorkbook.Worksheets("Data").Rows(5).Cut y luego ThisWorkbook.Worksheets("Archive").Rows(2).Insert Shift:=xlDown. Es el mismo cortar e insertar; solo cambia la hoja de destino. Cualifica ambas hojas para que la macro no dependa de cuál esté activa.

¿Cuál es la diferencia entre Cut y Copy al mover una fila?

Cut mueve —vacía el origen una vez que la fila cae, así que acabas con una sola copia—. Copy duplica —el origen se queda, y tendrías que eliminarlo tú mismo, algo fácil de hacer mal—. Para mover una fila, usa Cut; consulta VBA Cut para el mecanismo completo.

Probado en

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

Guías relacionadas: VBA Cut · VBA Move Columns · VBA Insert Rows · VBA Delete Rows · VBA Copy Paste