Gandalf
Gandalf

Reputation: 166

Quitting the IE in the end of VBA function

I implemented several functions which relies on downloading some information from some websites.

The simplest example of such a function is:

Public Function getSomething(webAddress As String)
    Dim html As HTMLObjectElement
    Set html = getWebContents(webAddress)
    Set elems = html.body.getElementsByTagName(tagName)
    ...
End Function

The function for acquire data from websites is:

Public Function getWebContents(webAddress As String) As HTMLObjectElement
    Dim ie As InternetExplorer
    Dim html As HTMLDocument
    Set ie = New InternetExplorer
    ie.Visible = False
    ie.Navigate webAddress
    Do While ie.READYSTATE <> READYSTATE_COMPLETE
        Application.StatusBar = "Trying ..."
        DoEvents
    Loop

    Set getWebContents = ie.Document

    'close down IE and reset status bar
    'ie.Quit
    Set ie = Nothing
    Application.StatusBar = ""
End Function

The problem is that it seems that I need the line ie.Quit to be uncommented to close the IE instance. But when I uncomment ie.Quit the line

Set elems = html.body.getElementsByTagName(tagName)

generates errors.

It seems that I cannot use HTMLObjectElement returned by function getWebContents when IE has been quitted. How to deal with that? I could implement a try...finally block in getSomething function and open ie there and close in the finally block. However I have many functions of a similar nature and making many similar try...finally blocks seems a stupid idea.

Any thoughts? Thanks!

Upvotes: 1

Views: 4917

Answers (2)

Kostas K.
Kostas K.

Reputation: 8518

You should define a procedure to handle the object lifetime from creation to destruction. You can then pass a reference for the object to the function.

Lastly, you can dispose the object even if an error occurs at any stange.

Public Sub Main()
    On Error GoTo ErrProc

    Dim ie As InternetExplorer
    Set ie = New InternetExplorer

    '....

    Dim obj As Object
        obj = getWebContents(ie, "url")

Leave:
    ie.Quit
    Set ie = Nothing
    Set obj = Nothing
    Application.StatusBar = ""
    On Error GoTo 0
    Exit Sub

ErrProc:
    MsgBox Err.Description, vbCritical
    Resume Leave
End Sub


Public Function getWebContents(ie As InternetExplorer, webAddress As String) As HTMLObjectElement
    '...
End Function

Upvotes: 1

Sam
Sam

Reputation: 5721

You are keeping a pointer to the DOM in the html variable. If you close IE, you are pointing to something non-existing. The simple answer is to close IE at the end of getSomething. In your case, this means that you have to restructure your code so that your IE variable is accessible from other places than in getWebContents

Upvotes: 1

Related Questions