You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从另一Excel工作簿运行宏并等待其执行完成?

解决Excel宏未等待刷新完成就关闭的问题

问题背景

我有一个需定期刷新的工作簿Spr1,但每次打开就刷新耗时过长,因此创建了启动工作簿Spr2,通过宏参数启动Spr1。

Spr2原Workbook_Open事件代码:

Private Sub Workbook_Open()
Application.Visible = True
Application.Run "'\\path\Spr1.xlsm'!Refresh_data"
Workbooks("Spr1.xlsm").Close SaveChanges:=True
Application.Quit
End Sub

Spr1原宏代码:

Sub Refresh_data()
ThisWorkbook.RefreshAll
End Sub

当前问题:Spr2的宏未等待Spr1的Refresh_data宏完成刷新,就直接关闭Excel。


解决方案

核心是强制刷新操作同步执行,并确保代码等待所有刷新、计算完成后再执行关闭逻辑,以下是具体修改方案:

1. 修改Spr1的Refresh_data宏,确保刷新同步完成

默认RefreshAll是异步执行的,需要关闭后台查询并等待计算完成:

Sub Refresh_data()
    Dim conn As WorkbookConnection
    Dim qt As QueryTable
    
    ' 关闭所有ODBC/OLEDB连接的后台查询,强制同步刷新
    For Each conn In ThisWorkbook.Connections
        If conn.Type = xlConnectionTypeODBC Or conn.Type = xlConnectionTypeOLEDB Then
            conn.OLEDBConnection.BackgroundQuery = False
        End If
    Next conn
    
    ' 关闭所有查询表的后台查询
    For Each qt In ThisWorkbook.Worksheets.QueryTables
        qt.BackgroundQuery = False
    Next qt
    
    ' 执行全量刷新
    ThisWorkbook.RefreshAll
    
    ' 等待所有计算任务完成
    Do Until Application.CalculationState = xlDone
        DoEvents
    Loop
End Sub

2. 修改Spr2的Workbook_Open事件,优化调用逻辑

使用工作簿对象引用代替名称查找,并增加状态检查:

Private Sub Workbook_Open()
    Application.Visible = True
    Dim spr1WB As Workbook
    
    ' 直接打开并获取Spr1对象,避免名称查找错误
    Set spr1WB = Workbooks.Open("\\path\Spr1.xlsm")
    ' 调用刷新宏
    Application.Run "'" & spr1WB.FullName & "'!Refresh_data"
    
    ' 等待Spr1刷新完成且状态稳定
    Do Until spr1WB.Saved And Application.CalculationState = xlDone
        DoEvents
    Loop
    
    ' 关闭工作簿并退出Excel
    spr1WB.Close SaveChanges:=True
    Application.Quit
End Sub

内容的提问来源于stack exchange,提问作者Tom_pl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 18:20:32