Automating Internet Explorer

    Here I will demonstrate some example code for automating Internet Explorer through Excel. You can open web pages, click buttons, import data, etc. The possibilities are endless.

    To use these samples you must reference two object libraries: Microsoft Internet Controls (shdocvw.dll) and Microsoft HTML Object Library (MSHTML.TLB).

Open a webpage and display (simple)

Sub GoToWebSite()

Dim appIE As InternetExplorer
Dim sURL As String
Application.ScreenUpdating = False

Set appIE = New InternetExplorer

sURL = "http://www.codeforexcelandoutlook.com"

With appIE
    .Navigate sURL
    .Visible = True
End With

Application.ScreenUpdating = True

Set appIE = Nothing
End Sub

Open a webpage, fill in form fields and click buttons

Sub GoToWebSiteAndPlayAround()

Dim appIE As InternetExplorer
Dim sURL As String
Dim UserN As Variant, PW As Variant
Dim Element As HTMLButtonElement
Dim btnInput As MSHTML.HTMLInputElement
Dim ElementCol As MSHTML.IHTMLElementCollection
Dim Link As MSHTML.HTMLAnchorElement
Dim strCountBody As String
Dim lStartPos As Long
Dim lEndPos As Long
Dim TextIWant As String

Application.ScreenUpdating = False

Set appIE = New InternetExplorer

sURL = "http://www.codeforexcelandoutlook.com"

With appIE
    .Navigate sURL
    ' uncomment the line below if you want to watch the code execute, or for debugging
    '.Visible = True
End With

' loop until the page finishes loading
Do While appIE.Busy
Loop

' enter username and password in textboxes
Set UserN = appIE.Document.getElementsByName("username")
If Not UserN Is Nothing Then
    UserN(0).Value = "login name"
End If

Set PW = appIE.Document.getElementsByName("password")
' password
If Not PW Is Nothing Then
    PW(0).Value = "my Password"
End If

' click 'Submit' button
Set ElementCol = appIE.Document.getElementsByTagName("INPUT")

For Each btnInput In ElementCol
    If btnInput.Value = "Submit" Then
        btnInput.Click
        Exit For
    End If
Next btnInput

' loop until the page finishes loading
Do While appIE.Busy
Loop

' click a button on the next page
Set ElementCol = appIE.Document.getElementsByTagName("INPUT")

For Each btnInput In ElementCol
    If btnInput.Value = "Link Page #1" Then
        btnInput.Click
        Exit For
    End If
Next btnInput

' loop until the page finishes loading
Do While appIE.Busy
Loop

' click a text link on the page after that
Set ElementCol = appIE.Document.getElementsByTagName("a")

For Each Link In ElementCol
    If Link.innerHTML = "<B>Clickable Text Link Name</B>" Then
        Link.Click
        Exit For
    End If
Next Link

' loop until the page finishes loading
Do While appIE.Busy
Loop

' grab some text from the body
strCountBody = appIE.Document.body.innerText
lStartPos = InStr(1, strCountBody, "Text to find")
lEndPos = lStartPos + 12
TextIWant = Mid$(strCountBody, lStartPos, lEndPos - lStartPos)

' grab the whole screen & paste into Excel
appIE.ExecWB OLECMDID_SELECTALL, OLECMDEXECOPT_DONTPROMPTUSER
appIE.ExecWB OLECMDID_COPY, OLECMDEXECOPT_DODEFAULT

Workbooks.Add
ActiveSheet.Paste

' destroy variables and end
Application.ScreenUpdating = True
Set UserN = Nothing
Set PW = Nothing
Set ElementCol = Nothing
Set appIE = Nothing
End Sub

    Let's examine these samples closely. The first one simply starts an early-bound instance of Internet Explorer, assigns a url (string) to a variable and then passes it to the Internet Explorer application variable. Then it makes the window visible, destroys the variable and exits.

    The second example shows in much more detail how to manipulate Internet Explorer.

Use Do While appIE.Busy: Loop to keep Excel waiting until the page loads completely.

Textboxes (username, password, etc) that you fill in are usually named elements on a webpage. The code uses:

appIE.Document.getElementsByName("username")

to find the named textbox and put your chosen text there. To find the name of the text box, click on View>Source in Internet Explorer when viewing the page. You will be using View>Source extensively to get the names of various elements on each page you want to access.

    To click buttons on a site, you can cycle through each Input Element of the Elements Collection until you find the button named "Submit":

appIE.Document.getElementsByTagName("INPUT")

    Again you would need to View>Source to see the tag name is "INPUT" (the type of element) and the name of the button is "Submit" The Click Method actually does the clicking of the button to load the next page or input whatever you placed in the text boxes.

    To click on a link on a page, you would loop through the tags that start with 'a' (links) until you find the one with the exact name you are looking for. You need to include everything between the <a> and </a> tags; so for example in the code above, the webmaster put 'bold' tags in the link (). That would need to be included because technically it is part of the text of the link (but bad web design if you ask me).

appIE.Document.getElementsByTagName("a")

    Now to grab the body text (the real reason you are here, I'm sure), assign the innerText property to a String variable:

appIE.Document.body.innerText

    In the sample above, I use the Instr property to look for some text, then the Mid function to extract it from the webpage. At that point you could simply paste it into a workbook (see Excel VBA Samples for the GetDistance() UDF) but I went on and just copied and pasted the entire displayed webpage into a new workbook.

Hopefully these samples will help you automate Internet Explorer in your own projects.


LAST UPDATED: February 5, 2008