Navigating through websites

2019-08-11 01:24发布

问题:

My code is able to interact with the first webpage it brings up, but then as soon as i navigate away from it, my code gives me a '424' object required error. Here is an example.

EX: go to yahoo.com - search for 'Earth' - click on the Yahoo logo to return to the yahoo homepage

Sub InternetPractice()

Dim ie As InternetExplorer

Set ie = New InternetExplorer

ie.Visible = True

ie.navigate "https://www.yahoo.com"

Do While ie.Busy = True Or ie.readyState <> 4: DoEvents: Loop

ie.document.getElementById("uh-search-box").Value = "Earth"
ie.document.getElementById("uh-search-button").Click


Do While ie.Busy = True Or ie.readyState <> 4: DoEvents: Loop

ie.document.getElementById("logo").Click

End Sub

Using VBA with the internet is new to me and any help is appreciated!

回答1:

EDIT:

I think you are not giving enough time for ie to load... It is working for me. So you can try this code that gives more time and try to load 3 times before aborting.

Option Explicit
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub InternetPractice2()


    Dim IE As InternetExplorer
    Dim HTMLDoc As HTMLDocument
    Dim logo As Object
    Dim n As Long
    Set IE = New InternetExplorer                'Set IE = CreateObject("InternetExplorer.Application")

    With IE
        .Silent = True
        .Visible = True
        .Navigate "https://www.yahoo.com"
    End With

    WaitIE IE, 5000

    Set HTMLDoc = IE.Document
    HTMLDoc.getElementById("uh-search-box").Value = "Earth"
    HTMLDoc.getElementById("uh-search-button").Click

load:
    WaitIE IE, 10000
    Set logo = HTMLDoc.getElementById("logo")
    If Not logo Is Nothing Then
        logo.Click
    ElseIf logo Is Nothing And n < 4 Then
        n = n + 1
        GoTo load
    End If
    WaitIE IE, 5000

    'Set ie to Nothing
    IE.Quit
    Set IE = Nothing
End Sub
Sub WaitIE(IE As Object, Optional time As Long = 250)
'Code from: https://stackoverflow.com/questions/33808000/run-time-error-91-object-variable-or-with-block-variable-not-set
Dim i As Long
Do
    Sleep time
    Debug.Print CStr(i) & vbTab & "Ready: " & CStr(IE.READYSTATE = 4) & _
                vbCrLf & vbTab & "Busy: " & CStr(IE.Busy)
    i = i + 1
Loop Until IE.READYSTATE = 4 Or Not IE.Busy
End Sub

Original Answer

Try closing ie in the end of the code and add some delay, because if you step the code with F8, you will see that it works:

Sub InternetPractice2()

Dim ie As InternetExplorer

Set ie = New InternetExplorer

ie.Visible = True

ie.navigate "https://www.yahoo.com"

Do While ie.Busy = True Or ie.READYSTATE <> 4: DoEvents: Loop

ie.Document.getElementById("uh-search-box").Value = "Earth"
ie.Document.getElementById("uh-search-button").Click
'Add delay After .Click

Do While ie.Busy = True Or ie.READYSTATE <> 4: DoEvents: Loop
Application.wait Now+Timevalue("00:00:05")

ie.Document.getElementById("logo").Click
'Set ie to Nothing
Set ie = Nothing
End Sub

Also close all iexplorer.exe on Windows Task Manager.