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

使用Excel VBA提取带下拉菜单的网页表格数据求助

解决Excel VBA抓取Banco BPI基金报价表格的问题

问题分析

原代码存在几个关键问题导致无法获取目标数据:

  • 仅通过IE.Busy判断页面加载不全面,切换下拉选项后未触发页面动态加载事件
  • 固定等待时间无法确保动态表格完全加载
  • 表格定位不准确,且数据填充逻辑错误

修正后的代码

Sub GetBPIInvestmentFunds()
    Dim IE As Object
    Dim dropdown As Object
    Dim targetTable As Object
    Dim row As Object, cell As Object
    Dim startRow As Integer, startCol As Integer
    Dim waitTime As Date
    
    ' 初始化IE对象
    Set IE = CreateObject("InternetExplorer.Application")
    IE.Visible = True
    IE.Navigate "https://www.bancobpi.pt/cotacoes"
    
    ' 等待页面完全加载(同时判断IE状态和文档就绪状态)
    Do While IE.Busy Or IE.Document.readyState <> "complete"
        DoEvents
    Loop
    
    ' 定位下拉菜单(通过name属性更可靠,避免动态ID)
    Set dropdown = IE.Document.getElementsByName("wtSelAcoes")(0)
    If Not dropdown Is Nothing Then
        ' 选择第二个选项(索引1)
        dropdown.selectedIndex = 1
        ' 触发下拉框的change事件,确保页面加载目标内容
        Call IE.Document.parentWindow.execScript("arguments[0].dispatchEvent(new Event('change'));", "javascript", dropdown)
        
        ' 等待动态表格加载完成(最多等待10秒)
        waitTime = DateAdd("s", 10, Now)
        Do While Now < waitTime
            Set targetTable = IE.Document.querySelector("table.table-cotacoes")
            If Not targetTable Is Nothing Then Exit Do
            DoEvents
        Loop
        
        ' 填充数据到Excel(从Sheet1的A1单元格开始)
        startRow = 1
        startCol = 1
        For Each row In targetTable.getElementsByTagName("tr")
            startCol = 1
            For Each cell In row.getElementsByTagName("td")
                ThisWorkbook.Sheets("Sheet1").Cells(startRow, startCol).Value = cell.innerText
                startCol = startCol + 1
            Next cell
            startRow = startRow + 1
        Next row
    End If
    
    ' 清理对象
    IE.Quit
    Set IE = Nothing
    Set dropdown = Nothing
    Set targetTable = Nothing
End Sub

关键改进点

  • 页面加载判断:同时检查IE.Busy和IE.Document.readyState = "complete",确保页面初始加载完成
  • 下拉框触发事件:通过JavaScript触发下拉框的change事件,强制页面加载对应内容(原代码仅设置选中索引未触发动态加载)
  • 动态表格等待:循环检查目标表格是否存在,最多等待10秒,避免固定等待时间的不确定性
  • 表格定位:使用CSS选择器querySelector("table.table-cotacoes")精准定位目标表格,比getElementsByTagName("table")(0)更可靠
  • 数据填充逻辑:按行和列的顺序将表格数据填充到Excel单元格,修正原代码的单列填充错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 18:47:09