Diariamente, una persona necesita verificar que los libros de trabajo específicos se hayan actualizado correctamente con los datos del mercado de Bloomberg y Reuters; es decir, todos los datos se han procesado y los 'números parecen correctos'. En el pasado, las personas no estaban verificando los 'números', lo que ocasionaba cargas inexactas a otros sistemas.¿Cómo utilizar eficazmente el evento WorkbookBeforeClose correctamente?
La idea es que 'algo' debe desarrollarse para evitar que el uso cierre/guarde el libro de trabajo a menos que haya verificado que las actualizaciones sean correctas y precisas. La acción numbers look correct
es un ejercicio puramente intuitivo, por lo que no se codificará de ninguna manera.
La solución simple fue solicitar a los usuarios antes de cerrar el libro de trabajo específico para verificar que los datos se hayan comprobado.
con VSTO SE para Excel 2007, un complemento fue creado que se engancha en el caso WorkbookBeforeClose
que se inicializa en el complemento ThisAddIn_Startup
private void wb_BeforeClose(Xl.Workbook wb, ref bool cancel)
{
//.... snip ...
if (list.Contains(wb.Name))
{
DailogResult result = MessageBox.Show("some message", "sometitle", MessageBoxButtons.YesNo);
if (result != DialogResult.Yes)
{
cancel = true; // i think this prevents the whole application from closing
}
}
}
He encontrado el siguiente ThisApplication.WorkbookBeforeSave
vs ThisWorkbook.Application.WorkbookBeforeSave
que recomienda que uno debe use el evento ThisApplication.WorkbookBeforeClose
que creo que es lo que estoy haciendo ya que abarcará todos los archivos abiertos.
El problema que tengo con este enfoque es que el supuesto de que tengo varios archivos abiertos, algunos de los cuales están en mi list
, el evento impide que Excel se cierre todos los archivos de forma secuencial. Ahora requiere que cada archivo se cierre de forma individual. Editar: esto ocurre cuando Salir de Excel se utiliza desde el menú Archivo.
Preguntas
- estoy usando el evento
WorkbookBeforeClose
correcta y efectiva es esta & uso eficiente del evento? - ¿Debo usar el evento de nivel de aplicación
o el evento de nivel de documento? - ¿El comportamiento descrito arriba es normal?
- Otras sugerencias son bienvenidos al utilizar eventos libro en un complemento
Actualización [30-Mar-2010]:
Tinkering alrededor, también probé los siguientes, que intentó unir el controlador de eventos BeforeClose
de todos los libros que se abrieron como se sugiere en el enlace anterior.
private void ThisAddIn_Startup(...)
{
// snip
Globals.ThisAddin.Application.WorkbookOpen += Application_Open;
}
private void Application_Open(XL.Workbook wb)
{
wb.BeforeClose += Document_WorkbookBeforeClose; // method does the same as above
}
El problema que me encontré con este enfoque es que es trato de cerca de todos los archivos de Excel (usando la opción Salir de Excel ) el controlador de eventos no se ejecuta. Según mi observación, esto sucede cuando el documento que se va a verificar no es el documento activo.
Este método parece errático en comparación con mi enfoque inicial. Lo único con lo que no estoy seguro o con lo que me siento cómodo es vinculando el evento cada vez que se abre un documento.
Actualización [07-Apr-2010]:
respuesta sugerida de Glen es útil, pero no aborda las cuestiones inmediatas a la mano, por lo tanto me han aclarado la última pregunta un poco más lejos.
También he encontrado este blog How to Get an Excel VSTO Workbook Closed Event que es algo relevante para mi problema, ya que podría ser utilizado dentro de un enfoque alternativo para mi solución utilizando un enfoque de tipo de monitor para el manejo de los libros (y posiblemente también utilizar el OnWorkbookClosed
evento recién introducido)
Actualización [08-Apr-2010]:
Parece haber cierta confusión, no estoy preocupado por ninguna validación de los libros ellos mismos, sino más bien si el método que estoy utilizando (es decir, el uso de la Aplicación nivel WorkbookBeforeClose
evento) es correcto. El comentario de @Mathias a continuación muestra la comprensión correcta de parte del problema en relación con la pregunta 3, aunque creo que este es el comportamiento de Excel predeterminado. La solución para superar esto fue crear una función de cierre que cierra solo mis archivos específicos.
- es el comportamiento descrito encima de lo normal? Sí, pero ¿por qué? Dado que el complemento se engancha en el evento de nivel de aplicación, las verificaciones y la cancelación del evento bloquean la aplicación para que no cierre más libros de trabajo. La clave aquí es el argumento
ref bool cancel
(cancel=false
permite el cierre normal del libro (por defecto),cancel=true
impide el libro desde el cierre)
VS 2005 con VSTO SE
Sólo para asegurarse de que entiendo su problema correctamente, es este el escenario que tiene en mente: el usuario ha ficheros A, B, C abierta> cierra Excel (Salida Excel)> dice que sí a cerrar una, sin al archivo B. Qué tiene actualmente: Excel cancela los cierres A y B y C. Lo que desea: Excel cierra A, mantiene B abierto y continúa preguntando si C debe cerrarse. ¿Entiendo tu problema correctamente? es decir, su problema es que cuando un usuario sale de Excel, le gustaría poder cerrar los archivos que se pueden cerrar y solo mantener abiertos los que necesitan una validación. – Mathias
También comencé a jugar con esto, y los 2 enfoques (libro cerrado atrapado en el nivel de la aplicación o el libro de trabajo) se comportan exactamente de la misma manera en mi máquina. – Mathias
@mathias - exactamente, tengo que actualizar la pregunta aún más porque he logrado lograr lo que está describiendo – Ahmad