BeforeClose en Addin, problema al 'Cancelar' el cierre.

30/03/2007 - 13:16 por L. Garcia | Informe spam
Hola:

Tengo la Personal.XLS con diferentes opciones, que controla incluso los
eventos de los libros abiertos, etc.

Cuando finaliza 'la sesión' de Excel, tengo que liberar todo lo que se ha
usado y para ello uso el evento BeforeClose.

Pero el problema es que si se le da al boton de 'Cerrar Excel' (la cruz de
cerrar, vamos), se ejecuta el evento BeforeClose de mi Personal.XLS. Pero si
existe algun fichero abierto y modificado, se puede 'Cancelar' el cierre de
Excel, con lo que mi Personal.XLS queda 'descuajeringada', es decir, ya se
ha limpiado todo, y ya no hace lo que tiene que hacer.

Pregunta:

¿ Como se puede evitar esto ?

Posibles opciones:
Forzar a que mi BeforeClose sea el ultimo. ¿ como ?
Que no se pueda cancelar el cierre ¿ como ?
Algun otro evento 'final' ¿ cual ?
(no sirve _AddinUnInstall() porque no es cuando 'desintalo' el Addin,
sino al finalizar 'cada sesión' de Excel)
Algun evento que se ejecute despues de BeforeClose ¿ cual ?
(la personal.xls no está visible, no sirven _Activate, _Calculates,
etc.)

En principio para la XLS2000, pero no habria problema si la solucion es para
XP :-)))

Gracias por leer hasta aqui

Saludos

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
31/03/2007 - 07:05 | Informe spam
hola, luis !

Tengo la Personal.XLS con diferentes opciones, que controla incluso los eventos de los libros abiertos, etc.
Cuando finaliza 'la sesión' de Excel, tengo que liberar todo lo que se ha usado y para ello uso el evento BeforeClose.
Pero el problema es que si se le da al boton de 'Cerrar Excel' (la cruz de cerrar, vamos)
se ejecuta el evento BeforeClose de mi Personal.XLS.
Pero si existe algun fichero abierto y modificado, se puede 'Cancelar' el cierre de Excel
con lo que mi Personal.XLS queda 'descuajeringada', es decir, ya se ha limpiado todo, y ya no hace lo que tiene que hacer...



revisa la informacion de la siguiente pagina:
Handling the Workbook BeforeClose Event
http://j-walk.com/ss/excel/tips/tip78.htm

saludos,
hector.
Respuesta Responder a este mensaje
#2 L. Garcia
02/04/2007 - 09:43 | Informe spam
Hola Hector
Gracias de nuevo por contestar a mis dudas :-)

Respecto al link que me indicas, ya habia consultado alguno parecido y, en
principio, no me sirve. Te lo explico:

El problema no es que la Personal.XLS este pendiente de grabar, puesto que
es invisible y no se puede modificar (es mas, no lo permito, en _BeforeClose
pongo .Saved = True)

