几次迭代后访问 VBA 宏卡住
Posted
技术标签:
【中文标题】几次迭代后访问 VBA 宏卡住【英文标题】:Access VBA Macro Stuck after Few Iterations 【发布时间】:2021-04-23 18:28:00 【问题描述】:我正在使用下面的代码
-
将 Microsoft Excel 文件加载到表格中 (
ChildOne
)
聚合数据
将结果插入另一个表 (FinalTable
)
删除之前加载的数据
调用 CompactDatabase 删除临时数据(绕过 2GB 限制)。
代码在几次迭代后会卡住,但在逐行执行时可以正常工作。如果有办法调整我的代码以获得更好的性能,请提供任何建议。提前致谢!
For Each File In FileList
If FileList(i) <> "" Then
Set AccApp = New Access.Application
With AccApp
.OpenCurrentDatabase dbPath
.DoCmd.TransferText acImportDelim, "Child1Append", "ChildOne", FPath + "\" + FileList(i), True
Sleep 1000
If i = 1 Then
.DoCmd.RunSQL ("Delete * from FinalTable")
End If
sQuery = "Insert into FinalTable Select distinct '" + FileList(i) + "' as FileName,CompanyID,CalendarYear,CalendarMonthName,sum(AMt) as Revenue from ChildOne group by CompanyID,CalendarYear,CalendarMonthName"
.DoCmd.RunSQL sQuery
.DoCmd.RunSQL ("Drop Table ChildOne")
.CloseCurrentDatabase
.Quit
End With
'compacting DB to drop temp memory
Set AccApp2 = New Access.Application
AccApp2.DBEngine.CompactDatabase dbPath, dbPathX
Kill dbPath
Name dbPathX As dbPath
'Updating the file was loaded successfully on my form
Status = Status + FileList(i) + " -Successful" + vbCrLf
MyText.Value = Status
i = i + 1
Else
Exit Sub
End If
Next
【问题讨论】:
不应将 DISTINCT 与 GROUP BY 一起使用。而是在 GROUP BY 子句中包含 Filelist(i)。 与号 (&
) 字符首选用于字符串连接。 Plus (+
) 确实有效,但与 Null 连接时会产生不同的结果。在这种情况下怀疑一个问题,但应该注意。
【参考方案1】:
首先,您为每次迭代打开和关闭 Access 的第一个实例:
Set AccApp = New Access.Application
将它移到循环之外(之前)。
第二,在关闭 Access 之后,再次打开一个 Access 实例:
Set AccApp2 = New Access.Application
你永远不会关闭。
最后,不需要第二个 Access 实例;一个 Access 实例可以打开多个数据库。
因此,在循环之前打开一个 Access 实例,运行循环打开所需的数据库,然后关闭 Access。
【讨论】:
感谢您的回复,古斯塔夫。每次迭代都关闭 AccApp 对象的原因是为了压缩数据库以缩小访问文件的大小。当数据库打开时(在循环内),访问不允许我压缩数据库。我尝试了您的方法,但它给了我一个错误-打开数据库以执行紧凑型数据库。感谢您的输入 reg 使用 & 而不是 + 并为多个数据库使用相同的对象。非常感谢! 将紧凑移动到最后一步 - 在循环之后。以上是关于几次迭代后访问 VBA 宏卡住的主要内容,如果未能解决你的问题,请参考以下文章