VBA:运行时错误424:尝试web刮取时需要对象

VBA:运行时错误424:尝试web刮取时需要对象,vba,object,Vba,Object,我正在尝试使用morgnistar.co.uk更新各种基金规模。代码工作正常,直到它突然停止并出现错误: “运行时错误424:需要对象”。 发生错误的确切行是: Set allData=IE.document.getElementById(“概览QuickStatsDiv”).getElementsByTagName(“tbody”)(0) 我们的想法是最终扫描整个“tbody”标签,并在“tr”和“td”标签中查找“Fund Size”一行。当找到“基金规模”时,代码将返回第三个“td”-标记

我正在尝试使用morgnistar.co.uk更新各种基金规模。代码工作正常,直到它突然停止并出现错误: “运行时错误424:需要对象”。 发生错误的确切行是:

Set allData=IE.document.getElementById(“概览QuickStatsDiv”).getElementsByTagName(“tbody”)(0)

我们的想法是最终扫描整个“tbody”标签,并在“tr”和“td”标签中查找“Fund Size”一行。当找到“基金规模”时,代码将返回第三个“td”-标记(实际基金规模)。 在这之后,我会添加一个循环来循环我拥有的资金列表。 由于代码完全停止工作,我还没有做到这一点。这里我只是想检查代码是否返回实际的基金规模。 由于“tr”标记中并不总是有3个“td”标记,因此我仍然需要构造某种IF语句来解决这个问题

但现在我只想知道如何让代码再次运行?我花了很多时间寻找答案,但这似乎是一个可变类型的问题,解决方案取决于具体情况

我正在使用Excel 2010和Internet Explorer 11

易于复制粘贴的URL格式:

编辑: 切换方法。现在的问题是提取基金规模。因此,下面的代码按原样工作,但我需要添加几行代码,以获得基金规模。这是我第一次使用这种方法,所以很可能我还没有理解一些真正基本的东西。尽管如此,我还是无法独自找到解决方案

Sub XMLhttpRequestTest()

'Microsoft XML, v 6.0
'Microsoft HTML object library

Dim HTMLDoc As New HTMLDocument
Dim ohttp As New MSXML2.XMLHTTP60 

Dim myurl As String
Dim TRelements As Object
Dim TRelement As Object

myurl = "http://www.morningstar.co.uk/uk/funds/snapshot/snapshot.aspx?id=F0GBR04BKW"
ohttp.Open "GET", myurl, False
ohttp.send


HTMLDoc.body.innerHTML = ohttp.responseText

With HTMLDoc.body
    Set TRelements = .getElementsByTagName("tr")

    For Each TRelement In TRelements
        Debug.Print TRelement.innerText
    Next

End With


End Sub
你可以使用

然后选择索引4处的元素

#
表示id。
=类名

Option Explicit
Public Sub XMLhttpRequestTest()
    'Microsoft XML, v 6.0
    'Microsoft HTML object library

    Dim HTMLDoc As New HTMLDocument, ohttp As New MSXML2.XMLHTTP60

    Const URL As String = "http://www.morningstar.co.uk/uk/funds/snapshot/snapshot.aspx?id=F0GBR04BKW"
    Dim TRelements As Object, TRelement As Object

    With ohttp
        .Open "GET", URL, False
        .send

        HTMLDoc.body.innerHTML = .responseText
        Debug.Print HTMLDoc.querySelectorAll("#overviewQuickstatsDiv td.line.text")(4).innerText
        'Your other stuff
    End With
End Sub
你可以使用

然后选择索引4处的元素

#
表示id。
=类名

Option Explicit
Public Sub XMLhttpRequestTest()
    'Microsoft XML, v 6.0
    'Microsoft HTML object library

    Dim HTMLDoc As New HTMLDocument, ohttp As New MSXML2.XMLHTTP60

    Const URL As String = "http://www.morningstar.co.uk/uk/funds/snapshot/snapshot.aspx?id=F0GBR04BKW"
    Dim TRelements As Object, TRelement As Object

    With ohttp
        .Open "GET", URL, False
        .send

        HTMLDoc.body.innerHTML = .responseText
        Debug.Print HTMLDoc.querySelectorAll("#overviewQuickstatsDiv td.line.text")(4).innerText
        'Your other stuff
    End With
End Sub

没有责备。您的代码在我这端运行得很好。为什么将其标记为[必需]?标记描述是“Required是一个强制提供输入的输入元素的HTML属性”。那么您认为错误与该属性的使用有关吗?
IE
尚未完成加载,我猜,请检查值
IE.Document.Body
。在导航后使用
的同时使用
即忙或IE.Readystate 4`。跳过do循环,开始时您已经有了正确的
IE
,如果
Instr
条件不为真,这个循环可能会无限。非常简单:您选择的div不包含
tbody
元素,因此
.getElementsByTagName(“tbody”)
返回NULL。代码再次运行了一段时间,直到停止。我做了进一步的研究,原因可能与使用Internet Explorer有关。代码可能试图打开“太多”窗口(或类似的东西),这会导致代码以某种方式停止。目前,我在第二行得到一个错误(设置IE=…)。错误消息:“vba运行时错误”-2147467259(80004005)':自动化错误未指定错误”。我切换到XMLHttpRequest方法,它似乎可以工作。我只在解析数据方面有问题。我添加了上面的代码作为编辑。没有复制。您的代码在我这端运行得很好。为什么将其标记为[必需]?标记描述是“Required是一个强制提供输入的输入元素的HTML属性”。那么您认为错误与该属性的使用有关吗?
IE
尚未完成加载,我猜,请检查值
IE.Document.Body
。在导航后使用
的同时使用
即忙或IE.Readystate 4`。跳过do循环,开始时您已经有了正确的
IE
,如果
Instr
条件不为真,这个循环可能会无限。非常简单:您选择的div不包含
tbody
元素,因此
.getElementsByTagName(“tbody”)
返回NULL。代码再次运行了一段时间,直到停止。我做了进一步的研究,原因可能与使用Internet Explorer有关。代码可能试图打开“太多”窗口(或类似的东西),这会导致代码以某种方式停止。目前,我在第二行得到一个错误(设置IE=…)。错误消息:“vba运行时错误”-2147467259(80004005)':自动化错误未指定错误”。我切换到XMLHttpRequest方法,它似乎可以工作。我只在解析数据方面有问题。我添加了上面的代码作为编辑。
Option Explicit
Public Sub XMLhttpRequestTest()
    'Microsoft XML, v 6.0
    'Microsoft HTML object library

    Dim HTMLDoc As New HTMLDocument, ohttp As New MSXML2.XMLHTTP60

    Const URL As String = "http://www.morningstar.co.uk/uk/funds/snapshot/snapshot.aspx?id=F0GBR04BKW"
    Dim TRelements As Object, TRelement As Object

    With ohttp
        .Open "GET", URL, False
        .send

        HTMLDoc.body.innerHTML = .responseText
        Debug.Print HTMLDoc.querySelectorAll("#overviewQuickstatsDiv td.line.text")(4).innerText
        'Your other stuff
    End With
End Sub