Excel.Application Object .Quit 使 EXCEL.EXE 运行

Cin*_*tyk 5 excel ms-access vba

我在 Windows 10 上的 MS Access 2013 中工作,我只是想编写一个 Sub 来打开磁盘上的 Excel 文件,更改列格式和一些列,保存并退出。Sub 运行并按预期执行,但问题是即使在 .Quit 命令之后,“EXCEL.EXE”也会继续运行,随后对该 Sub 的调用将导致运行时错误。如果我在运行子程序后关闭 Access,任务管理器上的“EXCEL.EXE”会消失,但如果我执行“压缩和修复”数据库,则不会。

我已经完成了另一个 Sub ,它只是在磁盘上打开一个 Excel 文件并将所有列的宽度更改为“自动宽度”,然后关闭,它工作正常并且不会让“EXCEL.EXE”运行。

我究竟做错了什么?是否可以在 VBA 中确保“EXCEL.EXE”正确退出?

我在 Dims 和 Sets to Nothing、Workbook Closes 等上尝试了很多不同的行顺序。 另外,我在这里和其他网站上搜索了如何解决这个问题,但 2 小时后我看到的唯一建议是使用 VBA ThisWorkbook.Saved = True 之类的东西,但我在 .Quit 之前和之后都尝试过,但没有效果。除此之外,我只找到 VB.NET 或其他我不使用的环境的解决方案,现在几乎没有。

感谢您阅读本文。

代码如下:

Sub changeXLcolumnFormatting()

Dim XL As Object
Set XL = CreateObject("Excel.Application")
XL.Visible = False
XL.DisplayAlerts = False
XL.Workbooks.Open "C:\Users\640344\Desktop\rawDataTest.XLSX"
Dim sht As Worksheet

With XL
Set sht = ActiveWorkbook.Worksheets(1)

Dim rng As Range
Dim i As Integer, j As Integer

field_names = Split("datasistema|Data de Registo|Data Registo CMVM", "|")
sht.Select
end_of_table = sht.UsedRange.Columns.Count

For j = 0 To UBound(field_names)
    For i = 1 To end_of_table
        Set rng = sht.Cells(1, i)
        If InStr(rng.Text, field_names(j)) > 0 Then
            sht.Columns(i).NumberFormat = "yyyy-mm-dd  HH:MM:ss"
        End If
    Next i
Next j

End With

Set rng = Nothing
Set sht = Nothing
XL.ActiveWorkbook.Close (True)

XL.Quit
Set XL = Nothing

End Sub
Run Code Online (Sandbox Code Playgroud)

Gus*_*tav 3

声明并使用特定的Workbook对象 - 就像对WorksheetRange所做的那样,如下所示:

\n\n
    Dim xls \xc2\xa0 \xc2\xa0 As Excel.Application\n\xc2\xa0 \xc2\xa0 Dim wkb \xc2\xa0 \xc2\xa0 As Excel.Workbook\n\xc2\xa0 \xc2\xa0 Dim wks \xc2\xa0 \xc2\xa0 As Excel.Worksheet\n    Dim rng     As Range\n\xc2\xa0 \xc2\xa0 \n\xc2\xa0 \xc2\xa0 Set xls = New Excel.Application\n\xc2\xa0 \xc2\xa0 Set wkb = xls.Workbooks.Open("c:\\test\\workbook1.xlsx")\n\xc2\xa0 \xc2\xa0 Set wks = wkb.Worksheets(1)\n    Set rng = wks.Range(<something>)\n\xc2\xa0 \xc2\xa0 \n    \' Do stuff.\n\xc2\xa0 \xc2\xa0 wks.Name = "My New Name"\n    With rng\n         \' Do more.\n    End With\n\n\xc2\xa0 \xc2\xa0 wkb.Close True\n\xc2\xa0 \xc2\xa0 \n    Set rng = Nothing\n\xc2\xa0 \xc2\xa0 Set wks = Nothing\n\xc2\xa0 \xc2\xa0 Set wkb = Nothing\n\xc2\xa0 \xc2\xa0 \n\xc2\xa0 \xc2\xa0 xls.Quit\n\xc2\xa0 \xc2\xa0 \n\xc2\xa0 \xc2\xa0 Set xls = Nothing\n
Run Code Online (Sandbox Code Playgroud)\n\n

另外,不要使用“选择”,它仅供可见使用。而是定义范围。

\n\n
\n\n

Cinetyk 的编辑:

\n\n

使用@Gustav \的指示,执行我想要的操作并解决问题的代码是:

\n\n
Sub changeXLcolumnFormatting()\n\nDim XL As Excel.Application\nDim sht As Excel.Worksheet\nDim wkb As Excel.Workbook\nDim rng As Range\n\nSet XL = New Excel.Application\nXL.Visible = False\nXL.DisplayAlerts = False\n\nSet wkb = XL.Workbooks.Open("C:\\Users\\640344\\Desktop\\rawDataTest.XLSX")\nSet sht = wkb.Worksheets(1)\n\nDim i As Integer, j As Integer\n\nfield_names = Split("datasistema|Data de Registo|Data Registo CMVM", "|")\nend_of_table = sht.UsedRange.Columns.Count\n\nFor j = 0 To UBound(field_names)\n    For i = 1 To end_of_table\n        Set rng = sht.Cells(1, i)\n        If InStr(rng.Text, field_names(j)) > 0 Then\n            sht.Columns(i).NumberFormat = "yyyy-mm-dd  HH:MM:ss"\n        End If\n    Next i\nNext j\n\nwkb.Close (True)\nSet rng = Nothing\nSet sht = Nothing\n\nXL.Quit\nSet XL = Nothing\n\nEnd Sub\n
Run Code Online (Sandbox Code Playgroud)\n

  • 古斯塔夫,做到了。多谢。现在看看你的答案,这是有道理的:明确声明对象使得我可以“关闭”并将它们明确设置为空。我离开时使用了一些隐式定义的变量,因此这些变量没有被“关闭”,可能内存中到它们的链接仍然存在。我正在学习 VBA,这是一个很好的课程,再次非常感谢。也感谢所有花时间阅读和评论的人。 (2认同)
  • 支持评论而不是答案,因为它解释了原因,而答案却没有。如果不解释错误机制,答案是没有用的,因为你永远不知道是否消除了错误以及哪一行消除了错误。 (2认同)