VBS 启动的 VBA 宏刷新 Power Query 时为何出现 1004?
结论
仅凭错误 1004 和这段宏,无法确定具体根因。1004 是通用的对象或应用程序错误,单凭它既不能认定查询名称有问题,也不能确认名称无误。宏重置后再次运行成功,说明问题可能与 Excel 当时的运行状态、连接初始化或启动环境有关。要确认原因,还需要记录实际错误信息。
错误发生在第一次对 Pending_NS 执行 QueryTable.Refresh 时。宏中的 Application.Wait 尚未执行,因此在这里增加等待无法解决首次刷新失败。BackgroundQuery:=False 通常会让刷新调用等待查询完成。如果调用仍然报错,应先查明具体原因。
先记录失败现场
每次刷新前后都记录工作簿、工作表、表名,以及错误编号和说明。这样可以判断问题是否总出现在第一个查询,还是会随运行环境或具体查询而变化。
Private Sub RefreshTable(ByVal wb As Workbook, _
ByVal sheetName As String, _
ByVal tableName As String)
On Error GoTo Failed
Debug.Print Now, "开始刷新", sheetName, tableName
wb.Worksheets(sheetName).ListObjects(tableName).QueryTable.Refresh _
BackgroundQuery:=False
Debug.Print Now, "刷新完成", sheetName, tableName
Exit Sub
Failed:
Debug.Print Now, "刷新失败", sheetName, tableName, _
Err.Number, Err.Description
Err.Raise Err.Number, "RefreshTable: " & sheetName & "." & tableName, _
Err.Description
End Sub
调用时可以去掉 .Select 和 .Activate:
RefreshTable Wb, "2_Pending", "Pending_NS"
RefreshTable Wb, "1_Activated", "Activated_NS"
RefreshTable Wb, "3_Sys_Agt", "Sys_Agt"
RefreshTable Wb, "4 Combined", "Combine"
Debug.Print 输出可在 VBA 编辑器的“立即窗口”中查看。如果通过 VBS 启动 Excel,不方便查看该窗口,可以把信息写入日志文件,并保留 Err.Number、Err.Description 和失败的表名。
检查计划任务的运行环境
手动运行和任务计划程序运行时,使用的 Windows 账户、登录状态和 Excel 进程可能不同。可以逐项核对:
- 任务是否使用有权访问
\\xxx\corpBase\...共享目录和 SQL 数据源的账户。这里使用的是 UNC 路径,仍需确认该账户确实有访问权限。 - 该账户能否在 Excel 中打开工作簿并访问 Power Query 数据源。检查数据源凭据和连接设置,也要留意
Application.DisplayAlerts = False是否隐藏了登录或确认提示。 - 任务是否设置为用户登录后运行;Excel 是否已有其他实例;同一工作簿是否被其他进程占用。可以在日志中记录
Application.UserName、工作簿完整路径和Application.Workbooks.Count,辅助排查。 - 如果错误并非每次都发生,检查同一时间是否有其他 Excel 自动化任务、文件锁或 SQL 连接问题。
检查查询连接和刷新方式
确认 Pending_NS 对应的表仍有可用的 QueryTable,并检查它所依赖的数据源、凭据和连接状态。还要结合实际查询设置,确认后续查询是否依赖前一个查询的结果。
宏中的一分钟等待在每次刷新调用之后执行。由于刷新使用了 BackgroundQuery:=False,固定等待通常无法解释或修复第一次调用前发生的 1004。如果改用后台刷新,应根据连接实际的异步行为等待刷新完成,不要只依赖固定时长。对于异步连接,在适用的 Excel 环境中可以使用 Application.CalculateUntilAsyncQueriesDone 等待待处理的查询;但它无法修复权限、凭据或对象引用错误。
注意事项
Application.DisplayAlerts = False 会隐藏某些提示,定位问题时不适合启用。可以先临时显示提示,或将错误和关键运行状态写入日志。问题定位后,再决定是否关闭提示。同时确保宏异常退出时恢复计算、事件和屏幕更新设置,避免影响后续 Excel 操作。
如果日志显示错误始终发生在 Pending_NS,再检查该表的 QueryTable、SQL 连接和凭据。如果失败位置会变化,则优先比较每次任务的登录账户、Excel 实例和数据源状态。现有材料没有提供 VBS 脚本、任务计划设置、Excel 版本,也没有提供错误发生时的 Err.Description,因此无法进一步确定具体原因。
备注:内容仅供参考。
