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

VBA Check If Sheet Exists en Excel — una función, y las tres maneras en que sale mal

|

VBA Check If Sheet Exists en Excel — una función, y las tres maneras en que sale mal

TL;DR — No existe Sheets.Exists. Escribe una función, ponla en todos tus proyectos y deja de improvisar: intenta hacer Set sobre la hoja con el control de errores desactivado durante una sola línea, y luego comprueba si la variable es Nothing. Acierta en tres detalles y nunca te mentirá: pregunta a un libro concreto, no al que casualmente esté activo; busca en Sheets, no en Worksheets, porque una hoja de gráfico puede tener ya ese nombre; y pasa el nombre como String, porque un Variant que 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:

  1. Dim sh As Object — Object, no Worksheet, para que se pueda asignar una hoja de gráfico sin un error de tipos.
  2. If wb Is Nothing Then Set wb = ThisWorkbook — un valor por defecto que eliges a propósito, en lugar del ActiveWorkbook implícito que usaría un Sheets sin calificar.
  3. 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.
  4. SheetExists = Not sh Is Nothing — si la búsqueda falló, sh nunca se asignó y sigue siendo Nothing.

Ú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