TL;DR — No existe
Sheets.Exists. Escribe una función, ponla en todos tus proyectos y deja de improvisar: intenta hacerSetsobre la hoja con el control de errores desactivado durante una sola línea, y luego comprueba si la variable esNothing. Acierta en tres detalles y nunca te mentirá: pregunta a un libro concreto, no al que casualmente esté activo; busca enSheets, no enWorksheets, porque una hoja de gráfico puede tener ya ese nombre; y pasa el nombre comoString, porque unVariantque contiene un número se lee como una posición. Recuerda que las hojas ocultas también existen: «existe» no es «visible».
Function SheetExists(ByVal sheetName As String, Optional wb As Workbook) As Boolean
Dim sh As Object
If wb Is Nothing Then Set wb = ThisWorkbook
On Error Resume Next
Set sh = wb.Sheets(sheetName)
On Error GoTo 0
SheetExists = Not sh Is Nothing
End Function
Este es el tercero de una serie de tres artículos sobre la identidad de una hoja. El nombre de la pestaña es una etiqueta que pertenece al usuario. Renombrar cambia esa etiqueta, ocultar quita la pestaña de la vista sin dejar la hoja fuera de alcance, y comprobar si existe, que es lo que vemos aquí, es la verificación que ejecutas antes de fiarte de una etiqueta. Cualquier código que busque una hoja por un nombre que un usuario podría haber cambiado debería hacerse esta pregunta primero.
Lo que aprenderás
- El modelo mental: la existencia es una pregunta sobre un nombre en un libro
- La función, y por qué está ahí cada una de sus líneas
- Tres maneras en que las versiones habituales dan la respuesta equivocada
- Bucle, On Error o Evaluate: qué enfoque usar en cada caso
- Los patrones que dependen de ella: obtener o crear, eliminar si existe, nombres únicos
- Comprobar una hoja en un libro que está cerrado
El modelo mental: un nombre, un libro, un espacio de nombres
«¿Existe la hoja?» es siempre una forma abreviada de una pregunta más precisa: ¿contiene este libro una
hoja de cualquier tipo cuyo nombre coincida con este texto, sin distinguir mayúsculas? Cada parte de esa
frase es un punto donde la comprobación puede fallar. Este libro: no el activo por accidente. Una hoja de
cualquier tipo: las hojas de cálculo y las hojas de gráfico comparten un único conjunto de nombres. Sin
distinguir mayúsculas: SALES y Sales son el mismo nombre para Excel.
Y una hoja que existe puede no estar en pantalla. Las hojas ocultas y muy ocultas siguen en la colección, así que la comprobación las encuentra, que es exactamente lo correcto cuando estás a punto de añadir una hoja con ese nombre, porque Excel rechazaría el duplicado aunque el usuario no pueda verlo.
La función, línea a línea
La versión de arriba hace cuatro cosas, y cada una importa:
Dim sh As Object—Object, noWorksheet, para que se pueda asignar una hoja de gráfico sin un error de tipos.If wb Is Nothing Then Set wb = ThisWorkbook— un valor por defecto que eliges a propósito, en lugar delActiveWorkbookimplícito que usaría unSheetssin calificar.On Error Resume Next...On Error GoTo 0— los errores se ignoran exactamente durante una línea. La búsqueda lanza el error 9 cuando el nombre no existe, que es justo la respuesta que queremos; cualquier otro error en otro sitio sigue a la vista. La guía de On Error explica por qué siempre hay que volver a desactivar el interruptor.SheetExists = Not sh Is Nothing— si la búsqueda falló,shnunca se asignó y sigue siendoNothing.
Úsala siempre que un nombre venga de fuera de tu código: una celda, un usuario, un nombre de archivo:
If SheetExists("Summary") Then
ThisWorkbook.Sheets("Summary").Range("A1").Value = Date
Else
MsgBox "Falta la hoja Summary."
End If
Debug.Print SheetExists("Rates", Workbooks("Prices.xlsx")) ' preguntar a otro libro abierto
Tres maneras en que las versiones habituales dan la respuesta equivocada
1. Preguntar al libro equivocado. Muchos fragmentos llaman a Sheets(name) sin ningún libro delante. Eso
busca en el libro que esté activo cuando se ejecuta la línea, que deja de ser el que querías en cuanto tu
macro ha abierto un segundo archivo. La comprobación dice «no existe», la línea siguiente añade una hoja al
libro equivocado, y no salta ningún error. Pasa o fija siempre el libro de forma explícita, como hace la
función.
2. Buscar en Worksheets en lugar de Sheets. Worksheets solo contiene hojas de cálculo; Sheets también
contiene hojas de gráfico. Los nombres son únicos entre ambas. Así que si una hoja de gráfico se llama
Summary, una comprobación contra Worksheets dice que el nombre está libre, y ws.Name = "Summary" falla
luego con el error 1004. Para la pregunta «¿puedo usar este nombre?», la única colección correcta es
Sheets.
3. Pasar un número sin querer. Sheets(3) significa la tercera hoja; Sheets("3") significa la hoja
llamada 3. Si el nombre llega en un Variant —desde una celda, por ejemplo— y la celda contiene el número
3, la búsqueda va por posición y encuentra la hoja que esté en tercer lugar. La comprobación dice «existe»
para una hoja que no tiene nada que ver con el nombre. Declarar el parámetro como
ByVal sheetName As String fuerza la conversión a texto antes de la búsqueda, y por eso la firma importa.
Bucle, On Error o Evaluate
Verás tres enfoques. Así se comparan:
| Enfoque | Cómo | Veredicto |
|---|---|---|
On Error + Set |
intenta la búsqueda y comprueba si es Nothing |
por defecto — una sola búsqueda, la semántica exacta de Excel |
Bucle + StrComp |
compara cada nombre sin distinguir mayúsculas | claro; úsalo cuando buscas un patrón, no un nombre |
Evaluate("ISREF(...)") |
construye una referencia de fórmula y la prueba | evítalo — se rompe con apóstrofos y hojas de gráfico |
El bucle es la herramienta adecuada cuando «existe» significa en realidad «alguna hoja cuyo nombre empiece por 2026»:
Function FirstSheetLike(wb As Workbook, ByVal pattern As String) As Object
Dim sh As Object
For Each sh In wb.Sheets
If LCase$(sh.Name) Like LCase$(pattern) Then
Set FirstSheetLike = sh
Exit Function
End If
Next sh
End Function
' Set sh = FirstSheetLike(ThisWorkbook, "2026-*") ' Nothing si no coincide ninguna
El truco de Evaluate —Evaluate("ISREF('" & name & "'!A1)")— parece ingenioso y falla de formas
silenciosas: un nombre que contiene un apóstrofo rompe la fórmula salvo que lo dupliques, una hoja de gráfico
no tiene A1 y devuelve False, y la fórmula se evalúa contra el libro activo. Te ahorra dos líneas y te
cuesta tres errores.
Los patrones que se apoyan en ella
Casi todos los usos de la comprobación son uno de tres patrones, y cada uno tiene su propia guía:
' Obtener o crear: reutiliza la hoja si esta ahi, si no, la anade
If SheetExists("Log") Then
Set ws = ThisWorkbook.Worksheets("Log")
Else
Set ws = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
ws.Name = "Log"
End If
' Eliminar si existe: sin error 9 cuando ya no esta
If SheetExists("Temp") Then
Application.DisplayAlerts = False
ThisWorkbook.Sheets("Temp").Delete
Application.DisplayAlerts = True
End If
La guía de Add Sheet cubre el primero a fondo, y la
guía de Delete Sheet el segundo, incluida la regla de la última hoja visible. El
tercero es generar un nombre libre —Report (2), Report (3)—, que la
guía de Rename Sheet construye sobre SheetExists.
La decisión: comprueba los nombres, no dependas de ellos
La comprobación existe porque los nombres son frágiles. Hace seguro el código que tiene que usar un nombre: hojas que crea el usuario, nombres escritos en una celda, archivos de fuera. No es un motivo para seguir buscando tus propias hojas por nombre. Para las hojas que pertenecen a tu herramienta, usa el CodeName y no hay nada que comprobar. Mi regla: si un nombre vino de una persona, compruébalo; si la hoja vino de ti, no la busques por nombre en absoluto. Y para un libro que está cerrado no hay ningún atajo fiable: ábrelo en solo lectura, compruébalo con la misma función y ciérralo.
Cómo te ayuda ExcelMaster
Los fallos de existencia rara vez parecen fallos de existencia. Parecen una hoja añadida al libro equivocado, un cambio de nombre que falla porque una hoja de gráfico ya tenía ese nombre, o una macro que escribe las cifras de un mes en la hoja número 3 porque una celda contenía un número en lugar de texto.
ExcelMaster te deja describir el trabajo —«para cada región de la columna A, reutiliza su hoja si existe o créala»— y escribe la comprobación contra el libro correcto y la colección correcta, con el nombre pasado como texto, para que la lógica de obtener o crear haga lo que dice.
Preguntas frecuentes
¿Cómo compruebo si una hoja existe en VBA?
No hay ningún método integrado, así que usa una pequeña función: desactiva el control de errores, intenta
Set sh = wb.Sheets(name), vuelve a activarlo y devuelve Not sh Is Nothing. Encuentra hojas de cálculo y
hojas de gráfico, visibles u ocultas, y no distingue mayúsculas, igual que Excel.
¿Cómo compruebo si una hoja existe en otro libro?
Pasa ese libro a la función, por ejemplo SheetExists("Rates", Workbooks("Prices.xlsx")). El libro tiene
que estar abierto. Si está cerrado, ábrelo en solo lectura, ejecuta la comprobación y vuelve a cerrarlo.
¿La comprobación del nombre de hoja distingue mayúsculas?
No. Excel trata Sales, SALES y sales como el mismo nombre, así que la búsqueda con Sheets(name) no
distingue mayúsculas. Si recorres y comparas los nombres tú mismo, usa StrComp(a, b, vbTextCompare) o
compara valores con LCase$ para obtener el mismo resultado.
¿Por qué mi comprobación dice que una hoja no existe cuando no puedo añadirla?
Normalmente porque la comprobación buscó en Worksheets y el nombre lo usa una hoja de gráfico, que solo
aparece en Sheets. Los nombres tienen que ser únicos entre ambas, así que comprueba contra Sheets. Una
hoja oculta también puede tener el nombre; la comprobación la encuentra, pero tú no la ves en la fila de
pestañas.
¿Una hoja oculta cuenta como existente?
Sí. Las hojas ocultas y muy ocultas siguen en la colección Sheets, así que la comprobación devuelve True
para ellas. Si necesitas saber si el usuario puede verla, prueba sh.Visible = xlSheetVisible después de la
comprobación.
Probado en
Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 30/09/2026.
Guías relacionadas: VBA Rename Sheet · VBA Hide Sheet · VBA Add Sheet · VBA Delete Sheet · VBA Worksheets · VBA On Error · VBA Like · VBA Open Workbook
