Excel COM对象 – 处理工作簿closures事件

我使用QAxObject从Qt应用程序自动化Excel窗口。 当Excel窗口被用户closures时,我需要得到通知。

Excel工作簿COM对象有事件BeforeClose()但是处理它是不够的,因为在用户被提示保存更改之前触发它,所以用户将取消保存确认对话框中的closures操作。 所以,即使BeforeClose()被触发,Excel窗口也可能不被closures。

还有另一个事件Deactivate() ,当工作簿被禁用时会被触发。 当窗口实际closures以及用户切换到不同的工作簿时,会触发这种情况。 所以单靠处理也是不够的。

我正在使用的解决scheme是当BeforeClose()被激发时设置一个布尔variables接近true。 当Deactivate()事件处理程序随后被触发时,我认为只有在closing设置为true时才closing Excel。

这需要一件事,如果用户在保存确认对话框中取消closures操作,则设置为false。 我使用的方法是在BeforeClose()启动一个重复计时器,并在定时器中检查Excel COM对象的Visible属性。 当保存确认对话框等modal dialog打开时, Visible属性被评估为false。 所以我可以设置接近false ,只要Visible属性在计时器中计算为true

有没有人知道Excel工作簿实际closures时得到通知的更好方法?

解决方法是绕过Excel的提示像这样(VB代码):

 Private Sub Handler_WorkbookBeforeClose(wb As Workbook, ByRef cancel As Boolean) If wb.Saved = False Then Dim answer As MsgBoxResult = MsgBox("Do you want to save the changes you made to " + wb.Name + "?", MsgBoxStyle.YesNoCancel) Select Case answer Case MsgBoxResult.Yes wb.Save() Case MsgBoxResult.No wb.Saved = True Case MsgBoxResult.Cancel cancel = True Exit Sub End Select End If 'Put here your code to be executed when workbook has been closed. End sub