El problema es que quiero que un evento _BeforeReallyClose ;-))), puesto que
me pasa lo que comentaba. Si existe 'algun otro fichero' pendiente de
grabar, cuando dan a cerrar Excel, se ejecuta el _BeforeClose de mi
Personal, 'y despues' pregunta al usuario si quiere `[ Guardar, No guardar y
Cancelar ]. Y si responden Cancelar, la Personal.XLS ya ha ejecutado el
_BeforeClose.

Una posible solucion (se me esta ocurriendo ahora mismo) seria en mi
_BeforeClose(), recorrer todos los workbooks pendientes de grabar y hacer
una pregunta de 'Guardar TODO los libros abiertos', y segun lo que
respondan, continuar con mi _BeforeClose().

Otra solucion que intente fue 'modificar' el _BeforeSave() de Excel,
mediante una clase que controla los eventos, pero me daba muchos problemas.

Bueno, si se te ocurre alguna solucion, estaria encantado de oirla, y si la
solucion indicada funciona, lo expondre al grupo.

Saludos y gracias

"Héctor Miguel" escribió en...
hola, luis !

> Tengo la Personal.XLS con diferentes opciones, que controla incluso los


eventos de los libros abiertos, etc.
> Cuando finaliza 'la sesión' de Excel, tengo que liberar todo lo que se


ha usado y para ello uso el evento BeforeClose.
> Pero el problema es que si se le da al boton de 'Cerrar Excel' (la cruz


de cerrar, vamos)
> se ejecuta el evento BeforeClose de mi Personal.XLS.
> Pero si existe algun fichero abierto y modificado, se puede 'Cancelar'


el cierre de Excel
> con lo que mi Personal.XLS queda 'descuajeringada', es decir, ya se ha


limpiado todo, y ya no hace lo que tiene que hacer...

revisa la informacion de la siguiente pagina:
Handling the Workbook BeforeClose Event
http://j-walk.com/ss/excel/tips/tip78.htm

saludos,
hector.


Respuesta Responder a este mensaje
#3 Héctor Miguel
02/04/2007 - 11:23 | Informe spam
hola, Luis !

Respecto al link que me indicas, ya habia consultado alguno parecido y, en principio, no me sirve. Te lo explico:
El problema no es que la Personal.XLS este pendiente de grabar, puesto que es invisible y no se puede modificar
(es mas, no lo permito, en _BeforeClose pongo .Saved = True)
El problema es que quiero que un evento _BeforeReallyClose ;-))), puesto que me pasa lo que comentaba.
Si existe 'algun otro fichero' pendiente de grabar, cuando dan a cerrar Excel, se ejecuta el _BeforeClose de mi Personal
y 'despues' pregunta al usuario si quiere '[Guardar, No guardar y Cancelar].
Y si responden Cancelar, la Personal.XLS ya ha ejecutado el _BeforeClose.
Una posible solucion (se me esta ocurriendo ahora mismo) seria en mi _BeforeClose()
recorrer todos los workbooks pendientes de grabar y hacer una pregunta de 'Guardar TODO los libros abiertos'
y segun lo que respondan, continuar con mi _BeforeClose()...



[creo que] este 'recorrido' por los libros pendientes de guardar es la mejor 'apuesta' que tienes para tu '_BeforeReallyClose' :))

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim Lbro As Workbook
For Each Libro In Workbooks
If Not Libro.Saved Then
MsgBox "Existen libros con cambios pendientes de guardar" & vbCr & _
"Es necesario que no haya libros abiertos 'pendientes'" & vbCr & _
"para poder dar por terminada ESTA sesion de Excel !!!"
Cancel = True: Exit Sub
End If
Next
MsgBox "Terminando mis acciones de cerrado..."
End Sub

nota: si NO usas [p.e.] el primer MsgBox, y existe algun libro SIN guardar cambios recientes [o en la sesion]...
-> [sencillamente] la aplicacion NO se dara por terminada [al cancelarse el evento de salida de algun libro]
pero el usuario no sabria la causa por la que no 'puede' salir de la aplicacion :))

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.
Respuesta Responder a este mensaje
#4 L. Garcia
02/04/2007 - 12:40 | Informe spam
Hola Hector:

De nuevo, muchas gracias por tu ayuda.

Pues si, al final es lo que he hecho y funciona bastante bien, al menos para
lo que yo quiero :-) Pongo como lo he solucionado:

''' Funcion para recorrer y guardar (preguntando) todos los WorkBooks
''' pendientes de guardar.
Public Function BOOKs_Save() As VbMsgBoxResult
''' Valores de retorno:
''' vbCancel si en algún momento se ha cancelado.
''' vbYes si se ha guardado algun libro (y no se ha cancelado)
''' vbYes si no se ha guardado ningún libro (y no se ha cancelado)
Dim oWb As Workbook
Dim nResp As VbMsgBoxResult

On Error Resume Next

BOOKs_Save = vbNo
For Each oWb In Application.Workbooks
If Not oWb.Saved Then
nResp = MsgBox("¿ Desea guardar los cambios efectuados en '" &
oWb.Name & "' ?", vbYesNoCancel)
If nResp = vbCancel Then
BOOKs_Save = vbCancel
Exit For
End If
If nResp = vbYes Then
If oWb.Path = "" Then
''' Es un libro 'nuevo' que nunca se ha guardado, se
deberia de preguntar donde guardar.
''' Yo ya tengo una funcion que lo hace y me devuelve
vbYes/vbNo/vbCancel segun lo que se haya realizado :-)
nResp = BOOK_SavePrimeraVez(oWb)
If nResp = vbCancel Then
BOOKs_Save = vbCancel
Exit For
End If
If nResp = vbYes Then BOOKs_Save = vbYes
Else
oWb.Save
BOOKs_Save = vbYes
End If
'Else
''' ATENCION: No marcar el libro como 'Saved', si se cancela
posteriormente,
''' el libro ya no estará marcado .Saved = False
' xxx oWb.Saved = True xxx
End If
End If
Next oWb
If BOOKs_Save <> vbCancel Then
''' Si no se ha cancelado => cambiar los 'no guardados' para que no
pregunte al salir 'realmente' de Excel (ahora estamos en una funcion
personalizada)
For Each oWb In Application.Workbooks
If Not oWb.Saved Then oWb.Saved = True
Next oWb
End If
End Function

Y en mi Personal_BeforeClose():

Private Sub Workbook_BeforeClose(Cancel As Boolean)
If Cancel Then Exit Sub

If BOOKs_Save() = vbCancel Then
Cancel = True
Exit Sub
End If

''' <Y aqui pongo mi codigo de _BeforeReallyClose()>
''' :-))))
End Sub

Espero que le sirva a alguien en el futuro ;-)))

Saludos

"Héctor Miguel" escribió en...
hola, Luis !

> Respecto al link que me indicas, ya habia consultado alguno parecido y,


en principio, no me sirve. Te lo explico:
> El problema no es que la Personal.XLS este pendiente de grabar, puesto


que es invisible y no se puede modificar
> (es mas, no lo permito, en _BeforeClose pongo .Saved = True)
> El problema es que quiero que un evento _BeforeReallyClose ;-))), puesto


que me pasa lo que comentaba.
> Si existe 'algun otro fichero' pendiente de grabar, cuando dan a cerrar


Excel, se ejecuta el _BeforeClose de mi Personal
> y 'despues' pregunta al usuario si quiere '[Guardar, No guardar y


Cancelar].
> Y si responden Cancelar, la Personal.XLS ya ha ejecutado el


_BeforeClose.
> Una posible solucion (se me esta ocurriendo ahora mismo) seria en mi


_BeforeClose()
> recorrer todos los workbooks pendientes de grabar y hacer una pregunta


de 'Guardar TODO los libros abiertos'
> y segun lo que respondan, continuar con mi _BeforeClose()...

[creo que] este 'recorrido' por los libros pendientes de guardar es la


mejor 'apuesta' que tienes para tu '_BeforeReallyClose' :))

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim Lbro As Workbook
For Each Libro In Workbooks
If Not Libro.Saved Then
MsgBox "Existen libros con cambios pendientes de guardar" & vbCr & _
"Es necesario que no haya libros abiertos


'pendientes'" & vbCr & _
"para poder dar por terminada ESTA sesion de Excel


!!!"
Cancel = True: Exit Sub
End If
Next
MsgBox "Terminando mis acciones de cerrado..."
End Sub

nota: si NO usas [p.e.] el primer MsgBox, y existe algun libro SIN guardar


cambios recientes [o en la sesion]...
-> [sencillamente] la aplicacion NO se dara por terminada [al cancelarse


el evento de salida de algun libro]
pero el usuario no sabria la causa por la que no 'puede' salir de la


aplicacion :))

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida