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

时间:2018-05-17 10:34:09

标签: 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:\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文件,该怎么办? :)

3 个答案:

答案 0 :(得分:0)

尝试workbook.Saveworkbook.close

之类的内容

答案 1 :(得分:0)

我的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

希望我的记忆能很好地为我服务。我在一年多的时间里没有在VB或C#中编写任何代码,并且感觉非常缺乏实践。我只看到了你的问题,因为我点击了错误的链接,并记得当我开始编程时,我曾经如何与垃圾收集斗争。

答案 2 :(得分:0)

释放Excel.Application Interop COM对象比其他Office Interop对象有点棘手,因为有些对象是在您不知情的情况下创建的,并且必须在主应用程序实际关闭之前释放它们。 />

这些对象包括:

  
      
  • Excel.Application
  •   
  • Excel.Application.WorkBooks集合
  •   
  • WorkBooks集合打开了WorkBook
  •   
  • WorkBook Sheets集合
  •   
  • Sheets集合引用了Worksheet
  •   

必须释放这些对象以终止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()