Excel VBA已定义number变量 运行时为何仍报Error 91错误?
问题原因
Error 91 全称是「对象变量或 With 块变量未设置」,你碰到的报错和已经声明的number变量没有任何关系,报错触发在取值逻辑的前半段:
你调用html.getElementsByClassName("arial_14 redFont")时,没有找到符合该类名的元素,返回的是空的DOM集合,此时你直接调用.Item(0)读取空集合的第一个元素,就等于操作未初始化的对象,触发91错误。
常见的触发场景有两个:
- 目标站点有反爬机制,XMLHTTP直接请求返回的页面结构和浏览器正常访问的结构不一致,返回的页面里根本没有你要找的
arial_14 redFont类名元素 - 页面结构更新,目标元素的类名已经发生了变更
修复方案
- 先加非空判断逻辑,避免直接操作空对象报错
- 可以先打印请求返回的完整页面文本,查找你要的数值对应的正确类名,再替换代码里的类名字符串
修改后的参考代码
Sub Get_Housing_Starts_From_Investing() Dim request As Object Dim response As String Dim html As New HTMLDocument Dim website As String Dim number As Variant Dim elementCol As IHTMLElementCollection ' 新增元素集合变量 ' 引用配置保持不变:Microsoft Office 16.0 Object Library, Microsoft HTML Object Library, Microsoft XML, v6.0等 website = "https://www.investing.com/economic-calendar/housing-starts-151" Set request = CreateObject("Msxml2.ServerXMLHTTP.6.0") request.Open "GET", website, False request.setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT" ' 额外加UA头模拟浏览器请求,降低被反爬拦截的概率 request.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" request.send response = StrConv(request.responseBody, vbUnicode) html.body.innerHTML = response ' 先获取元素集合,再判断是否非空 Set elementCol = html.getElementsByClassName("arial_14 redFont") ' 后续找到正确类名替换这里即可 If elementCol.Length > 0 Then number = elementCol.Item(0).innerText Else number = "未找到对应元素,请检查类名或请求返回的页面内容" ' 调试时可以取消下面这行注释,输出完整页面内容查找正确的元素标识 ' Debug.Print response End If MsgBox number End Sub
内容的提问来源于stack exchange,提问作者Gohanter
相关产品推荐
相关产品推荐

