Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关闭vb.net应用程序后Excel仍在运行_Excel_Vb.net_Office Interop_Close Application - Fatal编程技术网

关闭vb.net应用程序后Excel仍在运行

关闭vb.net应用程序后Excel仍在运行,excel,vb.net,office-interop,close-application,Excel,Vb.net,Office Interop,Close Application,我在关闭Excel文件时遇到一些问题。我正在做一个程序,打开一些Excel文件,使用这些信息,然后关闭它们。 我尝试了一些不同的代码,但它们不起作用,因为EXCEL进程仍在运行。 我的第一个代码: Dim aplicacaoexcel As New Excel.Application Dim livroexcel As Object Dim folhaexcel As Excel.Worksheet livroexcel = aplicacaoexcel.Workbooks.Open("C:\

我在关闭Excel文件时遇到一些问题。我正在做一个程序,打开一些Excel文件,使用这些信息,然后关闭它们。
我尝试了一些不同的代码,但它们不起作用,因为
EXCEL
进程仍在运行。

我的第一个代码:

Dim aplicacaoexcel As New Excel.Application
Dim livroexcel As Object
Dim folhaexcel As Excel.Worksheet

livroexcel = aplicacaoexcel.Workbooks.Open("C:\Users\LPO1BRG\Desktop\Software Fiabilidade\Tecnicos.xlsx", UpdateLinks:=False, ReadOnly:=False, Password:="qmm7", WriteResPassword:="qmm7")
folhaexcel = livroexcel.sheets("Folha1")

aplicacaoexcel.DisplayAlerts = False
aplicacaoexcel.Visible = False
folhaexcel = Nothing
livroexcel.Close()
livroexcel = Nothing
aplicacaoexcel.Quit()
aplicacaoexcel = Nothing
然后我添加了以下内容:
System.GC.Collect()
,但它仍然没有关闭Excel进程。

现在我正在尝试这个:

Dim process() As Process = system.Diagnostics.Process.GetProcessesByName("EXCEL")

For Each p As Process In process
   p.Kill()
Next
实际上,这一个正在工作,但它会关闭所有Excel文件(即使是我的程序未打开的文件)。


如何仅关闭程序打开的Excel文件?:)

尝试类似于
工作簿。保存
工作簿。关闭

我对VB有些生疏,现在无法访问Visual Studio来测试此功能,但我将尝试从内存中编写代码

您遇到的问题是,将对象设置为Nothing仍然会在内存中分配该对象,并且不会完全处理该对象。即使对象的Close()和Quit()方法仍将其保留在内存中,以防程序以后需要再次访问它们。Kill()方法之所以有效,是因为它只会杀死内存中运行的Excel应用程序,从而关闭所有打开的Excel文档以及COM对象使用的文档。您要做的是处理应用程序正在使用的特定COM对象

不过,请在代码中尝试此更改

Dim aplicacaoexcel As New Excel.Application
Dim livroexcel As Object
Dim folhaexcel As Excel.Worksheet

livroexcel = aplicacaoexcel.Workbooks.Open("C:\Users\LPO1BRG\Desktop\Software Fiabilidade\Tecnicos.xlsx", UpdateLinks:=False, ReadOnly:=False, Password:="qmm7", WriteResPassword:="qmm7")
folhaexcel = livroexcel.sheets("Folha1")

aplicacaoexcel.DisplayAlerts = False
aplicacaoexcel.Visible = False

DisposeComObj(folhaexcel)
DisposeComObj(livroexcel)
DisposeComObj(aplicacaoexcel)
然后将以下内容也添加到应用程序中

Private Sub DisposeComObj(ByRef Reference As Object)
    Try        
        Do Until _
        System.Runtime.InteropServices.Marshal.ReleaseComObject(Reference)<=0
        Loop
    Catch
    Finally
        Reference = Nothing
    End Try
End Sub
Private子DisposeComObj(ByRef引用作为对象)
尝试
干到_

System.Runtime.InteropServices.Marshal.ReleaseComObject(Reference)释放
Excel.Application
Interop COM对象比其他Office Interop对象要复杂一点,因为有些对象是在您不知情的情况下创建的,必须在主应用程序实际关闭之前释放它们。

这些对象包括:

  • Excel.应用程序
  • Excel.Application.WorkBooks集合
  • 工作簿集合已打开工作簿
  • 工作簿工作表集合
  • 工作表集合引用了工作表
必须释放所有这些对象才能终止EXCEL进程。

一个简单的解决方案是对所有COM对象使用显式声明/赋值:

Dim ExcelApplication As New Microsoft.Office.Interop.Excel.Application()
Dim ExcelWorkbooks As Workbooks = ExcelApplication.Workbooks
Dim MyWorkbook As Workbook = ExcelWorkbooks.Open("[WorkBookPath]", False)
Dim worksheets As Sheets = MyWorkbook.Worksheets
Dim MyWorksheet As Worksheet = CType(worksheets("Sheet1"), Worksheet)
完成后,将它们全部释放:

Imports System.Runtime.InteropServices

Marshal.ReleaseComObject(MyWorksheet)
Marshal.ReleaseComObject(worksheets)

MyWorkbook.Close(False)   '<= False if you don't want to save it!
Marshal.ReleaseComObject(MyWorkbook)

ExcelWorkbooks.Close()
Marshal.ReleaseComObject(ExcelWorkbooks)

ExcelApplication.Quit()
Marshal.FinalReleaseComObject(ExcelApplication)

Marshal.CleanupUnusedObjectsInCurrentContext()
导入System.Runtime.InteropServices
Marshal.ReleaseComObject(我的工作表)
Marshal.ReleaseComObject(工作表)

MyWorkbook.Close(False)'您是否尝试关闭所有工作簿并重新打开工作簿?可能存在重复的工作簿