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

如何通过Excel宏下载CSV文件并选择文件格式

问题描述

我有一个可用的Excel宏,能直接从带独立文件路径的网站下载Excel文件。现在需要下载另一类文件,目标页面的下载按钮没有独立的文件路径,还需要选择文件格式才能下载。请问现有的宏能不能解决这个问题?还是需要更复杂的方案?

目标页面链接:https://data.ecb.europa.eu/data/datasets/FM/FM.M.U2.EUR.RT.MM.EURIBOR3MD_.HSTA

现有宏代码:

Option Explicit

Sub first()
   
Dim myURL As String, sFilename As String
    myURL = "https://www.mnb.hu/letoltes/bubor2.xls"
    
    sFilename = "****" & "file.xls"
   
    Dim WinHttpReq As Object, oStream As Object
    Set WinHttpReq = CreateObject("Microsoft.XMLHTTP")
    WinHttpReq.Open "GET", myURL, False ', "username", "password"
    WinHttpReq.Send
   
    myURL = WinHttpReq.ResponseBody
    If WinHttpReq.Status = 200 Then
        Set oStream = CreateObject("ADODB.Stream")
        oStream.Open
        oStream.Type = 1
        oStream.Write WinHttpReq.ResponseBody
        oStream.SaveToFile sFilename, 2  ' 1 = no overwrite, 2 = overwrite
        oStream.Close
    End If
End Sub
解决方案分析

现有宏无法直接解决这个问题,原因如下:

  • 你的现有宏是通过GET请求直接访问一个固定的文件URL来下载,而目标网站的下载流程需要先选择文件格式,再由服务器动态生成下载链接,没有公开的固定文件路径。

你需要采用以下两种方案之一:

方案1:抓取动态下载的API接口

通过浏览器的开发者工具(F12),模拟手动下载操作,捕捉背后的API请求:

  1. 打开目标页面,按F12进入开发者工具的「网络」标签
  2. 手动选择文件格式并点击下载,找到对应的请求(通常是POST或GET请求,包含格式参数)
  3. 提取该请求的URL、请求方法和参数,修改宏代码来模拟这个请求

例如,如果捕捉到的API是POST请求,携带格式参数,宏代码可以修改为:

Option Explicit

Sub DownloadECBData()
    Dim WinHttpReq As Object, oStream As Object
    Dim sURL As String, sFilename As String, postData As String
    
    ' 替换为捕捉到的API地址
    sURL = "https://data.ecb.europa.eu/data/datasets/FM/download"
    ' 替换为需要的格式参数,比如Excel格式
    postData = "format=xlsx&dataset=FM.M.U2.EUR.RT.MM.EURIBOR3MD_.HSTA"
    sFilename = "ECB_EURIBOR.xlsx"
    
    Set WinHttpReq = CreateObject("Microsoft.XMLHTTP")
    WinHttpReq.Open "POST", sURL, False
    WinHttpReq.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    WinHttpReq.Send postData
    
    If WinHttpReq.Status = 200 Then
        Set oStream = CreateObject("ADODB.Stream")
        oStream.Open
        oStream.Type = 1
        oStream.Write WinHttpReq.ResponseBody
        oStream.SaveToFile sFilename, 2
        oStream.Close
    End If
End Sub

方案2:浏览器自动化模拟交互

如果无法找到API接口,可以用VBA结合浏览器自动化工具(如Selenium Basic,或Microsoft Edge的WebDriver),模拟手动点击下载按钮、选择格式的操作:

  1. 安装Selenium Basic和对应浏览器的驱动
  2. 在VBA中引用Selenium库,编写代码模拟页面操作:
Option Explicit
Sub AutoDownloadECBData()
    Dim driver As New ChromeDriver
    Dim sFilename As String
    
    sFilename = "ECB_EURIBOR.xlsx"
    
    driver.Get "https://data.ecb.europa.eu/data/datasets/FM/FM.M.U2.EUR.RT.MM.EURIBOR3MD_.HSTA"
    
    ' 模拟点击下载按钮(需根据页面元素ID/XPath调整)
    driver.FindElementById("download-button").Click
    ' 模拟选择Excel格式(需根据页面元素调整)
    driver.FindElementByXPath("//select[@name='format']/option[@value='xlsx']").Click
    ' 模拟确认下载
    driver.FindElementById("confirm-download").Click
    
    ' 等待下载完成,可添加等待逻辑
    driver.Quit
End Sub

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 14:03:24