getElementById не будет работать в VBA, ошибка 438 - PullRequest
1 голос
/ 14 июня 2019

Я относительно новичок в VBA (я знаю основы, но не очень), и я пытаюсь настроить код, который будет заполнять онлайн-формы для меня, но когда я запускаю свой код, я получаю ошибку 438 :

объект не поддерживает это свойство или метод

когда доберется до

ie.document.getElementById ("q")

Я добавил библиотеку объектов HTML и интернет-элементы управления Microsoft к своим ссылкам. Я посмотрел на тонны онлайн-форумов. Я даже скопировал и вставил весь скрипт прямо в VBA. Ничто не заставит его использовать getElementById(). Вот мой код:

Sub internetstuff()

Dim ie As Object

Set ie = CreateObject("internetexplorer.application")

ie.Visible = True

ie.navigate ("https://www.google.com/")

Set searchbx = ie.document.getElementById("q")

searchbx.Value = "Howdy!"

End Sub

Что должно произойти, так это то, что он должен открыть InternetExplorer, зайти в Google и заполнить строку поиска «Привет!». Вместо этого он открывает только Google, затем я получаю сообщение об ошибке, и он перестает работать.

Ответы [ 2 ]

2 голосов
/ 14 июня 2019

Поскольку "q" - это не ID, это Name.

. Вы должны использовать GetElementsByName и выбрать 1-й элемент

, попробуйте это:

Sub internetstuff()

Dim ie As Object

Set ie = CreateObject("internetexplorer.application")

ie.Visible = True

ie.Navigate ("https://www.google.com/")

    Do Until ie.ReadyState >= 4
        DoEvents
    Loop


Set searchbx = ie.document.getElementsByName("q")(0)

searchbx.Value = "Howdy!"

End Sub

Я также добавил ожидающее событие, если для загрузки Google требуется время.


Результат:

enter image description here

0 голосов
/ 14 июня 2019

Более кратким и эффективным способом является использование querySelector для возврата первого совпадения для атрибута имени

Option Explicit
Public Sub internetstuff()
    Dim ie As Object
    Set ie = CreateObject("InternetExplorer.Application")
    With ie
        .Visible = True
        .Navigate2 "https://www.google.com/"
        While .Busy Or .readyState < 4: DoEvents: Wend
        .document.querySelector("[name=q]").Value = "Howdy"
         Stop '<delete me later
        .Quit
    End With
End Sub
...