Excel COM对象 - 处理工作簿关闭事件

时间:2014-12-21 03:00:30

标签: c++ excel qt com

我使用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工作簿实际关闭时,有没有人知道获得通知的更好方法?

1 个答案:

答案 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
相关问题