如何使用VBA将网页表格数据导入Excel,或点击网页导出按钮下载数据
网页表格数据导入Excel VBA实现指导
原有代码优化前提
你现有代码存在几个需要先调整的基础问题:
- 声明的
myIE变量未实际使用,可直接删除 - 缺少页面加载等待逻辑,后续操作网页元素时会报错
- 未设置IE窗口可见性,不便于调试过程观察页面状态
方案1:直接识别网页表格并写入Excel
该方案无需下载额外文件,直接提取页面表格数据写入目标单元格区域,实现逻辑如下:
- 定位到当前日期对应的目标填充单元格后,跳转目标网页
- 等待网页完全加载完成
- 定位页面内的目标表格元素
- 遍历表格的行、列,逐格写入Excel对应区域
完整实现代码
Sub FindDateAndImportTable() Dim IE As Object Dim hTable As Object Dim tRow As Object, tCell As Object Dim targetCell As Range Dim rowNum As Integer, colNum As Integer ' 初始化IE对象 Set IE = CreateObject("INTERNETEXPLORER.APPLICATION") IE.Visible = True ' 设置IE可见,调试完成后可改为False ' 定位当前日期对应的目标单元格 For Each Cell In ActiveSheet.Range("C1:C269") If Cell.Value = Date Then ' 替换原[Today()]为VBA内置Date函数,兼容性更好 Set targetCell = Cell.Offset(0, 6) Exit For End If Next ' 检查单元格是否为空 If Not IsEmpty(targetCell) Then MsgBox "Values for today are already filled" IE.Quit Set IE = Nothing Exit Sub End If ' 跳转目标网页,注意把链接中的固定日期替换为动态当前日期 Dim currentDateStr As String currentDateStr = Format(Date, "yyyymmdd") ' 生成YYYYMMDD格式的当前日期 Dim targetUrl As String targetUrl = "https://xyz.de/Reporting?NavigationId=163&ReportDateId=" & currentDateStr & "&StartDateId=" & currentDateStr & "&BankstructureIds=117324,117326&IncludeIte=true" IE.Navigate targetUrl ' 等待页面完全加载 Do While IE.Busy Or IE.ReadyState <> 4 DoEvents Loop ' 可额外加1-2秒等待,避免动态渲染的表格未加载完成 Application.Wait Now + TimeValue("00:00:02") ' 定位目标表格,getElementsByTagName("table")(0)代表页面第一个表格,可根据实际表格序号调整数字 Set hTable = IE.Document.getElementsByTagName("table")(0) ' 遍历表格写入Excel rowNum = 0 For Each tRow In hTable.Rows colNum = 0 For Each tCell In tRow.Cells targetCell.Offset(rowNum, colNum).Value = tCell.innerText colNum = colNum + 1 Next tCell rowNum = rowNum + 1 Next tRow ' 清理对象 IE.Quit Set IE = Nothing MsgBox "数据导入完成" End Sub
注意:如果页面有多个表格,需要调整getElementsByTagName("table")后的索引值,从0开始计数,对应页面第1、2...个表格
方案2:模拟点击导出按钮下载文件后导入
如果页面表格有复杂格式、合并单元格等情况,直接提取容易出错,可采用该方案,实现逻辑如下:
- 跳转页面加载完成后,先定位导出按钮元素,通常可以通过id、class、按钮文本三种方式定位:
- 按id定位:
IE.Document.getElementById("导出按钮的id属性值").Click - 按class定位:
IE.Document.getElementsByClassName("导出按钮的class属性值")(0).Click - 按按钮文本定位:遍历所有button元素,匹配
innerText为“导出Excel”等对应文本后点击
- 按id定位:
- 点击按钮后等待文件下载完成,可通过判断下载路径下是否生成对应文件实现等待
- 用VBA打开下载的Excel文件,复制需要的表格区域,粘贴到当前工作表的目标位置
- 关闭临时下载的文件,清理临时文件(可选)
核心代码片段(接方案1中页面加载完成后的逻辑)
' 定位并点击导出按钮,以下为按文本匹配的示例,可根据实际按钮属性调整 Dim btn As Object For Each btn In IE.Document.getElementsByTagName("button") If btn.innerText Like "*导出*" Or btn.innerText Like "*Export*" Then ' 匹配按钮上的导出文本 btn.Click Exit For End If Next btn ' 等待下载完成,这里假设下载路径为系统默认下载路径,文件名为report.xlsx,可根据实际情况调整 Dim downloadPath As String downloadPath = Environ("USERPROFILE") & "\Downloads\report.xlsx" Do While Dir(downloadPath) = "" Application.Wait Now + TimeValue("00:00:01") Loop ' 打开下载的文件复制数据 Dim wbTemp As Workbook Set wbTemp = Workbooks.Open(downloadPath) wbTemp.Sheets(1).UsedRange.Copy targetCell ' 复制第一个工作表的所有数据到目标单元格 wbTemp.Close SaveChanges:=False ' 关闭临时文件不保存 ' 可选:删除下载的临时文件 Kill downloadPath
注意:需要先手动测试导出的文件名称、保存路径,修改代码中对应的路径和文件名参数
内容的提问来源于stack exchange,提问作者Kanishk garg
相关产品推荐
相关产品推荐

