Прежде всего после objIE.Navigate URL
следует дождаться полной загрузки сайта и готовности IE. Это делается с помощью следующего:
objIE.Navigate URL 'this needs some time but VBA will continue excecuting the next statement qickly
Const READYSTATE_COMPLETE As Integer = 4
Do While objIE.Busy Or objIE.ReadyState <> READYSTATE_COMPLETE
DoEvents
Loop
'now IE is ready and the page is loaded.
Но, возможно, некоторые JavaScript еще не готовы, и это не распознается objIE.Busy
или objIE.ReadyState
. Таким образом, вы можете сделать обходной путь:
Dim Obj As Object
Do While Obj Is Nothing
On Error Resume Next
Set Obj = objIE.Document.getElementById("student.firstName")
On Error GoTo 0
Loop
'now `student.firstName` is accessible, and probably all the other fields are too.
Это попытается получить доступ к полю student.firstName
, если его там нет, произойдет ошибка. Мы подавляем сообщение об ошибке, используя On Error Resume Next
, и возвращаемся к TryAgain
, пока оно не будет найдено.
Обратите внимание, что у этого есть один недостаток: если есть проблема с загрузкой этого сайта, он застрянет в этом l oop. Поэтому я рекомендую получить критерий отмены по времени, например, если это займет больше минуты, отмените его и сгенерируйте сообщение об ошибке.
Должно работать что-то вроде следующего:
Option Explicit
Sub test()
Dim objIE As Object
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True
Dim URL As String
URL = "https://npc.collegeboard.org/app/dartmouth/start"
objIE.Navigate URL
Const READYSTATE_COMPLETE As Integer = 4
Do While objIE.Busy Or objIE.ReadyState <> READYSTATE_COMPLETE
DoEvents
Loop
Dim Obj As Object
Do While Obj Is Nothing
On Error Resume Next
Set Obj = objIE.Document.getElementById("student.firstName")
On Error GoTo 0
Loop
objIE.Document.getElementById("student.firstName").Focus
objIE.Document.getElementById("student.firstName").Value = "Tom"
End Sub