You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

VBA新手遇‘Object variable or With Block Variable not set’错误求修正

解决VBA获取Tokopedia价格时的"Object variable or With Block Variable not set"错误

作为VBA新手遇到这类对象未初始化的问题很常见,咱们来一步步拆解问题并修正你的脚本:

错误根源分析

  1. 对象赋值不匹配:你把请求返回的HTML内容赋值给了BHTMLDoc,但后续查找元素时却用了未赋值的HTMLDoc,这直接导致了"变量未设置"的错误。
  2. 选择器写错了
    • 大小写不匹配:HTML里的data-testidhSRPProdPrice(首字母大写H),你写成了小写的hsRPProdPrice
    • 层级错误:目标价格本身就在带有data-testid="hSRPProdPrice"<span>标签里,不需要再额外查找子<span>

修正后的完整VBA脚本

Sub ExtractTokopediaPrices()
    Dim XMLPage As New MSXML2.XMLHTTP60
    Dim HTMLDoc As New MSHTML.HTMLDocument
    Dim priceElements As MSHTML.IHTMLElementCollection
    Dim i As Long
    
    ' 发送GET请求获取页面内容
    XMLPage.Open "GET", "https://www.tokopedia.com/search?st=product&q=buku&ob=3&pmin=16411&origin_filter=sort_price", False
    XMLPage.send
    
    ' 将响应内容加载到HTML文档对象中
    HTMLDoc.body.innerHTML = XMLPage.responseText
    
    ' 精准定位所有价格元素
    Set priceElements = HTMLDoc.querySelectorAll("[data-testid='hSRPProdPrice']")
    
    ' 遍历输出价格,同时增加空值判断避免报错
    If priceElements.Length > 0 Then
        For i = 0 To priceElements.Length - 1
            Debug.Print "价格" & i + 1 & ": " & priceElements.Item(i).innerText
        Next i
    Else
        Debug.Print "未找到任何价格元素,请检查页面结构或请求链接"
    End If
End Sub

关键优化点说明

  • 统一对象使用:全程用HTMLDoc承载页面内容,确保元素查找的对象是有效的
  • 精准选择器:直接定位到目标价格所在的<span>,避免层级错误
  • 增加容错逻辑:先检查元素集合是否为空,防止因页面结构变化再次触发错误
  • 循环范围优化:用priceElements.Length - 1作为循环上限,避免索引越界

运行这个脚本后,你就能在立即窗口中看到类似Rp 16.425的价格信息了。

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

火山引擎 最新活动