【问题标题】:Excel COM object - handling workbook close eventExcel COM 对象 - 处理工作簿关闭事件
【发布时间】:2015-02-19 14:05:57
【问题描述】:

我正在使用 QAxObject 从 Qt 应用程序自动生成 Excel 窗口。当 Excel 窗口被用户关闭时,我需要得到通知。

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

还有另一个事件Deactivate() 在停用工作簿时触发。当窗口实际关闭以及用户切换到不同的工作簿时会触发此事件。所以单独处理也是不够的。

我当前使用的解决方案是在触发BeforeClose() 时将布尔变量closing 设置为true。当Deactivate() 事件处理程序随后被触发时,我认为只有当closing 设置为true 时Excel 才会关闭。

这还需要一件事,如果用户在保存确认对话框中取消关闭操作,则将 closing 设置为 false。我使用的方法是在BeforeClose() 中启动一个重复计时器并检查计时器中Excel COM 对象的Visible 属性。当模式对话框(例如保存确认对话框)打开时,Visible 属性被评估为 false。所以我可以在计时器中将Visible 属性评估为true 时立即将closing 设置为false

有人知道在 Excel 工作簿实际关闭时获得通知的更好方法吗?

【问题讨论】:

  • 你很接近。相反,只需检查ClosingDeactivate 中是否为真。如果是这样,那么它真的要关闭了。此时将 Closing 设置为 False(如果您在应用程序级别执行此操作)。
  • 但如果用户取消关闭操作,则不会触发 Deactivate。因此,我发现将 closing 重置为 false 的唯一方法是使用计时器。
  • 你是对的。不知道我在想什么。

标签: c++ excel qt com


【解决方案1】:

一种解决方法是绕过 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

【讨论】:

    猜你喜欢
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多