Excel 通过VBA关闭另一工作簿后,该工作簿的VBA项目将保持打开状态

Excel 通过VBA关闭另一工作簿后,该工作簿的VBA项目将保持打开状态,excel,vba,powerquery,adodb,Excel,Vba,Powerquery,Adodb,我正在通过VBA从另一个工作簿导入数据,该工作簿包含PowerQuery查询输出的数据表。在我的代码中,在使用ADO记录集选择数据子集之前,我首先刷新所述查询。虽然数据导入工作正常,但当我第二次运行脚本而在两次运行之间未关闭Excel时,Excel会抛出一个运行时错误: 在调查此问题时,我注意到源工作簿的VBA项目保持打开状态,即使我以编程方式关闭了该工作簿: 这是我使用的代码: Public Sub ReadIn() '------------------------------------

我正在通过VBA从另一个工作簿导入数据,该工作簿包含PowerQuery查询输出的数据表。在我的代码中,在使用ADO记录集选择数据子集之前,我首先刷新所述查询。虽然数据导入工作正常,但当我第二次运行脚本而在两次运行之间未关闭Excel时,Excel会抛出一个运行时错误:

在调查此问题时,我注意到源工作簿的VBA项目保持打开状态,即使我以编程方式关闭了该工作簿:

这是我使用的代码:

Public Sub ReadIn()

'-----------------------------------------
'   open workbook
'-----------------------------------------
Const STR_PATH_WKB As String = "C:\TEMP1\test\Input_XLSX.xlsx"

Dim wkbSource As Workbook

Set wkbSource = Workbooks.Open(STR_PATH_WKB)

'-----------------------------------------
'   Refresh Source Data Query
'-----------------------------------------
Dim lsoSource As ListObject

Set lsoSource = wkbSource.Sheets(2).ListObjects(1)
Call lsoSource.QueryTable.Refresh(BackgroundQuery:=False)

'-----------------------------------------
'   get data
'-----------------------------------------
Dim strQuery As String, strConnection As String
Dim con As Object
Dim rcs As Object

strQuery = "SELECT * FROM <TABLE> " & _
           "WHERE [ID] < 5"
strQuery = Replace(strQuery, "<TABLE>", "[" & lsoSource.Parent.Name & "$" & lsoSource.Range.Address(False, False) & "]")

Set con = CreateObject("ADODB.Connection")
Set rcs = CreateObject("ADODB.Recordset")

strConnection = "Provider=MSDASQL.1;DSN=Excel Files;DBQ=" & wkbSource.FullName & ";HDR=Yes';"
Call con.Open(strConnection)

Call rcs.Open(Source:=strQuery, ActiveConnection:=con)

'-----------------------------
'   Write data to array
'-----------------------------
Dim varData As Variant

If rcs.EOF Then
    varData = Empty
Else
    varData = rcs.GetRows()
End If

'-----------------------------
'   Do stuff
'-----------------------------
' ...

'-----------------------------------------
'   clean up
'-----------------------------------------
Set lsoSource = Nothing

Call rcs.Close
Call con.Close

Set rcs = Nothing
Set con = Nothing

Call wkbSource.Close(SaveChanges:=False)
Set wkbSource = Nothing

Erase varData


MsgBox "Done!"

End Sub

我正在使用Office 365,版本1902。

源工作簿上是否有BeforeClose事件可能会延迟或阻止其关闭?“做些什么?”John Joseph:没有,源工作簿中没有事件。@Siddharth Rout:如果我从文章中运行确切的代码,我会收到错误,“所以这部分应该是无关紧要的。”麦古尔克,我没有主意了。您可以尝试在Close命令之后放置DoEvents,以便在将对象设置为nothing之前,给系统一个结束时间。如果有帮助,请告诉我。调用wkbSource.CloseSaveChanges:=False DoEvents Set wkbSource=Nothing