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

VBA Move Columns en Excel — reposiciona columnas con cortar e insertar (EntireColumn)

|

VBA Move Columns en Excel — reposiciona columnas con cortar e insertar (EntireColumn)

TL;DR — Mover una columna es mover una fila en el otro eje: corta la columna entera e insértala con Insert, no la pegues. Columns("C").Cut Destination:=Columns("F") pega encima de la columna F y la borra. Columns("C").Cut y luego Columns("F").Insert abre un hueco antes de F, deja caer la columna dentro y cierra el hueco en C —no se pierde nada—. Dos reglas lo mantienen limpio: corta la EntireColumn (nunca un rango parcial), y recuerda que mover es un desplazamiento, así que cortar una columna a la izquierda de tu objetivo arrastra el objetivo una columna hacia la izquierda.

Sub MoveColumn()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Report")
    ws.Columns("C").Cut                       ' levanta la columna entera
    ws.Columns("F").Insert Shift:=xlToRight    ' INSERTA antes de la columna F, desplazando el resto a la derecha
    Application.CutCopyMode = False
End Sub

Mover una columna es la gemela horizontal de mover una fila, impulsada por el mismo Range.Cut. Todo lo que sabes del caso de las filas se traslada aquí —insertar en vez de pegar, cuidado con el desplazamiento, mover un bloque en una sola llamada—; solo que cortas columnas y se corren de lado en vez de hacia abajo.

Lo que aprenderás

  • Por qué cortas la EntireColumn, y qué pasa cuando cortas un rango parcial por error
  • El error número uno — Cut Destination:= pega sobre la columna objetivo y pierde sus datos
  • Por qué mover una columna a la derecha desplaza tu columna objetivo una posición a la izquierda (la misma trampa del desplazamiento, de lado)
  • Cómo reordenar varias columnas en un diseño fijo sin que acaben en el orden equivocado
  • Por qué las referencias siguen a una columna movida en vez de romperse en #REF!

El modelo mental: corta la columna entera, luego inserta

Mover una columna son dos movimientos, exactamente como mover una fila. Levantas la columna con Columns("C").Cut, y luego la sueltas —y la elección entre pegar e insertar es todo el juego—:

  • Pegar (Cut Destination:=Columns("F")) deja caer las celdas de la columna C encima de la columna F y sobrescribe todo lo que F contenía.
  • Insertar (Columns("C").Cut y luego Columns("F").Insert) abre un hueco antes de la columna F, encaja dentro la columna cortada y cierra el hueco allá en C. Las demás columnas se corren a la derecha para hacer sitio.

Para mover una columna a un diseño, siempre insertas. Pegar es para sobrescribir una columna vacía, no para reordenar. Esto es mover filas girado noventa grados: la cuadrícula se abre y se cierra en horizontal, y las columnas a la derecha se renumeran. Dicho de una vez: mover una columna es cortar e insertar (abrir un hueco), no pegar encima.

Corta la EntireColumn, no un rango parcial

Un movimiento de columna solo tiene sentido sobre columnas enteras. Corta un rango parcial e intenta insertarlo como columna y, o bien rasgas la cuadrícula, o bien no obtienes nada útil:

ws.Range("C1:C50").Cut                        ' MAL - un rango parcial, no la columna
ws.Range("F1:F50").Insert Shift:=xlToRight     ' desplaza solo 50 filas; de la fila 51 hacia abajo queda desalineado

Eso desplaza cincuenta celdas de lado y deja el resto de la columna F donde estaba —los datos por debajo de la fila 50 ya no cuadran con las filas a las que pertenecen—. Mueve la columna entera para que todas las filas viajen juntas:

ws.Columns("C").Cut                            ' BIEN - la columna entera, todas las filas a la vez
ws.Columns("F").Insert Shift:=xlToRight

Cuando localizas la columna por su encabezado en vez de por una letra, resuélvela igualmente a la columna entera con .EntireColumn:

Dim col As Range
Set col = ws.Rows(1).Find("Region", LookAt:=xlWhole)   ' encuentra la celda del encabezado
col.EntireColumn.Cut                                    ' corta la columna ENTERA en la que esta
ws.Columns("B").Insert Shift:=xlToRight

Esto refleja la regla de insertar columnas: las operaciones estructurales de columna actúan sobre Columns / .EntireColumn, nunca sobre un rango parcial.

La trampa del desplazamiento, de lado: mover a la derecha desplaza tu objetivo a la izquierda

El mismo desplazamiento que renumera filas renumera columnas. Corta la columna C e insértala en la columna F, y el hueco en C se cierra como parte del movimiento, así que las columnas de la D a la F se corren cada una una posición a la izquierda —la columna que era F ahora está en E, y tu columna cortada cae respecto a la cuadrícula desplazada—.

Mueve por búsqueda de encabezado, no por letras de columna, y el desplazamiento no puede morderte, porque Find localiza dónde está la columna después de que todo se haya asentado:

