Cuando estamos programando en VBA y necesitamos leer o insertar datos en alguna hoja de un libro será una buena práctica el comprobar si existe la hoja de Excel antes de realizar cualquier acción ya que, en caso de no existir se generará un error en tiempo de ejecución. La siguiente imagen muestra un mensaje típico para este tipo de error:
Comprobar si existe una hoja de Excel
Sabemos que la colección Worksheets contiene todas las hojas de un libro y una opción para comprobar la existencia de cualquiera de ellas sería recorrer dicha colección hasta encontrarla. Considera el código de la siguiente función:
Function BuscarHoja1(nombreHoja As String) As Boolean For i = 1 To Worksheets.Count If Worksheets(i).Name = nombreHoja Then BuscarHoja1 = True Exit Function End If Next BuscarHoja1 = False End Function
La función BuscarHoja1 devolverá el valor falso o verdadero en base al resultado de la búsqueda de la hoja cuyo nombre sea especificado como argumento. Para probar esta función he agregado un botón de comando en la Hoja1 y he escrito el siguiente código en su evento Click:
Private Sub CommandButton1_Click() Dim nombreHoja As String nombreHoja = Range("B1").Value If (BuscarHoja1(nombreHoja)) Then MsgBox nombreHoja & " encontrada" Else MsgBox nombreHoja & " no existe" End If End Sub
Al pulsar el botón se realizará la búsqueda de la hoja tomando en cuenta el nombre indicado en la celda B1. Si para nuestro ejemplo colocamos el nombre “Hoja4” obtendré el siguiente resultado:
Como puedes observar, el libro tiene la Hoja1, Hoja2 y Hoja3 así que al buscar la Hoja4 obtendré un mensaje indicando que dicha hoja no existe. Aunque este método funciona adecuadamente, considero que tiene una desventaja ya que entre más hojas contenga el libro, mayor será el tiempo que se demore en realizar la búsqueda.
Otro método para validar si existe una hoja
El método que prefiero para comprobar la existencia de una hoja de Excel es controlando el error que pueda surgir en caso de que la hoja no exista. En este caso hacemos uso de la instrucción On Error Resume Next cuyo objetivo es ignorar el error y continuar con la ejecución del código en la siguiente línea.
Function BuscarHoja2(nombreHoja As String) As Boolean On Error Resume Next BuscarHoja2 = (Worksheets(nombreHoja).Name <> "") End Function
La segunda línea de código de esta función compara el nombre de la hoja solicitada con una cadena vacía. Si la hoja existe, dicha comparación será verdadera y por lo tanto la hoja existirá, pero si la comparación es falsa querrá decir que la hoja no existe.
Para probar esta función crearé un segundo botón de comando que tendrá el mismo código que el primer botón con la diferencia de que se utilizará la función BuscarHoja2. Al hacer la búsqueda de la Hoja8 con este segundo método obtendremos el siguiente resultado:
Cualquiera de los dos métodos anteriores funcionará correctamente para conocer si una hoja existe dentro de un libro aunque personalmente prefiero el segundo método por la sencillez del código y la ausencia del bucle For.
Crear la hoja si no existe
Las funciones que hemos creado nos ayudarán a conocer la existencia de una hoja, pero en más de una ocasión necesitaremos crear dicha hoja aun cuando no exista. La creación de una hoja desde VBA es muy sencilla utilizando el método Worksheets.Add de la siguiente manera:
Function CrearHoja(nombreHoja As String) As Boolean Dim existe As Boolean On Error Resume Next existe = (Worksheets(nombreHoja).Name <> "") If Not existe Then Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = nombreHoja End If CrearHoja = existe End Function
He decidido dejar este procedimiento como una función para poder devolver un valor verdadero en caso de que la hoja ya exista o un valor falso en caso de que haya sido creada por la función. Ese resultado se almacena en la variable existe que es evaluada para saber si debemos utilizar el método Worksheets.Add para indicar la creación de la nueva hoja la cual tendrá por nombre el valor indicado en el argumento nombreHoja.
El argumento After utilizado en el método Worksheets.Add nos sirve para indicar que la nueva hoja sea creada al final de las hojas existentes. Si quieres saber un poco más sobre éste método de la colección Worksheets te sugiero consultar el artículo Cómo crear hojas de Excel desde VBA.
Para probar esta función agregaré un tercer botón a la hoja y el código de su evento Clck será idéntico a los anteriores. Si especificamos el nombre Hoja4 en la celda B1, al pulsar dicho botón obtendremos el siguiente resultado:
Ya que la Hoja4 no existía, nuestra función hace la creación de la hoja y la coloca al final de las hojas existentes. Si vuelves a hacer clic en el botón para intentar crear de nueva cuenta la Hoja4, se mostrará la advertencia de que la hoja ya existe. De esta manera hemos forzado la creación de una hoja en caso de que no exista.
Dentro del archivo de descarga encontrarás todo el código de los ejemplos. En la Hoja1 estarán los tres botones de comando y podrás observar que cada uno de ellos hace uso de una de las funciones creadas. El código de dichas funciones lo encontrarás en un Módulo dentro del proyecto VBA.