通过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
答案 0 :(得分:1)
当我在创建和操作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 = New Excel.Application
行之后,并保持重新运行它并将oExcel.Quit
线进一步向下移动,直到遇到鬼过程,这将是你的罪魁祸首。
我希望这有助于修复它,我浪费了太多时间类似的问题,希望它是同样的根本原因。