Si Roy mantiene presionada la tecla Shift al abrir un libro de trabajo, Excel omite la ejecución de cualquier macros «automática» que normalmente se ejecutaría, incluido el evento Workbook_Open. Se pregunta si hay una manera igualmente fácil, al cerrar un libro de trabajo, de hacer que Excel omita el evento Workbook_BeforeClose.

No existe una forma igualmente sencilla. Eso no significa que no se pueda hacer, pero «igualmente fácil» generalmente significa «algo integrado; alguna tecla para presionar o configuración para hacer». Tales claves y configuraciones para omitir el evento BeforeClose simplemente no están integradas en Excel.

Lo que puede hacer es ajustar la forma en que programa el evento BeforeClose para que, si se cumple una condición en particular, se omita el código dentro del controlador de eventos. Un enfoque fácil es simplemente omitir el código si se selecciona una celda de hoja de trabajo en particular, de esta manera:

Private Sub Workbook_BeforeClose(Cancel As Boolean)

If ActiveCell.Address = "$Z$27" Then Exit Sub     '     ' Your normal code here...

' End Sub

En este caso, si la celda activa, la seleccionada cuando se activa el evento BeforeClose, es la celda Z27, se omite el código normal en el controlador de eventos. Si se selecciona cualquier otra celda, no se omite. (Elegí la celda Z27 a propósito porque es esotérica y oscura. Por supuesto, puedes cambiar el código para reflejar cualquier otra celda que desees).

Si está decidido a verificar si se mantiene presionada la tecla Shift, puede hacerlo utilizando la API de Windows. Esto implica agregar código al área de declaraciones de un módulo. Este puede ser un módulo regular; no tiene que estar en la ventana de código de ThisWorkbook. Solo necesita asegurarse de que esté en el área de declaraciones, antes de que se declare cualquier procedimiento.

#If VBA7 Then     Declare PtrSafe Function GetKeyState Lib "USER32" (ByVal vKey As Long) As Integer #Else     Declare Function GetKeyState Lib "USER32" (ByVal vKey As Long) As Integer #End If

Tenga en cuenta que la directiva condicional #Si VBA7 se usa de modo que si está usando Excel 2010 o posterior, se usará la sintaxis correcta de la declaración para que no haya errores en las versiones de 32 bits o 64 bits del programa.

Ahora, dentro de su controlador de eventos BeforeClose, puede hacer lo siguiente:

Private Sub Workbook_BeforeClose(Cancel As Boolean)

Const VSHIFT = &H10     Const SHIFTED = &H80

If GetKeyState(VSHIFT) And SHIFTED Then Exit Sub     '     ' Your normal code here...

' End Sub

Si se mantiene presionada la tecla Mayús mientras se activa el evento BeforeClose, se omite el código BeforeClose. Debe tener en cuenta que puede ser un poco difícil determinar cuándo mantener presionada la tecla Shift o si la ha mantenido presionada el tiempo suficiente. Por esta razón, tiendo a preferir mejor el enfoque de «comprobar ActiveCell», ya que simplemente puede seleccionar la celda, cerrar el libro de trabajo y olvidarse de él.

ExcelTips es su fuente de formación rentable en Microsoft Excel.

Este consejo (2628) se aplica a Microsoft Excel 2007, 2010, 2013 y 2016.