如何用VBA从HTML提取价格?Excel VBA新手遇运行时错误91求助
解决Excel VBA提取HTML价格时的运行时错误'91'
嘿,作为VBA新手碰到这个问题太正常了!你遇到的运行时错误'91',核心原因是代码里尝试引用一个还没被正确初始化的对象——要么是你要找的HTML元素没找到,要么是变量类型匹配错了。咱们一步步拆解问题,再给你修正后的代码:
问题出在哪?
- 变量类型不匹配:你把
htmlprice定义成了MSHTML.IHTMLElement,但最后赋值的是innerText(这是字符串类型),相当于把文本塞给了元素对象,逻辑完全不对。 - 元素查找无容错:
getElementsByClassName("txcpa-itemDetails").Item(1)直接硬取索引1的元素,但如果这个类名的元素不存在,或者集合里只有1个元素(HTML集合默认从0开始索引),就会直接报错。 - 页面等待不严谨:单纯用
readyState <> READYSTATE_COMPLETE等待页面加载,有时候页面的DOM元素还没完全渲染出来,导致你去查找元素时它还不存在。
修正后的代码
Option Explicit Sub test() Dim ie As New SHDocVw.InternetExplorer Dim htmldoc As MSHTML.HTMLDocument Dim htmlprices As MSHTML.IHTMLElementCollection Dim htmlprice As String ' 改成字符串类型,因为要存文本内容 ie.Visible = True ie.Navigate "http://www.txsmartbuy.com/product/10377318" ' 改进页面等待逻辑,确保DOM完全加载完成 Do While ie.readyState <> READYSTATE_COMPLETE Or ie.Busy DoEvents ' 让程序响应其他事件,避免假死 Loop Set htmldoc = ie.Document ' 先检查目标元素集合是否存在 Set htmlprices = htmldoc.getElementsByClassName("txcpa-itemDetails") If htmlprices.Count > 0 Then ' 注意:HTML集合索引从0开始,要第二个元素用Item(1),第一个用Item(0) htmlprice = htmlprices.Item(1).innerText MsgBox "提取到的内容:" & htmlprice Else MsgBox "未找到目标元素!" End If ' 记得关闭IE,避免后台残留进程 ie.Quit Set ie = Nothing End Sub
额外提示
- 如果你不确定目标元素的索引,可以先打印
htmlprices.Count看看集合里有多少个元素,再决定用哪个索引值。 - 要是页面是JS动态渲染内容,上面的代码还是找不到元素,可能需要再加一段等待时间,或者用
htmldoc.querySelector更精准地定位价格对应的子元素。
内容的提问来源于stack exchange,提问作者Tanner Jones




