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

VBA Delete Sheet en Excel — elimina una hoja sin el aviso ni un cuelgue

|

VBA Delete Sheet en Excel — elimina una hoja sin el aviso ni un cuelgue

TL;DRWorksheet.Delete es 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 con Application.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 — Delete es 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