Eliminar Hojas de Trabajo

Para eliminar una hoja de trabajo en VBA se usa el método Worksheet.Delete.

Sin embargo, al ejecutarlo tal cual puede aparecer un cuadro de confirmación, y se produce un error si la hoja no existe, por lo que en la práctica hay que tener en cuenta algunos puntos.

Este artículo explica el código básico, cómo ocultar el mensaje de confirmación, comprobar la existencia, eliminar varias hojas a la vez y qué hacer cuando una hoja no se puede eliminar.

Código básico para eliminar una hoja de trabajo

Código
Private Sub DeleteSheet()
  ThisWorkbook.Worksheets("Sheet1").Delete
End Sub

Este código elimina la hoja llamada “Sheet1” del libro que contiene la macro.

Si escribes Worksheets("Sheet1") sin indicar el libro, el destino es el libro activo. Cuando hay varios libros abiertos, indica explícitamente ThisWorkbook (el libro que contiene la macro) o ActiveWorkbook para no eliminar una hoja del libro equivocado.

Diferencia entre Worksheets y Sheets

Worksheets es la colección de hojas de cálculo únicamente, mientras que Sheets incluye también las hojas de gráficos. Si solo trabajas con hojas de cálculo, Worksheets es suficiente.

Eliminar sin mostrar el mensaje de confirmación

Al eliminar una hoja que contiene datos aparece un cuadro de confirmación y la macro se detiene hasta que el usuario responde.

Si estableces Application.DisplayAlerts = False, el cuadro no se muestra y la hoja se elimina (se aplica la opción predeterminada del cuadro, “Eliminar”).

Eliminar
Private Sub DeleteSheetWithoutAlert()
    Application.DisplayAlerts = False
    ThisWorkbook.Worksheets("Sheet1").Delete
    Application.DisplayAlerts = True
End Sub
Advertencia

Eliminar una hoja no se puede deshacer (Ctrl + Z no la restaura). Además, si la macro termina con DisplayAlerts en False, las advertencias seguirán ocultas en otras operaciones. Vuelve siempre a establecerlo en True después de eliminar.

Eliminar una hoja solo si existe

Si llamas a Delete con el nombre de una hoja inexistente, se produce el error en tiempo de ejecución 9 (El subíndice está fuera del intervalo). Si conviertes la comprobación en una función, podrás reutilizarla antes de cada eliminación.

Comprobar
Private Function SheetExists(ByVal sheetName As String) As Boolean
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        If StrComp(ws.Name, sheetName, vbTextCompare) = 0 Then
            SheetExists = True
            Exit Function
        End If
    Next ws
End Function

Private Sub DeleteSheetIfExists(ByVal sheetName As String)
    If Not SheetExists(sheetName) Then
        MsgBox "La hoja '" & sheetName & "' no existe."
        Exit Sub
    End If

    Application.DisplayAlerts = False
    ThisWorkbook.Worksheets(sheetName).Delete
    Application.DisplayAlerts = True
End Sub

También puedes intentar Set ws = Worksheets(sheetName) bajo On Error Resume Next, pero el código que oculta errores puede pasar por alto errores no relacionados, por eso aquí se usa una comprobación con bucle.

Eliminar varias hojas a la vez

Pasa los nombres de las hojas como matriz y elimínalas en un bucle.

Eliminar
Private Sub DeleteMultipleSheets(ByVal sheetNames As Variant)
    Dim sheetName As Variant

    On Error GoTo Cleanup
    Application.DisplayAlerts = False
    For Each sheetName In sheetNames
        If SheetExists(CStr(sheetName)) Then
            ThisWorkbook.Worksheets(CStr(sheetName)).Delete
        End If
    Next sheetName

Cleanup:
    Application.DisplayAlerts = True
    If Err.Number <> 0 Then MsgBox Err.Description
End Sub

Sub ExecuteDeleteMultipleSheets()
    DeleteMultipleSheets Array("Sheet1", "Sheet2", "Sheet3")
End Sub

Las hojas que no existen se omiten gracias a SheetExists, así que el proceso termina aunque falten algunas.

