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