如何通过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请求:
- 打开目标页面,按F12进入开发者工具的「网络」标签
- 手动选择文件格式并点击下载,找到对应的请求(通常是
POST或GET请求,包含格式参数) - 提取该请求的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),模拟手动点击下载按钮、选择格式的操作:
- 安装Selenium Basic和对应浏览器的驱动
- 在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
相关产品推荐
相关产品推荐

