能否用VBA的.execScript执行ga()函数下载NHS网页文件?
问题分析与解决方案
你尝试通过execScript调用ga()函数来触发文件下载的思路走偏了——ga()是Google Analytics的事件统计函数,它的作用只是向GA服务器发送下载行为的统计数据,完全不负责实际的文件下载操作。真正触发下载的是<a>标签的href属性,浏览器点击该链接时会自动请求href指向的文件URL并开始下载。
为什么你的execScript尝试全部失败?
- 你通过
XMLHTTP获取的只是页面的静态HTML文本,并没有加载页面的完整JavaScript运行环境(包括GA的脚本文件),所以ga函数在这个上下文里根本不存在,调用必然报错。 - 就算你在完整加载的浏览器窗口中调用
ga(),它执行完统计后也不会主动触发下载——下载是<a>标签的默认行为,和ga()没有直接关联。
正确的下载方式:直接提取文件URL并下载
既然目标文件的URL已经明明白白写在<a>标签的href属性里,我们完全可以跳过JavaScript,直接提取这个URL,用VBA完成下载。下面是修改后的完整代码:
Option Explicit Public Sub DownloadDTOC() Dim http As New XMLHTTP60 Dim html As New HTMLDocument Dim downloadLinks As Object, link As Object Dim savePath As String ' 设置文件保存路径(请修改为你自己的路径) savePath = Environ("USERPROFILE") & "\Desktop\NHS_Downloads\" ' 如果文件夹不存在则创建 If Dir(savePath, vbDirectory) = "" Then MkDir savePath With http .Open "GET", "https://www.england.nhs.uk/statistics/statistical-work-areas/delayed-transfers-of-care/delayed-transfers-of-care-data-2017-18/", False .send html.body.innerHTML = .responseText End With ' 获取所有xls-link类的下载链接 Set downloadLinks = html.querySelectorAll(".xls-link") If downloadLinks.Length > 0 Then For Each link In downloadLinks Dim fileName As String ' 从URL中提取文件名 fileName = Mid(link.href, InStrRev(link.href, "/") + 1) ' 下载文件到指定路径 With New XMLHTTP60 .Open "GET", link.href, False .send If .Status = 200 Then Open savePath & fileName For Binary Access Write As #1 Put #1, , .responseBody Close #1 Debug.Print "已下载: " & fileName Else Debug.Print "下载失败: " & fileName & ",状态码: " & .Status End If End With Next link Else Debug.Print "未找到任何XLS下载链接" End If End Sub
代码说明
- 提取链接:用
querySelectorAll(".xls-link")直接定位页面中所有带.xls-link类的下载链接,不需要依赖JavaScript。 - 下载文件:通过
XMLHTTP请求文件URL,将响应的二进制内容写入本地文件,完成下载。 - 路径处理:自动创建桌面的下载文件夹,避免路径不存在的错误。
这样既绕开了JavaScript的复杂问题,又能高效、稳定地下载目标文件。
内容的提问来源于stack exchange,提问作者QHarr
相关产品推荐
相关产品推荐

