TL;DR —
Worksheet.Deletees la única operación de hoja que interrumpe para preguntar. Lanza una confirmación modal —la que dice que puede haber datos— y en una macro desatendida o en un bucle ese cuadro de diálogo es un cuelgue, no una red de seguridad. Silénciala conApplication.DisplayAlerts = False, y vuelve a activarla en un controlador de errores para que un fallo nunca deje los avisos apagados durante toda la sesión. De ahí salen dos límites duros: Excel se niega a eliminar la última hoja visible (error 1004), y eliminar por índice dentro de un bucle se salta hojas salvo que recorras hacia atrás.
Sub DeleteSheetSafely(nm As String)
Dim ws As Worksheet
On Error GoTo Done
Application.DisplayAlerts = False
For Each ws In ThisWorkbook.Worksheets
If StrComp(ws.Name, nm, vbTextCompare) = 0 Then ws.Delete
Next ws
Done:
Application.DisplayAlerts = True ' restaurado aunque Delete haya lanzado un error
End Sub
Worksheet.Delete es el código que hay detrás de clic derecho en una pestaña ▸ Eliminar. Es la
forma en que una macro desmonta hojas de borrador o las pestañas de trabajo del mes pasado antes de
una ejecución nueva. A diferencia de Add y Copy,
que hacen su trabajo en silencio, Delete se detiene y espera a una persona, y esa pausa es la raíz
de casi todos los problemas al eliminar hojas.
Lo que aprenderás
- El modelo mental —
Deletees irreversible y pregunta primero, y esa pregunta es lo que cuelga tu macro - La regla que más importa — silencia el aviso y luego restáuralo en un controlador de errores
- Por qué Excel se niega a eliminar la última hoja visible
- Por qué eliminar dentro de un bucle salta hojas, y cómo recorrer hacia atrás lo arregla
- Cómo eliminar una hoja solo si existe
El modelo mental: Delete pregunta primero, y no hay deshacer
Dos hechos sobre Delete explican el resto. Primero, es permanente: no hay Deshacer para una hoja
eliminada, así que los datos y todo lo que hay en la pestaña desaparecen en el instante en que la
llamada tiene éxito. Segundo, precisamente porque es permanente, Excel lo protege con un cuadro de
diálogo modal de confirmación: "Data may exist in the sheet(s) selected for deletion. To permanently
delete the data, press Delete."
En una sesión interactiva ese diálogo es un cinturón de seguridad útil. En automatización es el enemigo. Una macro que elimina diez hojas de borrador lanza ese aviso diez veces, y si la macro se ejecuta desatendida —de noche, en un servidor, desde una tarea programada— simplemente se congela, esperando un clic que nunca llegará. Todo el arte de eliminar hojas en VBA consiste en apagar esa pregunta de forma segura.
La regla que más importa: silencia el aviso y luego restáuralo
Suprime la confirmación con Application.DisplayAlerts = False, y esta es la mitad importante,
vuelve a activarla en un controlador de errores. Dejar los avisos apagados no es una comodidad
local: es un ajuste global que permanece apagado durante el resto de la sesión de Excel, silenciando
todas las confirmaciones, incluido el aviso de «¿quieres sobrescribir este archivo?». Si tu macro
muere entre apagar los avisos y volver a encenderlos, has desarmado en silencio toda la aplicación.
Sub ClearScratchSheets()
On Error GoTo Done
Application.DisplayAlerts = False
ThisWorkbook.Worksheets("Scratch").Delete
Done:
Application.DisplayAlerts = True ' siempre se ejecuta, incluso ante un error
End Sub
Es la misma disciplina que usas con ScreenUpdating y alrededor de
Unprotect: cualquier global que apagas se restaura en una única etiqueta
de salida para que un fallo no pueda dejar la sesión en un estado peligroso. Si de todo esto solo
recuerdas una cosa sobre eliminar hojas, que sea «restaura DisplayAlerts en un controlador».
Excel se niega a eliminar la última hoja visible
Un libro siempre debe contener al menos una hoja visible, así que Delete sobre la última hoja
visible lanza el error en tiempo de ejecución 1004, incluso con los avisos suprimidos. Esto te muerde
en cuanto escribes «elimina todas las hojas que coincidan con X» y resulta que X coincide con todas, o
«elimina todas las hojas salvo el informe» cuando el informe no está donde suponías.
Blinda el suelo de forma explícita antes de eliminar:
If ThisWorkbook.Worksheets.Count > 1 Then
ws.Delete
Else
MsgBox "Cannot delete the only remaining sheet."
End If
Ten en cuenta que las hojas ocultas no cuentan para el requisito de «al menos una visible», así que un libro con una hoja visible y varias ocultas sigue negándose a eliminar la visible. Si necesitas quitarla, muestra antes otra hoja.
Por qué eliminar dentro de un bucle salta hojas
Esta es la trampa que convierte un «elimina estas cinco hojas» en un «elimina dos, salta tres y luego
error». Cuando recorres la colección por índice y eliminas sobre la marcha, cada eliminación
desplaza los índices posteriores una posición hacia abajo, así que Sheets(i) después de un borrado
apunta a lo que era Sheets(i+1), y tu For i = 1 To Count pasa justo de largo por delante:
' MAL - eliminar desplaza los indices, se saltan hojas
For i = 1 To ThisWorkbook.Worksheets.Count
ThisWorkbook.Worksheets(i).Delete ' i ahora apunta mas alla de la siguiente hoja
Next i
Dos arreglos limpios. Recorre hacia atrás, para que el desplazamiento ocurra solo en la parte que ya visitaste, la misma razón por la que eliminas filas de abajo arriba (consulta VBA Delete Rows):
For i = ThisWorkbook.Worksheets.Count To 1 Step -1
With ThisWorkbook.Worksheets(i)
If .Name Like "Temp*" Then .Delete
End With
Next i
O usa For Each, que aquí es seguro porque itera sobre los objetos en vez de sobre posiciones de
índice fijas: es la forma que usa el fragmento del TL;DR. Sea como sea, nunca elimines mientras avanzas
un índice hacia delante.
Cómo te ayuda ExcelMaster
Eliminar una hoja parece trivial y esconde cuatro formas de fallar: un aviso modal que cuelga una
ejecución desatendida, un DisplayAlerts global que se queda apagado tras un fallo, el error 1004 en
la última hoja visible, y un bucle hacia delante que se salta la mitad de sus objetivos.
ExcelMaster te deja decir qué
quieres quitar —«elimina todas las hojas cuyo nombre empiece por Temp, pero nunca la última»— y escribe
la versión segura: DisplayAlerts apagado con una restauración garantizada en un controlador de
errores, una guarda de recuento para el suelo de la última hoja visible, y un bucle hacia atrás o un
For Each para que no se salte nada. También te recuerda que la eliminación es permanente, y se ofrece
a borrar el contenido de una hoja en su lugar cuando quieres algo reversible. Tú conservas el libro y
el código.
Preguntas frecuentes
¿Cómo elimino una hoja en VBA sin el aviso de confirmación?
Pon Application.DisplayAlerts = False antes del borrado y luego restáuralo con
Application.DisplayAlerts = True después, idealmente en una etiqueta de controlador de errores para
que se ejecute aunque el borrado falle. Con los avisos suprimidos,
ThisWorkbook.Worksheets("Scratch").Delete elimina la hoja en silencio.
¿Por qué se congela mi macro al eliminar una hoja?
Porque Delete lanza un cuadro de diálogo modal de confirmación y la macro está esperando un clic que
nunca llega, algo habitual en ejecuciones desatendidas o programadas. Suprime el diálogo con
Application.DisplayAlerts = False alrededor del borrado. Acuérdate de volver a activarlo, porque de
lo contrario permanece apagado durante toda la sesión de Excel.
¿Por qué obtengo el error 1004 al eliminar una hoja de cálculo?
Normalmente porque es la última hoja visible, y un libro debe conservar al menos una hoja visible.
Comprueba ThisWorkbook.Worksheets.Count > 1 antes de eliminar, o muestra antes otra hoja. Ten en
cuenta que el error 1004 aquí es independiente del aviso de confirmación: suprimir DisplayAlerts no
levanta el suelo de la última hoja.
¿Cómo elimino una hoja solo si existe?
No hay ningún método Exists, así que recorre la colección Worksheets y compara nombres con
StrComp(ws.Name, nm, vbTextCompare) = 0, eliminando cuando haya coincidencia. Esto no hace nada, con
elegancia, cuando la hoja no está, en lugar de lanzar un error como haría un
Worksheets("Gone").Delete directo.
¿Cómo elimino varias hojas en un bucle?
Recorre hacia atrás por índice —For i = Worksheets.Count To 1 Step -1— o usa For Each, porque
eliminar mientras avanzas un índice hacia delante desplaza los índices posteriores y salta hojas.
Suprime DisplayAlerts para el lote y blinda el recuento de la última hoja visible para que el borrado
final no lance 1004.
Probado en
Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 14/09/2026.
Guías relacionadas: VBA Add Sheet · VBA Copy Sheet · VBA DisplayAlerts · VBA Delete Rows · VBA Manejo de errores
