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

VBA QueryTables指定WebClass提取网页表格失败求助

问题分析

你遇到的问题根源在于Excel QueryTables的WebClass属性根本不是用来通过CSS类名定位网页元素的,这个属性的设计初衷不支持CSS选择器匹配,所以你指定snapshot-table2-table这类类名后,QueryTables完全无法识别,直接导致数据抓取失败。

解决方案

方案1:用WebTables指定表格索引(简单快速)

Finviz报价页里,目标表格(snapshot-table2-table)对应的<table>标签有固定索引,替换掉无效的WebClass设置即可:

修改后的VBA代码:

Dim wb As Workbook
Dim src As Worksheet
Dim tgt As Worksheet

Set wb = ThisWorkbook
Set src = wb.Sheets("CP")
Set tgt = wb.Sheets("00")

Dim url As String
Dim symbol As String

symbol = src.Range("C4").Value
url = "https://finviz.com/quote.ashx?t=" & symbol & "&p=d"

On Error Resume Next

' 先清空目标区域旧数据(可选)
tgt.Range("A2").CurrentRegion.Clear

With tgt.QueryTables.Add(Connection:= _
    "URL;" & url, _
    Destination:=tgt.Range("A2"))
    .WebSelectionType = xlSpecifiedTables
    .WebFormatting = xlWebFormattingNone
    ' Finviz报价页中目标表格的索引通常是2,不对的话自己数页面里的<table>标签
    .WebTables = "2"
    .Refresh BackgroundQuery:=False
End With

If Err.Number <> 0 Then
    MsgBox "获取数据出错了,检查下股票代码或网络吧。"
    Exit Sub
End If

On Error GoTo 0

方案2:用XMLHTTP+DOM解析(精准可靠)

如果表格索引经常变,推荐用这种方式直接通过CSS类名定位,稳定性更强:

Dim wb As Workbook
Dim src As Worksheet
Dim tgt As Worksheet
Dim xmlHttp As Object
Dim htmlDoc As Object
Dim targetTable As Object
Dim row As Object
Dim cell As Object
Dim i As Integer, j As Integer

Set wb = ThisWorkbook
Set src = wb.Sheets("CP")
Set tgt = wb.Sheets("00")
Set xmlHttp = CreateObject("MSXML2.XMLHTTP.6.0")
Set htmlDoc = CreateObject("HTMLFile")

Dim symbol As String, url As String
symbol = src.Range("C4").Value
url = "https://finviz.com/quote.ashx?t=" & symbol & "&p=d"

' 发送请求,加个User-Agent避免被拦截
xmlHttp.Open "GET", url, False
xmlHttp.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/114.0.0.0 Safari/537.36"
xmlHttp.send

' 加载网页内容
htmlDoc.body.innerHTML = xmlHttp.responseText

' 直接通过CSS类名抓目标表格
Set targetTable = htmlDoc.querySelector(".snapshot-table2-table")

If targetTable Is Nothing Then
    MsgBox "没找到目标表格,要么页面变了,要么股票代码错了。"
    Exit Sub
End If

' 清空旧数据
tgt.Range("A2").CurrentRegion.Clear

' 遍历表格内容写入Excel
i = 2
For Each row In targetTable.Rows
    j = 1
    For Each cell In row.Cells
        tgt.Cells(i, j).Value = cell.innerText
        j = j + 1
    Next cell
    i = i + 1
Next row

' 释放对象
Set xmlHttp = Nothing
Set htmlDoc = Nothing
Set targetTable = Nothing
MsgBox "数据抓完了。"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 09:50:37