VBA Excel Auto_Open / Auto_Close

Rutinas Auto_Open y Auto_Close

Excel Macros VBA

Las rutinas Auto_Open y Auto_Close se ejecutan en la apertura de un libro y justo antes de cerrarlo y nos pueden venir muy bien para realizar determinadas cosas.

Que son y de donde vienen

Aunque en algunos sitios se puede ver que son reminiscencias de versiones de VBA de la era de los dinosaurios, que posteriormente fueron sustituidas por las correspondientes a Workbook.Open y Workbook.BeforeClose, y que por tanto es mejor no usarlas, eso no es del todo cierto.

Efectivamente, estas rutinas existen desde que Rajoy usaba pantalón corto (aunque creo que lo sigue usando, a veces, en verano). Pero ya me entendéis lo que quiero decir.

Diferencias entre rutinas

Estas rutinas Auto_Open y Auto_Close se ejecutan al abrir un archivo Excel y antes de cerrarlo al igual que Workbook.Open y Workbook.BeforeClose, pero presentan algunas diferencias.

  • Workbook.Open se ejecuta antes que Auto_Open.
  • Workbook.BeforeClose se ejecuta antes que Auto_Close.
  • Si los eventos están anulados por medio de Application.EnableEnvents = False, Workbook.Open y Workbook.BeforeClose mientras que Auto_Open y Auto_Close si que se ejecutan.
  • Si el libro de Excel se abre desde otro vía código VBA, la rutina Auto_Open no se ejecuta, mientras que la Workbook.Open si.

En definitiva, no son exactamente equivalentes y se pueden complementar muy bien mediante llamadas mutuas.

Rutinas Auto_Open y Auto_Close - Orden de ejecución

En la imagen anterior se puede ver el orden de ejecución de los eventos.

Además, en azul, los que se ejecutan sólo si EnableEvents=True y en verde los que se ejecutan sólo si el libro NO SE ABRE vía VBA desde otro libro.

Ejemplo de uso

Vamos a ver un ejemplo de uso de las rutinas Auto_Open y Auto_Close de forma que se complementen con las Wokbook.Open y Workbook.Close y consigamos reforzar la seguridad de nuestro trabajo.

Hacer una hoja muy oculta

Las hojas de un libro pueden tener tres opciones de visualización:

  • Visible
  • Oculta
  • Muy oculta

Las hojas visibles son las que, obviamente, se ven.

Las hojas ocultas son aquellas que se ocultan a la vista haciendo click derecho sobre le nombre de la misma y seleccionando ocultar. Se pueden hacer visibles con el proceso inverso, es decir, haciendo click derecho en el nombre de otra hoja y seleccionando mostrar. Esto nos abre una ventana para seleccionar que hoja de las ocultas queremos hacer visible.

Existe una tercera opción, no muy conocida que es hacer una hoja muy oculta. Esto se puede hacer solo por código, asignando la propiedad xlSheetVeryHidden o bien, abriendo el editor de VBA, seleccionando la hoja y en sus propiedades, cambiando el valor de Visible. Estas hojas no aparecerán en el listado de mostrar comentado para las hojas ocultas.

Proteger un libro de trabajo

Vamos a suponer que tenemos un libro con el que queremos que el usuario interactúe únicamente mediante formularios programados en VBA, pero que no tenga acceso a los datos del mismo de modo directo.

Podría tratarse simplemente de un interface con una base de datos, sin que realmente el libro guarde información relevante.

Una opción sería definir una rutina de tal forma que al cerrar el libro, todas las hojas se ocultasen como xlSheetVeryHidden, dejando visible únicamente una que advierta que solo se puede trabajar en dicho libro habilitando macros.

Si hemos protegido nuestro proyecto VBA con contraseña, evitaremos que el usuario pueda ir a modificar la propiedad Visible de las hojas y se verá obligado a reabrirlo habilitando macros. Eso, si no sabe como eliminar la contraseña de nuestro proyecto, claro. Pensaremos que no sabe…

El riesgo de que los eventos no se ejecuten

Hay mucha gente haciendo macros para Excel. Muchas veces, ves que se abren conexiones que no se cierrar, recordsets que se quedan abiertos, visualizaciones que siguen congeladas, calculos que se quedan en manual… y eventos que se deshabilitan por necesidades del programa en ese momento, que no siempre se habilitan después.

Evitaremos ese riesgo haciendo llamadas entre Workbook.Open y Auto_Open.

El riesgo de que el libro se abra desde otro código

Si el libro se abre desde una llamada programática desde otro libro, el evento Auto_Open no se ejecutará. Estas autollamadas, evitarán esta situación.

Variable global del control

Si definimos una variable a nivel global del proyecto para controlar que el código de bloqueo/desbloqueo del libro se ejecute una solo vez, podremos controlar estas excepciones descritas antes que ocasionarían un posible mal funcionamiento en determinadas circunstancias.

Si esa variables es de tipo boolean, se inicializa a false. Si todo va bien, se ejecutará Worbook.Open y la podremos a True dentro de ese código. Al ejecutar Auto_Open, chequearemos la misma y si es True, saldremos sin ejecutar nada mas. SI fuese false, ejecutaríamos aquí el código para mostrar las hojas ocultadas al salir.

De igual forma, el proceso de salida, tendrá su variable que controlará si se ha ejecutado Workbook.Close, no siendo necesario entonces ejecutar Auto_Close.

Cuidado, que no es oro todo lo que reluce

Este método descrito, nos permite reforzar la seguridad de nuestros libros. Sin embargo, requiere que al finalizar el trabajo con el libro, se ejecute un código para modificar el estado de las hojas (ocultar las que no se deben ver y mostrar el aviso de que se debe trabajar con macros) y se salve el libro para conservar este estado de las hojas.

Esto puede llevarnos a que, en una hoja que si se almacene información relevante, si hemos cometido algún error y queremos salir sin guardar para volver a abrir conservando las condiciones iniciales, sobreescribamos el libro por código y destrocemos el mismo.

Por ello es muy importante saber cuando se puede y cuando no se puede, bajo ningún concepto, automatizar el salvado de un libro.

Conclusión

Hemos visto que son las rutinas Auto_Open y Auto_Close y como se pueden complementar con las Workbook.Open y Workbook.Close en un ejemplo. Seguro que se te ocurren otras formas de aprovechar su utilidad.

Si quieres dejar tu comentario sobre como crees que se puede aprovechar su potencial, estaremos encantados de aprender de ello.

Y si te interesa la programación en VBA, no dejes de consultar otros artículos en la zona dedicada a VBA.

Deja una respuesta