Opciones para cerrar

ColdGeorge

Active Member
Joined
Aug 21, 2012
Messages
407
Office Version
  1. 2016
Platform
  1. Windows
Hola amigos

Estoy buscando ofrecer al usuario opciones para 1) cancelar el proceso, 2) cerrar su archivo y conservar Excel abierto, y 3) cerrar su archivo y Excel, por alguna razón no logro conseguirlo, esto es lo que llevo, cualquier ayuda se agradecerá.

Code:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If MsgBox("¿Quieres cerrar el archivo?", vbYesNo, "Por favor confirma") = vbNo Then
    Cancel = True
    Exit Sub
        ElseIf MsgBox("¿Quieres cerrar Excel?", vbYesNo, "Confirma") = vbNo Then
            Cancel = True
            Exit Sub
            Application.ThisWorkbook.Close
                Else
                Application.Quit
End If
End Sub

Saludos, ColdGeorge
 
Last edited:
Sólo para estar seguro, usted tiene el código exacto del mensaje # 5? Y cuando presiona "sí" o "no" a la segunda pregunta, sucede lo mismo, o recibe las dos acciones correctas, sólo por la respuesta equivocada?


Si es sólo para la respuesta equivocada, puede cambiar a vbYes a vbNo y debería funcionar.

Hola Eric
Edité el código y ahora probé el siguiente:

Code:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If MsgBox("¿Quieres cerrar el archivo?", vbYesNo, "Por favor confirma") = vbNo Then
    Cancel = True
    Exit Sub
End If
   
ThisWorkbook.Saved = True
    If MsgBox("¿Quieres cerrar Excel?", vbYesNo, "Confirma") = vbNo Then Application.Quit
End Sub

Resumiendo, al presionar el botón cerrar, aparece la primera pregunta, ¿quieres cerrar el archivo?, al presionar NO, no sucede nada, al presionar , aparece la segunda pregunta, ¿quieres cerrar Excel?, al presionar NO, se cierra Excel y consecuentemente el archivo, al presionar , se cierra Excel y consecuentemente el archivo.

Ya no sé que hacer, ColdGeorge.
 
Upvote 0

Excel Facts

Select all contiguous cells
Pressing Ctrl+* (asterisk) will select the "current region" - all contiguous cells in all directions.
Creo que finalmente me di cuenta de lo que está pasando. Al cerrar el archivo, usted está usando la X roja en la esquina superior derecha de la ventana. Eso es en realidad el botón "cerrar la aplicación", no el botón "Cerrar archivo". Excel intenta cerrar primero el archivo, por lo que el código se ejecuta BeforeClose, pero después de que se ejecuta, a continuación, la aplicación se cerrará. Las versiones anteriores de Excel tenían 2 botones X, una para el archivo, uno para la aplicación.

