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
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.
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”).
Private Sub DeleteSheetWithoutAlert()
Application.DisplayAlerts = False
ThisWorkbook.Worksheets("Sheet1").Delete
Application.DisplayAlerts = True
End Sub
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.
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.
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.
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.
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.
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
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
Resumen
- Elimina una hoja con
Worksheets("NombreHoja").Deletee indica explícitamente el libro de destino, por ejemplo conThisWorkbook - Oculta el cuadro de confirmación con
Application.DisplayAlerts = Falsey 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