domingo, 19 de septiembre de 2021

48 - Eventos del Libro Excel

 Si bien en entradas anteriores (Eventos de Hoja Excel) ya vimos algunos ejemplos de macros colocadas a nivel de Libro, a continuación veremos los principales eventos para el objeto Libro, es decir aquellas macros que colocamos en el objeto ThisWorkBook.

OPEN: se ejecuta al abrir un libro. Aquí colocaremos las instrucciones que nos mostrará el libro con el formato deseado: qué barras quitamos, cómo ver la pantalla, qué hoja mostramos primero, qué hojas ocultamos, y así con el resto.

Ejemplo

Private Sub Workbook_Open()

Sheets("MENU").Select                       'hoja de inicio

[B3].Select

 

ActiveWindow.DisplayWorkbookTabs = False     'sin pestañas

Application.DisplayFormulaBar = False        'sin barra fórmula

Userform1.Show                                'mostrar un Userform

End Sub


ACTIVATE: se ejecuta al activar un libro. Al abrir el libro ya se lo está activando. Pero aquí colocaremos las instrucciones que necesitamos que se ejecuten al pasar de otro libro a éste que ya se encuentra abierto. Por ejemplo, mostrar una hoja que siempre está oculta y al entrar al libro la necesitamos hacer visible para ejecutar algún proceso.

Ejemplo: 

Private Sub Workbook_Activate()

Sheets("Resultados").Visible = True

End Sub


DEACTIVATE: se ejecuta cuando desactivamos el libro, ya sea para pasar a otro o para cerrarlo. Siguiendo el ejemplo anterior, aquí podríamos volver a ocultar la hoja que mostramos al activarlo.

Nota: las instrucciones se ejecutan estando ya en el nuevo libro activado. Por lo tanto hay que indicarle el nombre del que se acaba de desactivar para realizar alguna acción allí.

Ejemplo: 

Private Sub Workbook_Deactivate()

Workbooks("RESUMEN ANUAL.xlsm").Sheets("Resultados").Visible = xlVeryHidden

MsgBox "Acabas de salir del libro RESUMEN"

End Sub


BEFORE PRINT: se ejecuta al llamar a la opción de Impresión. En este evento se puede indicar cuál será la impresora a utilizar, la cantidad de copias. También se puede evitar la impresión de alguna hoja como en la siguiente macro:

Ejemplo: 

Private Sub Workbook_BeforePrint(Cancel As Boolean)

'seleccionar la impresora

 

'impedir que cierta hoja se imprima

If ActiveSheet.Name = "Resultados" Then Cancel = True

End Sub


BEFORE SAVE: se ejecuta al guardar el libro. Aquí podríamos indicar el guardado de alguna copia en otra subcarpeta. También es conveniente dejar el libro con las mismas medidas de seguridad que veremos en el evento siguiente.

Ejemplo

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

'guardar además una copia

ActiveWorkbook.SaveCopyAs ThisWorkbook.Path & "/COPIAS/" & Format(Now, "hh-mm-ss") & "_" & ActiveWorkbook.Name

End Sub


BEFORE CLOSE: se ejecuta al cerrar el libro. Aquí podríamos dejar las mismas instrucciones que en el guardado si no desarrollamos el evento BeforeSave (hacer una copia en otra subcarpeta). 

Nota: Es conveniente dejar el libro con las mismas medidas de seguridad que establecemos en el evento Open. Es decir que si al abrir ocultamos ciertas hojas, debiéramos dejarlas también ocultas aquí en este evento como también en el de guardado (Save). Considerar que al abrir un libro bien podría abrirse sin habilitar las macros y por lo tanto no se ejecutarán las instrucciones de Open.... lo que dejaría visibles aquellas hojas a proteger.

Ejemplo

Private Sub Workbook_BeforeClose(Cancel As Boolean)

'ocultar algunas hojas

Sheets("Resultados").Visible = xlVeryHidden

End Sub


NEWSHEET: se ejecuta al insertar una nueva hoja. Ya sea que presionemos el botón + desde las pestañas como si ejecutemos una instrucción agregando una nueva hoja. Podemos indicarle por ejemplo la ubicación.

Ejemplo

Private Sub Workbook_NewSheet(ByVal Sh As Object)

ActiveSheet.Move Before:=Sheets("Enero")

End Sub


Los eventos iniciados con SHEET:  son las mismas macros que colocaríamos en los objetos HOJA. Pero que tienen un alcance a todas las hojas del libro, exceptuando las que no requieran de estos procesos. 

Ejemplo:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

If ActiveSheet.Name <> "PORTADA" And ActiveSheet.Name <> "MENU" Then

    Call procesoHoja

End If

End Sub


Importante: si se programa un evento iniciado con Sheet en el objeto ThisWorkBook no debe ser colocado en el objeto HOJA si se trata del mismo proceso. 


Ver video N° 48