En primer lugar, cambiar la vbNo de nuevo a vbYes (el código de puesto 4 #). Ahora cuando se cierra el archivo, si hace clic en Archivo> Cerrar en la barra de menús, el código debería funcionar como se esperaba.

También puede agregar "Archivo> Cerrar" para la "barra de acceso rápido" (QAT), por lo que tiene una forma de cerrar el archivo con un solo clic.

Voy a experimentar con el código para ver si hay una manera para que funcione como usted desee utilizando la X superior derecha, pero no soy demasiado optimista.
 
Upvote 0
Creo que finalmente me di cuenta de lo que está pasando. Al cerrar el archivo, usted está usando la X roja en la esquina superior derecha de la ventana. Eso es en realidad el botón "cerrar la aplicación", no el botón "Cerrar archivo". Excel intenta cerrar primero el archivo, por lo que el código se ejecuta BeforeClose, pero después de que se ejecuta, a continuación, la aplicación se cerrará. Las versiones anteriores de Excel tenían 2 botones X, una para el archivo, uno para la aplicación.

En primer lugar, cambiar la vbNo de nuevo a vbYes (el código de puesto 4 #). Ahora cuando se cierra el archivo, si hace clic en Archivo> Cerrar en la barra de menús, el código debería funcionar como se esperaba.

También puede agregar "Archivo> Cerrar" para la "barra de acceso rápido" (QAT), por lo que tiene una forma de cerrar el archivo con un solo clic.

Voy a experimentar con el código para ver si hay una manera para que funcione como usted desee utilizando la X superior derecha, pero no soy demasiado optimista.

Hola de nuevo Eric

Probé el código siguiente, sin hacer ningún cambio.

Code:
Private Sub Workbook_BeforeClose(Cancel As Boolean)


If MsgBox("¿Quieres cerrar el archivo?", vbYesNo, "Por favor confirma") = [B][COLOR=#ff0000]vbNo [/COLOR][/B]Then
    Cancel = True
    Exit Sub
End If
   
ThisWorkbook.Saved = True
    If MsgBox("¿Quieres cerrar Excel?", vbYesNo, "Confirma") = [B][COLOR=#ff0000]vbYes [/COLOR][/B]Then Application.Quit
End Sub

Los resultados los describo a continuación, esta vez voy a Archivo, Cerrar, y se muestra la primera pregunta, al presionar NO, lo de costumbre no sucede nada, al presionar , se muestra la segunda pregunta, ¿quieres cerrar Excel? al presionar NO, se cierra el archivo (tal y como lo deseo), al presionar , se cierra el archivo y Excel.

Por un momento pensé que mi computadora estaba poseída por alguna maligna fuerza extra terrestre, ahora bien, generalmente, como yo lo hice, el usuario va a presionar la X arriba a la derecha para salir, ¿cómo deshabilito la función cerrar de la X?

Gracias Eric, saludos, ColdGeorge.
 
Upvote 0
Si usted está usando el código mostrado arriba, la equis roja ya debe de estar deshabilitado. Cuando un especifica vbYesNo, ese [X] está deshabilitado. Para que esté habilitado uno tiene que usar vbYesNoCancel.
 
Upvote 0
Si usted está usando el código mostrado arriba, la equis roja ya debe de estar deshabilitado. Cuando un especifica vbYesNo, ese [X] está deshabilitado. Para que esté habilitado uno tiene que usar vbYesNoCancel.

Hola Greg

Gracias por tu comentario, pero entonces, mi equipo está hechizado, ya que al presionar la X, se activa el código y no debiera ser así, ahora vendría bien un aviso al presionar la X para forzar ir a Archivo, Cerrar, saludos.

ColdGeorge
 
Upvote 0
¡Uy! No entendí bien. Creía que usted estaba diciendo que los mensajes de sí o no estaban mostrando las equis rojas. Pues, sí, el evento de _BeforeClose se levanta al cerrar el archivo; no importa cómo.
 
Upvote 0
Greg, el problema es la diferencia entre el cierre de un archivo con el comando Archivo> Cerrar opción, o mediante el uso de la equis roja en la esquina superior derecha de Excel. Si alguien utiliza la equis roja para cerrar el archivo, a continuación, Excel se cerrará también. Eso no es lo que quiere ColdGeorge.

No sé si hay una manera de desactivar la equis, o si hay una manera en el código BeforeClose desactivar el código Application.Exit pasado de la equis.
 
Upvote 0
Hola Eric y Greg

Voy a estar muy atento a sus comentarios para que me ayuden a lograr el objetivo, gracias.

ColdGeorge
 
Upvote 0
Gracias, Eric. Eso sí me hizo reír. Se me había olvidado por completo que Excel hace eso porque nunca cierro un cuaderno así, con tal equis, sino siempre uso Ctrl+W. Bueno, pruebe el siguiente. Me funciona, pero admito que aunque Excel permanece abierto, tengo que usar {tecla de Windows}+{flecha izquierda (o derecho)} para ajustar la ventana principal de Excel porque sale desplegado de manera muy rara.


Code:
Private Sub Workbook_BeforeClose(Cancel As Boolean)


    Static s_intCloseCount As Integer


    If s_intCloseCount <> 0 Then Exit Sub


    If MsgBox("¿Quieres cerrar el archivo?", vbYesNo, "Por favor confirma") = vbNo Then
        Cancel = True
        Exit Sub
    End If


    ThisWorkbook.Saved = True
    If MsgBox("¿Quieres cerrar Excel?", vbYesNo, "Confirma") = vbYes Then
        Application.Quit
    Else
        Cancel = True
        Let s_intCloseCount = s_intCloseCount + 1
        ActiveWindow.Close
    End If


End Sub
 
Last edited:
Upvote 0
Un poco más elegante.


Code:
Private Sub Workbook_BeforeClose(Cancel As Boolean)


    Static s_intCloseCount As Integer


    If s_intCloseCount <> 0 Then Exit Sub


    If MsgBox("¿Quieres cerrar el archivo?", vbYesNo + vbQuestion, "Por favor confirma") = vbNo Then
        Cancel = True
        Exit Sub
    End If
   
    ThisWorkbook.Saved = True
    If fnVisibleWindowCount = 1 Then
   
        If MsgBox("¿Quieres cerrar Excel?", vbYesNo + vbQuestion + vbDefaultButton2, "Confirma") = vbYes Then
            Application.Quit
        Else
            Cancel = True
            Let s_intCloseCount = s_intCloseCount + 1
            ActiveWindow.Close
        End If
    
    End If


End Sub


' _____________________________________________________________________________
' fn VISIBLE WINDOW COUNT
' ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
' Descrip:  Pretty simple - the # of visible windows
'
' Args:    [wbToCount]· · · · · count visible windows for one workbook instead
'                               of for application as a whole.
'          [booCountHidden] · · toggle to return the # of hidden windows instead
'
' Returns:  Integer · · · · · · # of visible windows
'
' Date          Developer   Comments
' ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨
' 01 Nov 2009   G. Truby    • initial version very old, moved here on this date
' 15 Nov 2011   G. Truby    • added toggle
' _____________________________________________________________________________
' ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  Function fnVisibleWindowCount(Optional ByRef wbToCount As Excel.Workbook, _
                                Optional ByVal booCountHidden As Boolean = False) _
                                As Integer
' _____________________________________________________________________________


    Dim o As Object, _
        w As Excel.Window, _
        v%
    
    If wbToCount Is Nothing Then
        Set o = Application
    Else
        Set o = wbToCount
    End If
    
    For Each w In o.Windows
        Let v = v - w.Visible           '// TRUE is (-1) in VBA
    Next w
    
    Let fnVisibleWindowCount = IIf(booCountHidden, _
                                   o.Windows.Count - v, _
                                   v)


End Function
 
Last edited:
Upvote 0

Forum statistics

Threads
1,214,883
Messages
6,122,077
Members
449,064
Latest member
MattDRT

We've detected that you are using an adblocker.

We have a great community of people providing Excel help here, but the hosting costs are enormous. You can help keep this site running by allowing ads on MrExcel.com.
Allow Ads at MrExcel

Which adblocker are you using?

Disable AdBlock

Follow these easy steps to disable AdBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the icon in the browser’s toolbar.
2)Click on the "Pause on this site" option.
Go back

Disable AdBlock Plus

Follow these easy steps to disable AdBlock Plus

1)Click on the icon in the browser’s toolbar.
2)Click on the toggle to disable it for "mrexcel.com".
Go back

Disable uBlock Origin

Follow these easy steps to disable uBlock Origin

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back

Disable uBlock

Follow these easy steps to disable uBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back
Back
Top