Excel 2016中ActiveWorkbook.RefreshAll无法刷新Query Table问题求助
解答:ActiveWorkbook.RefreshAll 支持刷新 Query Table,问题出在这些细节上
首先明确说:ActiveWorkbook.RefreshAll 完全支持刷新 Query Table——你遇到的问题大概率不是这个方法本身不支持,而是你的Query Table有特定设置、宏执行逻辑或者权限方面的问题。下面是具体的排查和解决思路:
1. 检查Query Table的核心刷新设置
你的Query Table可能被设置为禁止刷新,或者异步刷新导致宏提前保存:
- 打开Excel,找到Sheet2的Query Table("X"),右键选择「数据范围属性」,确认允许刷新选项是勾选状态(对应VBA里的
EnableRefresh = True)。 - 如果开启了「后台刷新」(
BackgroundQuery = True),RefreshAll会异步执行刷新操作——也就是说,宏执行到保存步骤时,Query Table可能还没完成数据拉取,看起来像是没刷新。解决方法是强制同步刷新:
在宏里单独针对这个Query Table设置同步刷新:Sheets("Sheet2").QueryTables("X").Refresh BackgroundQuery:=False
2. 确认Query Table的数据源连接有效性
虽然和数据透视表指向同一文件,但Query Table的连接可能存在缓存问题:
- 右键Query Table,选择「编辑查询」,检查数据源路径是否正确(比如原文件路径变更但Query Table没更新)。
- 确保当前运行VBS的用户对数据源文件有读取权限(比如文件在共享文件夹,权限不足会导致刷新失败)。
3. 优化宏的执行逻辑
如果RefreshAll之后立刻保存,很可能因为异步刷新没完成导致数据没更新。建议调整宏的顺序:
Sub RefreshAllDataAndSave() ' 先同步刷新目标Query Table With Sheets("Sheet2").QueryTables("X") .EnableRefresh = True .Refresh BackgroundQuery:=False End With ' 刷新所有其他数据源(包括数据透视表) ActiveWorkbook.RefreshAll ' 添加时间戳(示例:写入Sheet1的A1单元格) Sheets("Sheet1").Range("A1").Value = "Last Refreshed: " & Format(Now(), "yyyy-mm-dd hh:mm:ss") ' 等待所有刷新完成(针对可能的异步透视表刷新) Do Until Application.CalculationState = xlDone DoEvents Loop ' 保存工作簿 ActiveWorkbook.Save End Sub
4. 排查Excel 2016的兼容性问题
Excel 2016的部分版本对Query Table的RefreshAll支持有小bug,建议:
- 检查Office更新,安装最新的补丁。
- 尝试修复Office(控制面板→程序和功能→找到Office→更改→快速修复)。
另外,你的VBScript调用宏时,要确保工作簿被正确加载,避免上下文错误:
Set objExcel = CreateObject("Excel.Application") objExcel.Visible = False ' 调试时可以改为True,看Excel运行过程 Set objWorkbook = objExcel.Workbooks.Open("C:\YourFullPath\YourWorkbook.xlsm") ' 执行宏 objWorkbook.Application.Run "RefreshAllDataAndSave" ' 关闭并退出 objWorkbook.Close SaveChanges:=True objExcel.Quit Set objWorkbook = Nothing Set objExcel = Nothing
内容的提问来源于stack exchange,提问作者dotsent12
相关产品推荐
相关产品推荐

