Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA Excel-IE GetElementByID不工作-运行时错误424需要对象_Vba_Excel_Internet Explorer_Getelementbyid - Fatal编程技术网

VBA Excel-IE GetElementByID不工作-运行时错误424需要对象

VBA Excel-IE GetElementByID不工作-运行时错误424需要对象,vba,excel,internet-explorer,getelementbyid,Vba,Excel,Internet Explorer,Getelementbyid,我无法让Excel VBA(Office 2016)控制IE(版本11)。我需要在表单中的几个字段中输入信息,然后单击几个单选按钮。我已经为所有需要修改的字段标识了对象ID。我的代码是从我几年前编写的成熟代码中复制/修改的,以便在另一个网站上执行类似的操作。虽然今天它在另一个网站上继续工作,但在这里却不起作用。不幸的是,它是一个专有网站,因此我无法共享该链接,但以下是我的一些代码和网页代码的一部分: Sample of my code: Dim IE As Object, objShell As

我无法让Excel VBA(Office 2016)控制IE(版本11)。我需要在表单中的几个字段中输入信息,然后单击几个单选按钮。我已经为所有需要修改的字段标识了对象ID。我的代码是从我几年前编写的成熟代码中复制/修改的,以便在另一个网站上执行类似的操作。虽然今天它在另一个网站上继续工作,但在这里却不起作用。不幸的是,它是一个专有网站,因此我无法共享该链接,但以下是我的一些代码和网页代码的一部分:

Sample of my code:
Dim IE As Object, objShell As Object, objCollection As Object

' Take control of the webpage:

' Get the page url
URL = "---------"

' Find the correct instance of IE
marker = 0
Set objShell = CreateObject("Shell.Application")
IE_count = objShell.Windows.Count
For X = 0 To (IE_count - 1)
    On Error Resume Next
    my_title = objShell.Windows(X).Document.Title
    my_url = objShell.Windows(X).LocationURL
    If IsEmpty(my_url) Then
        my_url = objShell.Windows(X).Document.Location
    End If

    If my_url Like Left(URL, 45) & "*" Then 'compare to find if the desired web page is already open
        Set IE = objShell.Windows(X)
        marker = 1
        Exit For
    Else
    End If
Next
If marker = 0 Then
    MsgBox ("Webpage not found. Please login manually.")
    Exit Sub
End If
On Error GoTo -1
On Error GoTo 0
' Wait if necessary
Do Until (IE.ReadyState = 4 And Not IE.Busy)
    DoEvents
    Application.StatusBar = "Waiting for Internet Explorer."
Loop
Application.StatusBar = False

' Set objCollection object
Set objCollection = IE.Document.getElementByID("QSHAA5V0GH4LSAO2AI5R2M853SJ5AI") 
' This is the actual ID of one of the fields I need to enter data into (see screenshot below)
' The above line gives the familiar "Runtime error 424 Object Required" error.
网页的HTML代码截图

为什么这适用于一个网站而不适用于另一个网站

作为补充说明:当我使用

Set objCollection = IE.Document.getElementsByClassName("Class")
MsgBox objCollection.Length
它有时会导致收集一个或多个对象,但通常会导致零。一旦我在收藏家里找到了我需要的东西,我就很好了,但我还没有到那里

如果你看到我犯了一个错误,我会非常感激你能知道,因为我现在很困惑

我拥有以下图书馆:

Visual Basic For Applications

Microsoft Excel 16.0对象库

OLE自动化

Microsoft Office 16.0对象库

Microsoft Forms 2.0对象库

Microsoft ActiveX数据对象6.1库

Microsoft Internet控件

Microsoft HTML对象库

*****这是我正在使用的网页的(修改过的)截图,如果有帮助的话*****


看屏幕截图,我应该在一个对象中寻找一个对象吗?在找到子对象(表单上的字段)之前,我是否需要找到父对象(网页中突出的表单)?

我找到了答案!我应该在上面的图片中多发布一点web浏览器代码,其他人几个小时前就会发现了。下面是额外的代码:

屏幕截图的左上角显示标记名“iframe”(这是我今天所不熟悉的)。我需要的对象包含在此iframe对象中。一旦我发现了这一点,我就找到了帮助我创建这一行代码的方法:

Set objCollection = IE.Document.getElementsByTagName("iframe")(1).contentDocument.getElementsByTagName("input")
(值(1)是因为我有两个iframe对象,并且我正在使用第二个对象。)

一旦我有了这个,就只需要在集合中寻找具有正确ID的对象


我可以高兴地跳舞

查看您有限的代码,如果您与URL不匹配,您将永远无法创建IE对象。如果没有设置IE对象,它很可能会抛出该错误。你能在那一行设置一个断点并检查IE对象是否被设置并指向wright IE会话吗?好问题。我使用[MsgBox URL&Chr(10)&my_URL]进行了检查,并验证了URL是否完全匹配。好的,但是IE对象是否按预期设置?此外,我还验证了IE在[set IE=objShell.Windows(X)]之后设置为“Internet Explorer”(正确的会话)。如果有帮助,我添加了一个修改过的网页截图。