Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.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 Visual Basic不关闭excel_Vb.net_Excel - Fatal编程技术网

Vb.net Visual Basic不关闭excel

Vb.net Visual Basic不关闭excel,vb.net,excel,Vb.net,Excel,我正在开发一个程序,可以让你输入一个人的信息,然后该程序将其放入Excel文件中。 打开Excel很好,但我无法关闭它。如果我打开taskmanager,仍然会有一个Excel open实例。我试了很多东西,但都找不到答案。我使用的是VB.net,我使用的是Microsoft office 2013(如果有必要的话) 我希望你能帮助我 更新的代码-仍不工作 Private Sub opslaan_Click(sender As Object, e As EventArgs) Handl

我正在开发一个程序,可以让你输入一个人的信息,然后该程序将其放入Excel文件中。 打开Excel很好,但我无法关闭它。如果我打开taskmanager,仍然会有一个Excel open实例。我试了很多东西,但都找不到答案。我使用的是VB.net,我使用的是Microsoft office 2013(如果有必要的话)

我希望你能帮助我


更新的代码-仍不工作

    Private Sub opslaan_Click(sender As Object, e As EventArgs) Handles opslaan.Click
    Dim excelApp As Excel.Application
    Dim excelWB As Excel.Workbook
    Dim excelWS As Excel.Worksheet

    excelApp = CreateObject("Excel.Application")
    excelApp.Visible = False

    If My.Computer.FileSystem.FileExists(My.Settings.Location) Then
        excelWB = excelApp.Workbooks.Open(My.Settings.Location)
        excelWS = excelWB.Worksheets(1)
    Else
        excelWB = excelApp.Workbooks.Add
        excelWS = excelWB.Worksheets(1)
    End If


    If My.Computer.FileSystem.FileExists(My.Settings.Location) Then
        excelWB.Save()
    Else
        excelWB.SaveAs(My.Settings.Location)
    End If
    System.Runtime.InteropServices.Marshal.ReleaseComObject(excelWS)
    excelWB.Close(SaveChanges:=False)
    System.Runtime.InteropServices.Marshal.ReleaseComObject(excelWB)
    excelApp.Quit()
    System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp)
    Me.Close()
End Sub

就像@Enigmativity所说的,在退出excel后,您需要使用Marshal.ReleaseConObject关闭excel

excelApp.Quit()
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp)
excelApp = Nothing

正如@Enigmativity所说,您必须释放com对象。但您不仅需要释放它,还需要调用GC.Collect()。。。使用GC.Collect将刷新这些对象并将它们从内存中删除,这就是您在任务管理器中看到它的原因

 Private Sub ReleaseObject(ByVal obj As Object)
Try
  System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
Catch ex As Exception
    obj = Nothing
Finally
    GC.Collect()
End Try
 End Sub
您需要在处理完对象后调用此函数

 excelWB.Close()
 excelApp.Quit()


ReleaseObject(excelWS)
ReleaseObject(excelWB)
ReleaseObject(excelApp)
我以前也有过同样的问题,你可以在这里读到更多


在每个COM组件完全释放之前,您确实需要调用
System.Runtime.InteropServices.Marshal.ReleaseComObject(…)
。我需要将其放置在何处,我尝试了几个不同的位置,但都不起作用@Enigmativity您应该用调用
ReleaseComObject
替换每一行
=Nothing
。为变量赋值
Nothing
是一个古老的VB6技巧,在.NET中应该避免。老实说,我更喜欢使用类似NPOI或openxml sdk的东西,它可以创建excel电子表格,而无需自动化excel,这是一种更好的方法。您不必处理由于用户的excel版本与您开发的不同而导致的问题for@Enigmativity我试过了,但Excel仍然打开,我用代码更新了帖子(可能是我做错了什么)。这篇帖子被自动标记为低质量,因为它只是代码。你介意把它扩展一点,解释一下它是如何解决这个问题的吗?我知道会的,很高兴能帮上忙。
 excelWB.Close()
 excelApp.Quit()


ReleaseObject(excelWS)
ReleaseObject(excelWB)
ReleaseObject(excelApp)