TL;DR —
Columns("C").DeleteesInsertal 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 unUniony 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
Unionpara que nada se renumere a media iteración - Cuándo querías
ClearContents, noDelete
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").Deleteelimina 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").ClearContentsvací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 Union —
Union(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
