VB中的Excel应用程序对象(显然)可防止VB程序运行时正常使用Excel

我在Visual Studio( NOT VBA)中创build了一个Visual Basic程序,它创build了一个Excel实例,并在整个程序中使用它来打开现有的/创build的工作簿。 我遇到的问题是任何时候创buildExcel实例后,我无法完全打开工作簿(从Windows资源pipe理器中)。 我说'完全',因为Excel DOES似乎是开放的,但菜单和工作簿本身并不实际填充。 Excel边框就在那里,当我将鼠标hover在上面时,会显示忙碌的光标。

一旦VB程序closures并且该对象被释放,Excel将返回到“正常”function。 此外,当我退出VB程序时,部分打开的工作簿也会closures,就像它附加到我在代码中创build的Excel实例一样。

创build的Excel实例应该完全沉默,用户甚至不应该知道它正在被使用。 为此,我希望用户能够打开其他工作簿,就像Excel尚未在其他地方使用一样。 这很重要,因为可能需要在运行时打开其他Excel工作簿供用户参考。


我以这种方式声明对象,因为在各个模块中都有许多子例程,都可能需要使用Excel实例。

Public Shared XLapp As New Excel.Application 

在应用程序中打开第一个窗体时运行以下代码。 一旦这一点运行,XLapp对象被设置为一个新的Excel.Application,我就失去了正常打开工作簿的能力,如上所述。

 If IsNothing(XLapp) Then XLapp = New Excel.Application XLapp.Visible = False XLapp.DisplayAlerts = False XLapp.EnableEvents = False XLapp.ScreenUpdating = False 

创build工作簿对象之后,我将在代码后面的各个地方,通常打开一个工作簿,如下所示:

 Dim OpenedWorkbook as Excel.Workbook = Nothing [...] OpenedWorkbook = XLapp.Workbooks.Open(workbook_filepath) 

我一直觉得,如果我打开工作簿使用这个特定的对象(XLapp),当在Windows资源pipe理器中打开一个工作簿,将创build一个新的Excel实例。 也就是说,我的程序创build的Excel的实例应该与Excel的其他实例隔离,但这似乎并不是这种情况。

有什么我需要做的(或者我做错了什么?),以允许用户正常使用Excel时,我的程序正在运行?

提前感谢帮助和有耐心的这个VB新手!

(对不起,太长的评论。)

你可能会使用错误的工具来完成这项工作。 你写:

创build的Excel实例应该完全沉默,用户甚至不应该知道它正在被使用。 为此,我希望用户能够打开其他工作簿,就像Excel尚未在其他地方使用一样。

Excel互操作的目的是远程控制Excel,就像用户与之交互一样。 但是,用户不会与无声的,不可见的Excel窗口交互。 这不是什么Excel互操作。

我怀疑你并不是真的想要远程控制本地安装的Excel实例。 你真正想要做的是打开和操作Excel工作簿。 然后做到这一点:使用.NET的Excel库之一,直接修改Excel文件(个人,我喜欢SpreadsheetLight,但其他人也很好)。 额外奖金:您的用户不需要安装Excel。

你应该参考这个post… 如何正确清理Excel互操作对象?

基本上,当你创buildExcel对象,而不是正确地处理它,它周围挂起合法的Excel文件打开请求,而不是在他们的行为!

解决这种types的错误是非常耗时的,因为工作表/单元/等参考都需要正确处理。

此外,如果您使用多个“。” 在一个指令中(比如Parent.Child.GrandChild),那么你创build一个Child引用就更麻烦了,但是不要把它存储在任何地方,从而不能处理它!


正如@ Heinzi所提到的,如果你所做的只是读写价值,那么你可以使用不同的库而不是Excel的互操作性。 我已经使用EPPlus没有问题(通过添加Nuget)!