几次迭代后访问 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)。 与号 (&amp;) 字符首选用于字符串连接。 Plus (+) 确实有效,但与 Null 连接时会产生不同的结果。在这种情况下怀疑一个问题,但应该注意。 【参考方案1】:

首先,您为每次迭代打开和关闭 Access 的第一个实例:

Set AccApp = New Access.Application

将它移到循环之外(之前)。

第二,在关闭 Access 之后,再次打开一个 Access 实例:

Set AccApp2 = New Access.Application

永远不会关闭

最后,不需要第二个 Access 实例;一个 Access 实例可以打开多个数据库。

因此,在循环之前打开一个 Access 实例,运行循环打开所需的数据库,然后关闭 Access。

【讨论】:

感谢您的回复,古斯塔夫。每次迭代都关闭 AccApp 对象的原因是为了压缩数据库以缩小访问文件的大小。当数据库打开时(在循环内),访问不允许我压缩数据库。我尝试了您的方法,但它给了我一个错误-打开数据库以执行紧凑型数据库。感谢您的输入 reg 使用 & 而不是 + 并为多个数据库使用相同的对象。非常感谢! 将紧凑移动到最后一步 - 在循环之后。

以上是关于几次迭代后访问 VBA 宏卡住的主要内容,如果未能解决你的问题,请参考以下文章

Python多处理,在循环中多次使用池在第一次迭代后卡住

使用宏时,每次迭代后参数递增

VBA Solver禁用每次迭代后弹出的对话框

Seq2Seq 模型学会在几次迭代后只输出 EOS 令牌 (<\s>)

如何等待 Compact Repair - 访问 VBA

处理文件行流迭代器