1

我对 Visual Basic(和这个站点)非常陌生,需要一些关于如何在使用自动化时正确退出 Excel 的建议。关于我的问题的一点背景知识:我们有一个大型 Excel 工作簿,我的老板创建了它来执行数百个相对复杂的计算。目前用户只是使用电子表格来输入他们的数据,但现在我正在开发一个 vb.net 用户界面,以允许他们输入他们的数据,并为我们提供更多的灵活性和功能,让他们的生活更轻松和让他们摆脱 Microsoft Excel 的恐惧。

打开我的 .net 应用程序后,我正在运行一个命令以在后台打开工作簿(Excel 对象的可见属性设置为 false),以便我们可以使用它。在某个时候,我们会将这些计算迁移到独立的应用程序中,但目前这不是一个具有成本效益的解决方案,因此我们将使用已经开发的电子表格。我在关闭 Excel 时遇到了一个小问题。我可以使用 FormClosing 事件顺利关闭 Excel。我的问题是:如果我的应用程序正在运行(这意味着我想要的工作簿在后台打开)并且我通过桌面上的快捷方式打开另一个工作簿,当我在另一个工作簿打开时关闭我的应用程序时,它尝试关闭第二个工作簿,并使用 Excel 的保存更改对话框提示用户。我该如何解决这个问题?我是否需要找到特定于我的计算工作簿的进程并关闭它而不是关闭我创建的 Excel 对象?

这是我的 FormClosing 事件的代码:

Private Sub Form8_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing

 'close the workbook

xlWorkbook.Close(SaveChanges:=False)

'clean up

System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkbook)

xlWorkbook = Nothing

'close the excel application

xlApp.Quit()

'clean up

System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)

xlApp = Nothing

End Sub

编辑:我知道这个问题的发生是因为 Excel 打开它的文件的方式。除非您转到开始菜单并打开一个新的 Excel 实例,否则 Excel 将在已运行的应用程序对象中打开您的文件。这让我相信这个问题可能是不可避免的,但即使你只是头脑风暴,我也会喜欢一些反馈

任何意见是极大的赞赏。谢谢,埃里克

PS,感谢将我的代码放在代码标签中的人!我保证我会自己弄清楚如何做到这一点;)

4

1 回答 1

0

您可以在其中添加一些代码,Workbook_BeforeClose以防止在需要时将书关闭。

您可以通过多种方式执行此操作,最简单的方法是将其直接添加到您的工作表中,您也可以在 vb.net 中挂钩事件(公共事件类型的东西,我只在 VBA 中完成,所以无法帮助.net 变体)

这是一个可能有效的简单 VBA 解决方案。

模块 - 给它一个名字,例如:Main

Public Sub UnlockWorkbook()
Dim Window As Window

For Each Window In ThisWorkbook.Windows
    Window.Visible = True
Next Window

End Sub

Public Sub LockWorkbook()
Dim Window As Window

For Each Window In ThisWorkbook.Windows
    Window.Visible = False
Next Window

End Sub

ThisWorkbook 模块

Private Sub Workbook_BeforeClose(Cancel As Boolean)

For Each Window In ThisWorkbook.Windows
    If Window.Visible = False Then
        Cancel = True
        If Application.Workbooks.Count = 1 Then
            Application.Visible = False
        End If
        Exit For
    End If
Next Window

End Sub

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
SaveAsUI = False
End Sub

当您加载工作簿时,使用您的应用程序调用“LockWorkbook”宏将隐藏工作簿,您也可以隐藏应用程序。

现在,如果用户打开另一个工作簿,取消隐藏应用程序,当他们关闭工作簿并尝试关闭应用程序时,它应该停止该操作,并为您重新隐藏应用程序。

当您确实想关闭工作簿时,您需要调用“UnlockWorkbook”宏,这将允许“Worksheet_BeforeClose”完成,而无需将 Cancel 设置为 true。

于 2013-04-16T14:02:35.457 回答