通过 Excel VBA,我打开一个工作簿并关闭它,从而退出 Excel 应用程序。但它仍在任务管理器中运行,这导致我的插件无法正常工作。部分代码如下:
Private Sub btn_Click()
Dim oExcel As Object
Dim oBook As Object
Dim oSheet As Object
Dim i As Integer
Dim j As Integer
Sheets("Sheet1").Select
Finalrow = Cells(Rows.count, 1).End(xlUp).row
LastCol = Cells(1, Columns.count).End(xlToLeft).Column
Set oExcel = New Excel.Application
Set oBook = oExcel.Workbooks.Open(ADDIN_PATH & "\" & "hello.xls")
Set oSheet = oBook.Worksheets(1)
sCellName = "--Select--"
oSheet.Range("A3").Value = "Name"
If (ComboBox1.Value = "--Select--" Or ComboBox1.Value = "") Then
MsgBox "Please Map the name field"
'Else
'oSheet.Range("B2").Value = ComboBox1.Value
Exit Sub
End If
'oSheet.Range("B2").Value = ComboBox1.Value
oSheet.Range("B2").Value = ComboBox1.Value
If (ComboBox2.Value = "") Then ComboBox2.Value = sCellName
oBook.SaveAs ADDIN_PATH & "\" & "hello.xls"
oBook.Close
oExcel.Quit
Set oExcel = Nothing
MsgBox "Your current setting has been saved"
SettingForm.Hide
End Sub
最佳答案
当我在创建和操作 Excel 应用程序/工作簿(通常来自 Access)后遇到 Ghost Excel 进程的此问题时,我发现的解决方案始终相同 - 但在我进行了一些测试之后,您那里的代码不会为我创建幽灵进程。无论采用哪种方式实现此修复都应该有效,因此这里有两个建议:
1.) 当您创建/操作新的 Excel 应用程序时,您需要完全限定每个引用 - COM 通过简单的计数来跟踪打开对象的数量 - 当您打开一个新的 Excel 进程时,它会增加 1 ,但是如果您使用两个打开的文件进行非限定引用(例如,使用 Cells(Rows.Count,1)...
而不是 oExcel.Workbooks(oBook.Name).Worksheets(oSheet .Name).Cells(oExcel.Workbooks(oBook.Name).WorkSheets(oSheet.Name).Rows.Count,1)...
,它再次上升,现在即使它们全部关闭COM 对象的内部计数仍然为 1 并且 Excel 保持打开状态。(显然,您不必每次都输入完整的内容,只需在创建对象时即可。)所以我会使用 -
dim thisSheet as Worksheet
set thisSheet = ActiveWorkbook.Worksheets(1)
thisSheet.Activate
即使现在不是导致问题的原因,在从另一个应用程序自动化 Excel 时执行类似 Sheets("Sheet1")
的操作,如果没有随附的工作簿/应用程序引用,也可以 100% 保证制作一个幽灵进程。
当您对所有 Rows.Count、Columns.Count 等执行此操作时,我认为您也应该指定组合框的工作表。
2.) 完成所有操作后,确定哪一行正在增加 COM 对象计数的可靠方法是将 oExcel.Quit
行移至 Set oExcel = 之后新建 Excel.Application
行,然后继续重新运行它,并将该 oExcel.Quit
行不断向下移动,直到遇到幽灵进程,这将是您的罪魁祸首。
我希望这有助于解决它,我在类似的问题上浪费了太多时间,希望这是相同的根本原因。
关于Excel 工作簿通过 vba 代码关闭,但仍在任务管理器的进程中运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25147242/