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

VBA Delete Column en Excel — elimina una columna sin errores #REF! ni columnas omitidas

|

VBA Delete Column en Excel — elimina una columna sin errores #REF! ni columnas omitidas

TL;DRColumns("C").Delete es Insert al revés: elimina la columna C y arrastra todo lo que hay a su derecha una columna hacia la izquierda. Mismo desplazamiento, dirección opuesta —con un giro destructivo—. Cualquier fórmula que referenciaba una celda eliminada se queda sin nada a lo que apuntar, así que se colapsa en #REF! de forma permanente. Y eliminar dentro de un bucle hacia delante se salta columnas, porque cada borrado renumera las que tiene detrás. Elimina de derecha a izquierda, o reúne los objetivos en un Union y elimina una sola vez.

Sub DeleteFlaggedColumns()
    Dim ws As Worksheet, c As Long, kill As Range
    Set ws = ThisWorkbook.Worksheets("Report")
    For c = ws.UsedRange.Columns.Count To 1 Step -1     ' recorre, NO elimines a media iteracion
        If ws.Cells(1, c).Value = "" Then
            If kill Is Nothing Then Set kill = ws.Columns(c) _
            Else Set kill = Union(kill, ws.Columns(c))
        End If
    Next c
    If Not kill Is Nothing Then kill.Delete             ' un desplazamiento, nada se renumera
End Sub

Eliminar una columna usa exactamente el mismo desplazamiento de la cuadrícula que insertar una —solo que tira hacia la izquierda en vez de empujar hacia la derecha—. Lo que convierte a Delete en la herramienta más afilada es que el desplazamiento es destructivo: los datos se van, y las referencias que apuntaban a ellos se rompen. Dos modos de fallo explican casi todos los errores al eliminar columnas —referencias rotas y columnas omitidas—, y ambos vienen directamente del desplazamiento.

Lo que aprenderás

  • El modelo mental — Delete tira de la cuadrícula hacia la izquierda, y las referencias que caen en el hueco mueren
  • Por qué obtienes #REF!, y qué fórmulas sobreviven al desplazamiento frente a cuáles estallan
  • La trampa del bucle hacia delante — por qué un bucle de borrado se salta columnas, y el arreglo de derecha a izquierda
  • Cómo eliminar por condición con un único Union para que nada se renumere a media iteración
  • Cuándo querías ClearContents, no Delete

El modelo mental: Delete tira hacia la izquierda, y el hueco se lleva las referencias consigo

Columns("C").Delete elimina la columna C y luego desliza la D al sitio de la C, la E al de la D, y así sucesivamente. Excel ajusta las referencias que sobreviven: una fórmula que decía =SUM(D2:D100) pasa a decir =SUM(C2:C100) porque esos datos se movieron a la izquierda y Excel los siguió. Esa parte es amable.

La parte poco amable son las referencias que apuntaban dentro de la propia columna C. Cuando C desaparece, una fórmula como =C5*A5 no puede desplazarse sobre la nada —no hay celda sobre la que caer—, así que pasa a ser =#REF!*A5 y se queda rota. #REF! no es un fallo temporal: es Excel diciéndote que la referencia fue destruida. Y puede golpear en una hoja que ni siquiera estás mirando, porque una fórmula tres pestañas más allá puede depender en silencio de la columna que acabas de eliminar.

La regla que se deriva: antes de eliminar una columna de la que leen otras fórmulas, decide qué les pasa a esas fórmulas —redirígelas, o convierte antes las dependientes a valores—. Elimina la columna a ciegas y puede que te encuentres #REF! esparcido por todo el libro después de que la macro «tenga éxito».

La trampa del bucle hacia delante: el error número uno al eliminar

Quieres eliminar las columnas C, E y G. El instinto es un bucle hacia delante:

Dim c As Long
For c = 3 To 7 Step 2
    ws.Columns(c).Delete          ' MAL - elimina las columnas equivocadas
Next c

Mira lo que ocurre. Eliminar la columna 3 (C) tira de todo hacia la izquierda, así que la vieja columna E es ahora la columna D, y la vieja G es ahora la F. El bucle elimina entonces la columna 5 —que ya no es E—, y en la tercera pasada está eliminando lo que sea que se haya deslizado hasta la columna 7. Acabas quitando las columnas equivocadas y dejando las que pretendías descartar. El borrado renumera las columnas a las que aún no has llegado.

Hay dos arreglos correctos, y el segundo es mejor:

' Arreglo 1: recorre de DERECHA A IZQUIERDA para que los borrados tempranos nunca muevan los objetivos posteriores
For c = 7 To 3 Step -2
    ws.Columns(c).Delete
Next c

' Arreglo 2 (preferido): reune en un Union, elimina UNA VEZ - el orden deja de importar
Dim kill As Range
Set kill = Union(ws.Columns(3), ws.Columns(5), ws.Columns(7))
kill.Delete

Es la misma enfermedad que ya tratas al eliminar filas —ahí recorres de abajo arriba exactamente por esta razón—. Aquí el eje es horizontal, así que es de derecha a izquierda. El enfoque con Union esquiva la dirección por completo y es drásticamente más rápido: un borrado dispara un desplazamiento y un recálculo, mientras que N borrados por separado disparan N de cada uno.

