2013-04-16 69 views
1

我对Visual Basic(和本站点)非常陌生,并且需要关于如何在使用自动化时正确地退出Excel的小建议。关于我的问题的一点背景:我们的老板创建了一个大型Excel工作簿,用于执行数百个相对复杂的计算。目前用户只是使用电子表格输入他们的数据,但现在我正在使用vb.net用户界面来允许他们输入数据,并为我们提供更多的灵活性和功能,使他们的生活更轻松,让他们摆脱微软Excel的恐怖。VB.NET关闭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,感谢谁把我的代码在代码标签!我保证我会自己弄清楚如何做到这一点;)

+0

当你打开你的文件,当你说“在后台”,你的意思是说excel是可见的(最小化)还是隐藏? – NickSlash

+0

我的意思是隐藏的Excel ...可见属性设置为false,但即使当我将Excel对象设置为可见时,也会出现此问题,因此可能不是问题 – TypeM1smatch

+0

是否希望您的Excel表单为只读? (所以你只是阅读公式,最后应该丢弃任何更改) – NickSlash

回答

0

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

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

这是一个简单的VBA解决方案,可能工作。

模块 - 给它一个名称,如:主

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。

+0

我已将VBA添加到我的工作簿中。 LockWorkbook宏给了我一些瑕疵,但UnlockWorkbook宏正在阻止其他工作簿在我退出我的.net应用程序时尝试关闭......这正是我正在尝试解决的。我想我可以从这里解决这个问题。感谢百万NickSlash !!!!! – TypeM1smatch

+0

errr ...我想技术上是Workbook_BeforeClose事件是什么阻止第二个工作簿试图关闭...但是无论如何:) – TypeM1smatch

+0

我没有广泛测试代码,可能有一个问题,如果Application.Workbooks.Count = 1然后,因为事件在其关闭之前可能会打开2个工作簿。 – NickSlash