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

能否用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

代码说明

  1. 提取链接:用querySelectorAll(".xls-link")直接定位页面中所有带.xls-link类的下载链接,不需要依赖JavaScript。
  2. 下载文件:通过XMLHTTP请求文件URL,将响应的二进制内容写入本地文件,完成下载。
  3. 路径处理:自动创建桌面的下载文件夹,避免路径不存在的错误。

这样既绕开了JavaScript的复杂问题,又能高效、稳定地下载目标文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:36:14