Excel 工作簿通过 vba 代码关闭,但仍在任务管理器的进程中运行

标签 excel vba

通过 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/

相关文章:

javascript - 如何使用 Excel javascript API 设置工作表的自定义设置?

excel - Amazon Redshift 身份验证问题

vba - 将单元格格式/样式存储为 VBA 中的变量

对 VBA 数组的 SQL 查询

vba - 删除多个单元格中的文本

excel - 在不使用数组的情况下查找最大值/最小值

function - Access 表格 - 当前记录计数

excel - 如何在真正的空白单元格上进行查找和替换

excel - 将特定单词表的内容复制到excel

r - 导入 .xlsx 文件后,从矩阵列表构建适当的数据框