首页 > 解决方案 > 如何修复 Excel VBA 脚本中的运行时错误 91

问题描述

我创建了一个小脚本,它从网站表格中获取一些数据并将其填充到 Excel 中的单元格中。我需要这个才能让自己更轻松地搜索这些数据并对其进行过滤。但是我遇到了一个小问题,每次我运行我的脚本时,它都会执行大约 9 到 11 页(大约 250 个单元格条目)应该做的事情,然后停止并弹出一条错误消息,上面写着“运行时错误 91”对象变量或未设置块变量。它从来没有一直运行到最后,我只得到了我应该得到的数据的一小部分。

我不是编程专家,更不是 VBA 专家,所以如果我做错了什么,请告诉我。我已经被这个问题困扰了几天。我不知道该怎么做才能解决这个问题。我已经在 Google、YouTube 甚至微软自己的网站上寻找修复程序,但无法弄清楚为什么这个错误会在我自己的脚本中弹出。

我知道这个问题是什么时候遇到的;1) 您尝试使用尚未引用有效对象的对象变量,或者 2) 您尝试使用已设置为 Nothing 的对象变量。但我不知道我在代码的哪一部分犯了这个错误。非常感谢帮助。


更新:当我从 8 开始页码并上升到 15 时,从网站中提取数据没有问题,所以我认为它与特定的页码没有任何关系(我可能是错的对这个)。但是当我将页码设置为 17 而不是 15 时,错误消息几乎立即弹出。那么,可能是页面之间的范围导致了这种情况吗?

更新 2:当错误消息弹出时,它也有点不一致,当我使用相同的页码(8 到 17)再次运行脚本时,它贯穿整个事情而没有打嗝。(奇怪)然后我将页码从(8 到 18)更改为 2 页并停止。

更新 3:这是否可能因为我受到速率限制而发生?

Sub GrabInfo()

    Dim objIE As InternetExplorer

    Dim r As Integer
    Dim p As Integer
    Dim c As Integer

    r = 0
    p = 0
    c = 0

    Dim sDD1 As String
    Dim sDD2 As String
    Dim sDD3 As String

    Set objIE = New InternetExplorer
    'objIE.Visible = True

    Do While p < 53
    p = p + 1

        'Setting row to zero after the new page loads but before the data gets pulled
        r = 0

        objIE.navigate "URLGOESHERE.com/123456789?pageNum=" & p
        Do While objIE.Busy = True Or objIE.readyState <> 4: DoEvents: Loop

        Do While r < 25
        'Increment the row (gets reset after each page)
        r = r + 1
        'Increment the cell (never gets reset)
        c = c + 1

            'Pulling data from site row by row and setting each child to temp sDD strings
            sDD1 = objIE.document.getElementsByClassName("table-content")(r - 1).Children(0).innerText
            sDD2 = objIE.document.getElementsByClassName("table-content")(r - 1).Children(2).innerText
            sDD3 = objIE.document.getElementsByClassName("table-content")(r - 1).Children(3).innerText

            Debug.Print sDD1 & " | " & sDD2 & " | " & sDD3 & " - " & _
            "Cell # = " & c & " ROW # = " & r & " PAGE # = " & p

            'Filling in the temp sDD strings into excel cells
            Range("A" & (c + 1)).Value = sDD1
            Range("B" & (c + 1)).Value = sDD2
            Range("C" & (c + 1)).Value = sDD3

        Loop
    Loop

End Sub

标签: excelvba

解决方案


推荐阅读