VBA宏无法二次调用API,缓存问题排查求助
VBA API调用缓存问题解决方案
代码缺失导致的缓存问题及修复
你的代码中使用的MSXML2.XMLHTTP对象默认会对GET请求启用本地缓存,这就是重复运行宏时拿到旧数据的核心原因。可以通过两种方式解决:
方式1:添加禁用缓存的请求头
在xhr.Open之后、xhr.send之前,加入以下代码强制禁用缓存:
' 添加禁用缓存的请求头 xhr.setRequestHeader "Cache-Control", "no-cache, no-store, must-revalidate" xhr.setRequestHeader "Pragma", "no-cache" xhr.setRequestHeader "Expires", "0"
修改后的完整代码:
Sub FetchDataFromAPI() Dim xhr As Object Dim jsonResponse As String Dim parsed As Object Dim schedules As Object Dim ws As Worksheet Dim rowNum As Long Dim i As Long ' 创建XML HTTP请求对象 Set xhr = CreateObject("MSXML2.XMLHTTP") ' 初始化请求并指定API地址 xhr.Open "GET", "http://127.0.0.1:8000/data/", False ' 添加禁用缓存的请求头 xhr.setRequestHeader "Cache-Control", "no-cache, no-store, must-revalidate" xhr.setRequestHeader "Pragma", "no-cache" xhr.setRequestHeader "Expires", "0" ' 发送请求 xhr.send ' 检查请求是否成功 If xhr.Status = 200 Then jsonResponse = xhr.responseText ' 解析JSON响应 Set parsed = JsonConverter.ParseJson(jsonResponse) Set schedules = parsed("schedules") ' 指定目标工作表 Set ws = ActiveSheet ' 清除原有数据(从第2行开始) ws.Cells(2, 1).Resize(ws.Rows.Count - 1, 11).ClearContents ' 插入新数据 rowNum = 2 For i = 1 To schedules.Count ws.Cells(rowNum, 1).Value = schedules(i)("schedule") rowNum = rowNum + 1 Next i MsgBox "数据获取并插入成功!", vbInformation Else MsgBox "数据获取失败,状态码:" & xhr.Status, vbExclamation End If ' 清理对象 Set xhr = Nothing End Sub
方式2:改用ServerXMLHTTP对象
MSXML2.ServerXMLHTTP对象默认不会缓存GET请求,直接替换原有的对象创建代码即可:
Set xhr = CreateObject("MSXML2.ServerXMLHTTP.6.0")
系统设置引发缓存的可能性
Windows系统的Internet临时文件设置可能间接影响缓存,但概率较低。如果客户端出现同类问题,可以让用户检查:
- 打开IE的「Internet选项」→「常规」→「浏览历史记录」,确认是否开启「退出时删除浏览历史记录」,或手动清除临时文件。
- 不过更可靠的还是通过代码层面禁用缓存,避免依赖用户的系统设置。
客户端无感知缓存的预防措施
为彻底避免缓存问题,还可以在API请求URL后添加随机参数,让每次请求的URL唯一:
xhr.Open "GET", "http://127.0.0.1:8000/data/?t=" & Timer, False
Timer函数会返回当前时间的秒数,每次运行宏时参数值都不同,服务器会将其视为新请求,不会返回缓存数据。
内容的提问来源于stack exchange,提问作者Tea Tech
相关产品推荐
相关产品推荐

