VB.NETclosuresExcel

我对Visual Basic(以及本站)非常陌生,在使用自动化时需要一些关于如何正确退出Excel的build议。 在我的问题上的一个小背景:我们有一个大的Excel工作簿,我的老板已经创build了数百个相对复杂的计算。 目前用户只是使用电子表格input他们的数据,但现在我正在使用vb.net用户界面来允许他们input他们的数据,并且为我们提供了更多的灵活性和function,使他们的生活更轻松让他们摆脱微软Excel的恐怖。

在打开我的.net应用程序时,我正在运行一个命令来在后台打开工作簿(Excel对象的可视属性设置为false),所以我们可以使用它。 在某些情况下,我们会将这些计算迁移到独立应用程序中,但现在这不是一个经济有效的解决scheme,因此我们将使用已经开发的电子表格。 closuresExcel后,我遇到了一个小问题。 我可以使用FormClosing事件顺利closuresExcel。 我的问题是:如果我的应用程序正在运行(这意味着我所需的工作簿在后台打开),并通过桌面上的快捷方式打开另一个工作簿,当我打开另一个工作簿时closures应用程序时,它会尝试closures第二个工作簿,并提示用户的Excel保存更改对话框。 我如何解决这个问题? 我是否需要find特定于我的计算工作簿的过程并closures该过程,而不是closures我创build的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,感谢谁把我的代码在代码标签! 我保证我会弄清楚如何自己做;)

您可以将一些代码添加到Workbook_BeforeClose以防止在需要时closures该书。

你可以通过很多方法来做到这一点,最简单的方法就是直接将它添加到工作表中,也可以在vb.net中挂钩事件(公共事件types的事情,我只在VBA中完成,所以不能帮助.net版本)

这是一个简单的VBA解决scheme,可以工作。

模块 – 给它一个名字,例如: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 

这个工作簿模块

 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”macros来隐藏工作簿,也可以隐藏应用程序。

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

当您想要closures工作簿时,您需要调用“UnlockWorkbook”macros,该macros将允许“Worksheet_BeforeClose”完成,而不将Cancel设置为true。