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