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

如何编写VBA代码下载JavaScript链接后的文件?

用VBA下载JavaScript触发的文件(以Vanguard导出按钮为例)

遇到这种JavaScript驱动的下载按钮,普通直接下载静态链接的方法确实不管用——因为按钮点击后是JS在后台发起请求生成文件,而不是直接指向一个现成的文件URL。下面给你两种可行的解决方案,你可以根据自己的需求选:

方法一:模拟浏览器点击(用IE对象)

这种方法最直观,就是用VBA控制IE浏览器,模拟用户点击导出按钮的操作,适合不想折腾抓包的场景。

步骤与代码示例

你可以用后期绑定(不用手动添加引用)直接实现:

Sub DownloadViaIE()
    Dim ie As Object
    Dim exportBtn As Object
    Dim waitTime As Integer
    
    ' 初始化IE对象
    Set ie = CreateObject("InternetExplorer.Application")
    ie.Visible = True ' 设为False可以后台静默运行
    
    ' 导航到目标页面
    ie.Navigate "https://www.vanguardinvestments.com.au/retail/ret/investments/product.html#/fundDetail/wholesale/portId=8101/assetCode=equity/?prices"
    
    ' 等待页面加载完成(根据网络情况调整等待时间)
    waitTime = 12
    Do While ie.Busy Or ie.ReadyState <> 4
        waitTime = waitTime - 1
        If waitTime <= 0 Then Exit Do
        Application.Wait Now + TimeValue("00:00:01")
    Loop
    
    ' 定位导出按钮(用浏览器开发者工具查看按钮的实际选择器,比如className)
    On Error Resume Next
    Set exportBtn = ie.Document.querySelector(".export-to-spreadsheet") ' 替换为实际元素选择器
    On Error GoTo 0
    
    If Not exportBtn Is Nothing Then
        ' 模拟点击按钮
        exportBtn.Click
        
        ' 处理下载弹窗(用SendKeys是简单方案,稳定性一般,适合测试)
        Application.Wait Now + TimeValue("00:00:03")
        SendKeys "%S" ' IE弹窗的Alt+S是保存快捷键
    Else
        MsgBox "找不到导出按钮,请检查元素选择器是否正确!"
    End If
    
    ' 可选:关闭IE
    ' ie.Quit
    ' Set ie = Nothing
End Sub

方法二:抓包获取实际下载API(更高效)

这种方法是找到JS点击后实际请求的文件URL,直接用VBA下载,速度更快,不需要模拟浏览器。

操作步骤:

  1. 打开Chrome/Firefox开发者工具(F12),切换到Network标签
  2. 点击页面上的“Export to Spreadsheet”按钮,观察Network里的请求
  3. 找到返回Excel文件的请求(响应类型通常是application/vnd.openxmlformats-officedocument.spreadsheetml.sheet)
  4. 复制这个请求的URL和必要的请求头(比如User-Agent、Cookie)

代码示例(用urlmon的URLDownloadToFile)

还是需要用到urlmon的声明,这个API处理文件下载很方便:

' 声明urlmon的API(64位Office用PtrSafe,32位去掉即可)
Declare PtrSafe Function URLDownloadToFile Lib "urlmon" _
    Alias "URLDownloadToFileA" ( _
    ByVal pCaller As LongPtr, _
    ByVal szURL As String, _
    ByVal szFileName As String, _
    ByVal dwReserved As LongPtr, _
    ByVal lpfnCB As LongPtr _
) As LongPtr

Sub DownloadDirectly()
    Dim downloadUrl As String
    Dim savePath As String
    Dim result As LongPtr
    
    ' 替换成你抓包得到的实际下载URL
    downloadUrl = "https://实际下载API地址?参数=xxx"
    ' 保存路径示例:桌面
    savePath = Environ("USERPROFILE") & "\Desktop\vanguard_fund_data.xlsx"
    
    ' 调用API下载文件
    result = URLDownloadToFile(0, downloadUrl, savePath, 0, 0)
    
    If result = 0 Then
        MsgBox "文件下载成功,保存到:" & savePath
    Else
        MsgBox "下载失败,错误码:" & result
    End If
End Sub

额外提示:

如果下载URL带临时会话参数,可能需要先用XMLHTTP模拟访问页面获取有效Cookie,再发起下载:

Dim xhr As Object
Set xhr = CreateObject("MSXML2.XMLHTTP.6.0")
xhr.Open "GET", "目标页面URL", False
xhr.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
xhr.send
' 此时会话Cookie已被保存,后续URLDownloadToFile会自动复用

两种方法对比

  • 模拟浏览器:上手简单,不用抓包,但速度慢,依赖IE,弹窗处理稳定性一般
  • 直接抓API:速度快、稳定性高,但需要一点抓包基础,还要处理可能的会话验证

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:54:11