Access导出记录至Excel时偶发Runtime错误1004排查求助
问题分析与解决方案
核心错误原因
出现Runtime error '1004' Method 'Rows' of object '_Global' Failed的关键原因是未明确限定Rows所属的Excel对象。在Access VBA环境中,Rows.Count默认会指向Access的内置对象,而非你创建的Excel应用实例,当Access和Excel对象模型出现冲突时,就会触发这个无规律的错误。
代码修复步骤
1. 修正出错的行号获取代码
将出错的代码:
lrow = xlws.Cells(Rows.Count, 1).End(xlUp).Row
修改为明确限定Excel工作表对象的版本:
lrow = xlws.Cells(xlws.Rows.Count, 1).End(xlUp).Row
或者更严谨地使用Excel应用实例限定:
lrow = xlws.Cells(xlApp.Rows.Count, 1).End(xlUp).Row
2. 修复逻辑错误的双层循环
你的遍历代码存在**双层嵌套Do Until rst.EOF**的严重问题:第一次进入外层循环后,内层循环会直接把记录集rst移动到EOF位置,外层循环会因为rst.EOF为True而直接退出,同时还会导致后续对rst的操作失效,这也是可能引发偶发错误的隐性因素。删除外层循环,保留内层循环即可:
i = 2 Do Until rst.EOF dblTotHr = rst!Hours xlws.Range("a" & i).Value = rst!A xlws.Range("b" & i).Value = rst!B xlws.Range("c" & i).Value = rst!C i = i + 1 rst.MoveNext Loop
3. 完善对象清理与错误处理
为了避免Excel进程残留和偶发异常,建议添加错误捕获,并确保Excel对象正确释放:
On Error GoTo Cleanup ' 你的导出代码... Cleanup: xlApp.Visible = True If Not rst Is Nothing Then If rst.State = adStateOpen Then rst.Close Set rst = Nothing End If If Not xlws Is Nothing Then Set xlws = Nothing If Not xlwb Is Nothing Then Set xlwb = Nothing If Not xlApp Is Nothing Then xlApp.Quit ' 如需关闭Excel,否则注释此行 Set xlApp = Nothing End If Set xlrng = Nothing Set rst1 = Nothing
额外优化建议
- 尽量避免逐单元格写入数据,可将记录集直接复制到Excel范围,提升效率并减少出错概率:
xlws.Range("A2").CopyFromRecordset rst - 声明变量时添加
Option Explicit,强制变量声明,避免因未声明变量导致的隐性错误。
内容的提问来源于stack exchange,提问作者SamwiseVB
相关产品推荐
相关产品推荐

