我使用QAxObject
从Qt应用程序自动化Excel窗口。我需要在用户关闭Excel窗口时收到通知。
Excel工作簿COM对象具有事件BeforeClose()
,但处理它是不够的,因为在提示用户保存更改之前触发它,因此用户将取消保存确认对话框中的关闭操作。因此,即使BeforeClose()
被触发,Excel窗口也可能无法关闭。
在停用工作簿时会触发另一个事件Deactivate()
。当窗口实际关闭时以及用户切换到不同的工作簿时会触发此操作。因此单独处理它也是不够的。
我正在使用的解决方案是在触发closing
时将bool变量BeforeClose()
设置为true。随后触发Deactivate()
事件处理程序时,我认为仅当closing
设置为true时才关闭Excel。
如果用户在保存确认对话框中取消关闭操作,则需要再做一件事,将closing
设置为false。我使用的方法是在BeforeClose()
中启动重复计时器,并在计时器中检查Excel COM对象的Visible
属性。当打开保存确认对话框等模式对话框时,Visible
属性被评估为false。因此,只要closing
属性在计时器中评估为false
,我就可以将Visible
设置为true
。
当Excel工作簿实际关闭时,有没有人知道获得通知的更好方法?
答案 0 :(得分:2)
解决方法是绕过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