运行时错误“91”(对象变量或未设置块变量)

Posted

技术标签:

【中文标题】运行时错误“91”(对象变量或未设置块变量)【英文标题】:Run-time error '91' (Object variable or With block variable not set) 【发布时间】:2015-11-19 15:28:21 【问题描述】:

我对 VBA 比较陌生,正在尝试组合一个 msgbox,它可以从网络抓取中给我一个特定的数字,但是我一直遇到运行时错误“91”,我根本不知道如何解决这个问题。我搜索了无数的 *** 问题、youtube 视频和通用 google 搜索,但我自己未能成功找出错误。

代码如下:

Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True
IE.Navigate ("http://brokercheck.finra.org")
Do
DoEvents
Loop Until IE.ReadyState = 4

'Enter values from the corresponding sheet
'Set some generic typing for ease
Set doc = IE.document

    doc.GetElementbyID("GenericSearch_IndividualSearchText").Value = Worksheets("Master").Range("D203")
    doc.GetElementbyID("GenericSearch_EmploymingFirmSearchText").Value = Worksheets("Master").Range("C203")

    Set elements = doc.getElementsByTagName("button")
    For Each element In elements
    If element.getAttribute("type") = "submit" Then
        element.Click
        Exit For
    End If
    Next element

Do
DoEvents
Loop Until IE.ReadyState = 4

'find CRD#
    Set crd = doc.getElementsByClassName("summarydisplaycrd")(0).innerText 'here is where the run time error occurs
    MsgBox crd

以及我试图从中获取信息的 html

<div class="searchresulttext">
    <div class="bcrow">
        <div class=""> <span class="summarydisplayname">[redacted]</span> <span class="summarydisplaycrd text-nowrap">(CRD# 5944070)</span></div>

【问题讨论】:

它在哪一行抛出错误? 尝试遍历crd 集合,看看它是否真的返回了任何东西。我的钱是在没有找到任何元素... 是的,先Set crd = doc.getElementsByClassName("summarydisplaycrd") 然后MsgBox (crd Is Nothing) @macro Man 我有一个朋友在 java 中做了类似的事情,doc.getElementsByClassName("summarydisplaycrd")[0].innerHTML 返回了正确的 crd 号,所以我只是将它编辑到上面,希望它能起作用。我迭代 (0) 到 (13) 并确实得到了一些文本,只是没有我正在寻找的 crd#。 另一个可能的问题是 innerText 返回一个字符串,因此您不要使用 Set 关键字分配它。只需执行crd = doc.getElementsByClassName("summarydisplaycrd")(0).innerText(或.innerHTML 【参考方案1】:

我正在查看此代码和 finra.org 网站,并有以下观察结果,如果得到解决,应该可以解决问题。

    根据“检查”按钮返回的实际 HTML,您提供的 HTML 示例完全不正确。

    实际返回的 HTML 是这样的,类名是"displayname",而不是"summarydisplaycrd"

<div class="SearchResultItemColor bcrow">
    <div class="searchresulttext">
        <div class="bcsearchresultfirstcol">
                <span class="displayname">[redacted]</span> <span class="displaycrd">(CRD# 123456789)</span>
    您的代码在找到first“提交”按钮后退出For each element 循环。这个可能不是“检查”按钮(尽管我可以通过任何一种方式获得结果,但您可能需要在代码中添加更多逻辑以确保“检查”按钮被提交。

更新

经过进一步审查,虽然我可以复制 Type 91 错误,但我仍然不知道为什么你的类名看起来与我的不同(可能是 IE11 的东西,不知道......)无论如何,我能够通过强制更长的延迟来解决这个问题,因为在这种情况下DoEvents 循环根本不够用(有时这是从外部函数动态提供数据的情况,浏览器是 ReadyState=4 和 .Busy=True,所以循环不做任何事情)

我使用 WinAPI 睡眠功能并在按下“单击”按钮后强制延迟 1 秒,在 ReadyState = 4 .Busy=True 的条件下循环。

注意您需要根据其在 HTML 中的显示方式修改 classname 参数。

Option Explicit
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub finra()
Dim IE As Object
Dim doc As Object, element As Object, elements As Object, crd

Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True
IE.Navigate ("http://brokercheck.finra.org")

Call WaitIE(IE, 1000)

'Enter values from the corresponding sheet
'Set some generic typing for ease
Set doc = IE.document

    doc.GetElementbyID("GenericSearch_IndividualSearchText").Value = "steve"
    doc.GetElementbyID("GenericSearch_EmploymingFirmSearchText").Value = "ed"

    Set elements = doc.getElementsByTagName("button")
    For Each element In elements
    If element.getAttribute("type") = "submit" Then
        If element.innerText = "Check " Then
            element.Click
            Exit For
        End If
    End If
    Next element


Call WaitIE(IE, 1000)

Dim itms As Object
'Set itms = doc.getElementsByClassName("displaycrd")
    crd = doc.getElementsByClassName("displaycrd")(0).innerText 'here is where the run time error occurs
    MsgBox crd
End Sub


Sub WaitIE(IE As Object, Optional time As Long = 250)
Dim i As Long
Do
    Sleep time
    Debug.Print CStr(i) & vbTab & "Ready: " & CStr(IE.ReadyState = 4) & _
                vbCrLf & vbTab & "Busy: " & CStr(IE.Busy)
    i = i + 1
Loop Until IE.ReadyState = 4 And Not IE.Busy
End Sub

【讨论】:

有趣。当我“检查元素”时,我被带到class="summarydisplayname" 但是我尝试使用您刚刚编写的编辑并在同一个地方出现同样的错误!好郁闷!! 嗯,我在浏览器中检查了源代码(右键单击查看源代码),并将查看模式用作 IE 10、IE10 兼容性、IE9、IE8,我只看到“displaycrd”作为类名。 你的仍然是summarydisplaycrd text-nowrap,与你之前的断言相反,它只是summarydisplaycrd... 对。我也试过 `summarydisplaycrd t​​ext-nowrap' 和同样的问题。 !other attempt Chrome 浏览器也只显示displaycrd。您使用什么浏览器来检查 HTML?

以上是关于运行时错误“91”(对象变量或未设置块变量)的主要内容,如果未能解决你的问题,请参考以下文章

Excel vba 运行时错误 91 对象变量或未设置块

运行时错误 91。未设置对象变量或块变量

解决 Excel VBA 文本文件导出中的运行时 91 错误

EBS WEBADI 下载模板提示 Visual Basic 运行时错误 ‘91‘ 对象变量或With块变量未设置

类函数中的错误 91

循环播放页面时出错。返回对象变量或未设置块变量