ws.Columns("C").Cut
ws.Rows(1).Find("Total", LookAt:=xlWhole).EntireColumn.Insert Shift:=xlToRight
Application.CutCopyMode = False

Si insistes en usar letras, mover una columna a la izquierda (origen a la derecha del objetivo) deja intacta la letra del objetivo; moverla a la derecha (origen a la izquierda) desplaza el objetivo una columna antes.

Reordenar varias columnas en un diseño fijo

Reordenar columnas de un Cut/Insert en un Cut/Insert es donde los diseños se descolocan: cada movimiento baraja las letras de las columnas que aún no has colocado. El patrón fiable es dejar de perseguir letras que se mueven y colocar cada columna por el nombre de su encabezado contra el orden que quieres, trabajando de izquierda a derecha para que cada columna colocada se convierta en un ancla estable para la siguiente:

Dim wanted As Variant, k As Long
wanted = Array("Date", "Region", "Product", "Amount")   ' el orden que quieres, de izquierda a derecha
For k = LBound(wanted) To UBound(wanted)
    Dim src As Range
    Set src = ws.Rows(1).Find(wanted(k), LookAt:=xlWhole)
    If Not src Is Nothing Then
        src.EntireColumn.Cut
        ws.Columns(k + 1).Insert Shift:=xlToRight        ' colocala en la ranura k+1, luego sigue
    End If
Next k
Application.CutCopyMode = False

Como cada paso apunta a un número de ranura fijo y encuentra el origen por su nombre, las letras que se desplazan nunca descuadran el diseño.

Cut mueve las referencias; delete las rompe

Igual que con las filas, Cut + Insert es seguro porque Excel lo sigue. Una fórmula que lee =Report!C2 se reescribe para rastrear la columna C hasta su nueva posición, así que sigue leyendo los mismos datos tras el movimiento. Es lo contrario de eliminar una columna, donde una fórmula que apunta dentro de la columna quitada colapsa a =#REF!. Mover reubica los datos y arrastra sus referencias consigo; eliminar destruye los datos y las deja huérfanas.

Cómo te ayuda ExcelMaster

Reordenar columnas esconde las mismas tres trampas que las filas, de lado —insertar frente a pegar (datos conservados o destruidos), el desplazamiento que renumera las columnas que aún no has colocado, y cortar la columna entera en vez de un rango parcial— y cada una falla sin ningún error: una columna objetivo sobrescrita en silencio, un diseño descuadrado por una letra, o media columna desalineada por debajo de la fila 50.

ExcelMaster te deja decir el diseño que quieres —«pon las columnas en el orden Date, Region, Product, Amount»— y corta cada columna entera, la encuentra por su encabezado para que las letras que se desplazan no puedan confundirlo, e inserta en su sitio en vez de pegar sobre lo que hay. Tú conservas el libro y el código.

Preguntas frecuentes

¿Cómo muevo una columna en VBA sin perder datos?

Corta la columna entera e insértala con Insert: ws.Columns("C").Cut y luego ws.Columns("F").Insert Shift:=xlToRight. El Insert abre un hueco y desplaza las demás columnas a la derecha, así que no se sobrescribe nada. Columns("C").Cut Destination:=Columns("F") pega encima de la columna F y la destruye —úsalo solo cuando F esté vacía—.

¿Por qué se desplazan mis columnas cuando muevo una?

Porque mover es un desplazamiento. Cortar la columna C la quita y cierra el hueco, así que las columnas a su derecha se corren una a la izquierda antes de que se inserte tu columna cortada —el objetivo que nombraste por letra ahora es una columna antes—. Inserta relativo a un encabezado que encuentres con Find, no a una letra fija, y el desplazamiento deja de importar.

¿Cómo reordeno columnas en un orden concreto en VBA?

Encuentra cada columna por el nombre de su encabezado e insértala en una ranura fija, trabajando de izquierda a derecha: Rows(1).Find("Region").EntireColumn.Cut y luego Columns(2).Insert, y así sucesivamente. Apuntar a un número de ranura estable mientras localizas el origen por su nombre significa que las letras que se desplazan nunca descuadran el diseño.

¿Puedo mover un rango parcial de columna en vez de la columna entera?

Puedes, pero desalinea tus datos: cortar Range("C1:C50") e insertarlo desplaza solo esas cincuenta celdas de lado y deja el resto de la cuadrícula atrás, así que las filas por debajo de la 50 ya no cuadran. Para un movimiento de columna de verdad, corta Columns("C") o .EntireColumn para que todas las filas viajen juntas.

¿Debería usar Cut o Copy para mover una columna?

Usa Cut. Vacía la columna de origen una vez que la columna cae, así que acabas con una sola copia en la nueva posición. Copy deja el origen en su sitio y tendrías que eliminarlo tú mismo —un paso extra fácil de hacer mal—. Consulta VBA Cut para el mecanismo completo de mover frente a duplicar.

Probado en

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

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