Pasar una matriz directamente a Worksheets

También puedes eliminar de una vez pasando una matriz de nombres, como en ThisWorkbook.Worksheets(Array("Sheet1", "Sheet2")).Delete. Pero produce un error si aunque sea un solo nombre no existe.

No se pueden eliminar todas las hojas

Un libro debe conservar al menos una hoja visible. Si intentas eliminar todas, falla al llegar a la última. Para reemplazar hojas, agrega primero la nueva y luego elimina la antigua.

Manejo de errores

Cuando la eliminación pueda fallar, añade manejo de errores con On Error GoTo. En particular, si ocurre un error mientras DisplayAlerts es False, la ejecución sale del procedimiento antes de volver a ponerlo en True, así que restáuralo también dentro del manejador de errores.

Ejemplo
Private Sub DeleteSheetWithErrorHandling(ByVal sheetName As String)
    On Error GoTo ErrorHandler

    Application.DisplayAlerts = False
    ThisWorkbook.Worksheets(sheetName).Delete
    Application.DisplayAlerts = True
    Exit Sub

ErrorHandler:
    Application.DisplayAlerts = True
    MsgBox "Ocurrió un error al intentar eliminar la hoja: " & Err.Description
End Sub

Mostrar tu propia confirmación antes de eliminar

Para evitar eliminaciones accidentales, muestra tu propio mensaje de confirmación.

Ejemplo
Private Sub DeleteSheetWithConfirmation(ByVal sheetName As String)
    If Not SheetExists(sheetName) Then
        MsgBox "La hoja '" & sheetName & "' no existe."
        Exit Sub
    End If

    If MsgBox("¿Realmente desea eliminar '" & sheetName & "'?", vbYesNo + vbQuestion, "Confirmar eliminación") = vbYes Then
        Application.DisplayAlerts = False
        ThisWorkbook.Worksheets(sheetName).Delete
        Application.DisplayAlerts = True
    End If
End Sub

Por qué no se puede eliminar una hoja y cómo solucionarlo

Cuando la estructura del libro está protegida

No se pueden agregar ni eliminar hojas mientras esté activada la opción “Proteger estructura del libro”. Quita primero la protección y luego elimina.

Private Sub UnprotectWorkbookAndDelete(ByVal sheetName As String)
    ThisWorkbook.Unprotect Password:="yourpassword"
    DeleteSheetIfExists sheetName
    ThisWorkbook.Protect Password:="yourpassword", Structure:=True
End Sub
La protección de hoja no impide eliminarla

Aunque esté activada la “Protección de hoja” (Worksheet.Protect), la hoja puede eliminarse igualmente. Si no se puede eliminar, revisa la “protección de la estructura del libro” y no la protección de la hoja.

Cuando el libro está compartido (función heredada)

En un libro que usa la antigua función “Compartir libro” no se pueden eliminar hojas. Cambia a acceso exclusivo con ExclusiveAccess (el libro debe estar guardado y se desconecta a los demás usuarios) y luego elimina.

Private Sub UnshareWorkbookAndDelete(ByVal sheetName As String)
    If ThisWorkbook.MultiUserEditing Then
        ThisWorkbook.ExclusiveAccess
    End If
    DeleteSheetIfExists sheetName
End Sub

Ten en cuenta que “Compartir libro” está obsoleto; se recomienda migrar a la coautoría (colaboración en tiempo real en OneDrive / SharePoint).

Preguntas de repaso

Pregunta de repaso
Pregunta de repaso

Resumen

  • Elimina una hoja con Worksheets("NombreHoja").Delete e indica explícitamente el libro de destino, por ejemplo con ThisWorkbook
  • Oculta el cuadro de confirmación con Application.DisplayAlerts = False y vuelve siempre a ponerlo en True
  • Eliminar una hoja inexistente produce un error, así que comprueba antes que existe
  • Si no se puede eliminar, sospecha de la protección de la estructura del libro o de un libro compartido
#vba #Operaciones de Excel #worksheet #hoja de trabajo