Eliminar por condición: reúne y luego elimina una sola vez

El patrón Union brilla cuando eliminas columnas por una regla: cada columna con el encabezado en blanco, cada columna cuyo título coincide con una lista, cada columna vacía. La disciplina es: recorre y reúne, nunca elimines dentro del recorrido.

Sub DeleteEmptyColumns()
    Dim ws As Worksheet, c As Long, kill As Range
    Set ws = ThisWorkbook.Worksheets("Data")
    For c = 1 To ws.UsedRange.Columns.Count
        If Application.WorksheetFunction.CountA(ws.Columns(c)) = 0 Then
            If kill Is Nothing Then Set kill = ws.Columns(c) _
            Else Set kill = Union(kill, ws.Columns(c))
        End If
    Next c
    If Not kill Is Nothing Then kill.Delete
End Sub

Como la eliminación ocurre después del bucle, el recorrido puede ir en cualquier dirección: nada se renumera mientras sigues decidiendo. Comprueba Not kill Is Nothing antes de llamar a .Delete, o un conjunto de coincidencias vacío lanza el error en tiempo de ejecución 91 ("Object variable not set").

Delete frente a ClearContents: ten claro cuál querías

La fuente más común de un #REF! accidental es recurrir a Delete cuando solo querías que se fueran los datos:

  • Columns("C").Delete elimina la estructura de la columna y desplaza todo hacia la izquierda. Las referencias que apuntan a ella se rompen; la disposición de columnas de la hoja cambia.
  • Columns("C").ClearContents vacía las celdas y no desplaza nada. Las fórmulas que leen la columna C ven ahora celdas en blanco (o ceros), la disposición queda intacta y no se rompe ninguna referencia.

Si una fórmula posterior, un gráfico, una tabla ListObject o un nombre definido dependen de que esa columna exista, quieres ClearContents. Reserva Delete para cuando la columna de verdad no deba estar ahí. Y cuando una columna pertenece a una tabla, elimínala a través de la tabla — ws.ListObjects("Sales").ListColumns("Tax").Delete— en vez de Columns(...).Delete, que pelea contra la propia estructura de la tabla.

Cómo te ayuda ExcelMaster

Eliminar una columna parece trivial y esconde tres trampas —referencias que se rompen en #REF! en hojas que no estás vigilando, un bucle que se renumera a sí mismo y elimina las columnas equivocadas, y la elección entre Delete y Clear que decide si tu disposición sobrevive—.

ExcelMaster te deja decir lo que quieres —«elimina todas las columnas sin encabezado, mantén intactos los totales»— y reúne las coincidencias en un único Union, las elimina en un solo desplazamiento para que nada se renumere, avisa cuando un borrado rompería una fórmula en otro sitio, y usa ClearContents cuando querías «vaciar» en vez de «quitar». Tú conservas el libro y el código.

Preguntas frecuentes

¿Cómo elimino una columna en VBA?

Usa Columns("C").Delete para quitar la columna C; cada columna a su derecha se desplaza un paso hacia la izquierda. Cualifícalo —ThisWorkbook.Worksheets("Report").Columns("C").Delete— para que no actúe sobre la hoja que esté activa. Columns("C:E").Delete quita tres columnas adyacentes en una sola llamada.

¿Por qué obtengo #REF! después de eliminar una columna?

Porque una fórmula referenciaba una celda de la columna eliminada, y una vez que esa columna desaparece la referencia no tiene a qué apuntar, así que pasa a ser #REF! de forma permanente. Las fórmulas que referenciaban columnas a la derecha de la eliminación están bien: Excel las desplaza a la izquierda junto con los datos. Solo se rompen las referencias que apuntaban dentro del rango eliminado. Comprueba también otras hojas; la fórmula rota puede no estar donde eliminaste.

¿Por qué mi bucle de borrado se salta columnas?

Porque eliminar una columna renumera todas las columnas que tiene detrás, así que un bucle hacia delante For c = 1 To n pasa de largo por delante de columnas que se deslizaron a una posición por la que ya pasaste. Recorre de derecha a izquierda (For c = n To 1 Step -1) o —mejor— reúne las columnas objetivo en un Union y llama a .Delete una sola vez, que las quita en un único desplazamiento sin importar el orden.

¿Cómo elimino varias columnas a la vez?

Para columnas adyacentes, Columns("C:E").Delete. Para columnas dispersas, construye un UnionUnion(Columns(3), Columns(5), Columns(7)).Delete— para que todas se vayan en un solo desplazamiento. Esto es a la vez correcto (sin renumeración) y mucho más rápido que eliminarlas una a una.

¿Cuál es la diferencia entre Delete y ClearContents para una columna?

Delete quita la columna y desplaza el resto a la izquierda, lo que puede romper referencias y cambiar tu disposición. ClearContents vacía las celdas y no desplaza nada, dejando intactas la estructura y todas las referencias. Si algo posterior depende de que la columna exista, usa ClearContents.

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 Insert Cells · VBA Delete Rows · VBA Hide Columns · VBA SpecialCells