VBA Excel - IE GetElementByID не работает - ошибка времени выполнения 424 Требуется объект - PullRequest
0 голосов
/ 08 мая 2018

У меня проблемы с получением Excel VBA (Office 2016) для управления IE (версия 11). Мне нужно ввести информацию в несколько полей в форме и нажать на несколько переключателей. Я идентифицировал идентификаторы объектов для всех полей, которые мне нужно изменить. Мой код скопирован / изменен из зрелого кода, который я написал несколько лет назад, чтобы делать подобные вещи на другом веб-сайте. Хотя он продолжает работать на другом сайте сегодня, он не работает здесь. К сожалению, это частный сайт, поэтому я не могу поделиться ссылкой, но вот часть моего кода и часть кода веб-страницы:

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-кода для веб-страницы

Screenshot of HTML code for webpage

Почему это работает для одного сайта, а не для другого?

Как дополнительное примечание: когда я использую

Set objCollection = IE.Document.getElementsByClassName("Class")
MsgBox objCollection.Length

иногда это приводит к тому, что один или несколько объектов собираются, но обычно приводит к нулю. Как только у меня есть объект, который мне нужен, в сборщике у меня все хорошо, но я еще не там.

Если вы увидите ошибку, которую я делаю, я был бы очень признателен, чтобы узнать об этом, так как я сейчас очень смущен.

У меня есть следующие библиотеки:

Visual Basic для приложений

Библиотека объектов Microsoft Excel 16.0

OLE Automation

Библиотека объектов Microsoft Office 16.0

Библиотека объектов Microsoft Forms 2.0

Объекты данных Microsoft ActiveX 6.1. Библиотека

Microsoft Internet Controls

Библиотека объектов Microsoft HTML

***** Вот (измененный) скриншот веб-страницы, с которой я работаю, если это вообще помогает. *****

Webpage screenshot

Глядя на скриншот, я должен искать объект внутри объекта? Нужно ли мне найти родительский объект (выступающую форму на веб-странице), прежде чем я смогу найти дочерний объект (поле в форме)?

1 Ответ

0 голосов
/ 09 мая 2018

Я нашел ответ! Я должен был опубликовать чуть больше кода веб-браузера на картинке выше, и кто-то другой нашел бы его несколько часов назад. Вот это с дополнительным кодом:

Увеличенный скриншот HTML-кода с веб-страницы

В верхнем левом углу скриншота показан тэг "iframe" (что для меня сегодня ново). Объекты, которые мне нужны, содержатся в этом объекте iframe. Как только я это выяснил, я нашел это обсуждение , которое помогло мне создать эту строку кода:

Set objCollection = IE.Document.getElementsByTagName("iframe")(1).contentDocument.getElementsByTagName("input")

(Значение (1) связано с тем, что у меня есть два объекта iframe, и я использую второй.)

Если у меня есть это, нужно просто найти объект с правильным идентификатором в коллекции!

Я мог бы танцевать от радости!

...