title: Working with Internet Explorer Object
body: <p>My goal is to create a VB application that reads and writes information to various webpages loaded in Internet explorer.</p>
  
  <p>I have created a program that works exactly as I intend in VBA. I am now trying to re-implement the same programming in VB.</p>
  
  <p>I have a function that looks for and returns an Internet Explorer Object where the input matches the LocationName.</p>
  
  <p>Assuming the target page is loaded, I can work with it. Methods such as <code>getElementByID()</code> work perfectly. If the browser window is closed and reopened, and the code is run again, the results are very inconsistent. The <code>getIE</code> function seems to work, but when trying to use methods like <code>document.getElementByID()</code> a <code>NullReferenceException</code> is thrown.</p>
  
  <p>Does anyone know if there is anything I am missing that I need to include to get the document property to update?</p>
  
  <p>EDIT: I have looked over the NullReferenceException article. It hasn't helped me unfortunately. In case I was unclear in my wording, I would like to reiterate that the same bit of code yields a different result when executed the 2nd time under the same conditions (same webpage open in Internet Explorer).</p>
  
  <p>On the second execution IE.locationName is retrievable but IE.Document.title is not. The problem is definitely with the Document property as far as I can tell. I am truly stumped. </p>
  
  <p>Many thanks</p>
  
  <pre><code>Public Function getIE(targetTitle As String) As SHDocVw.InternetExplorer
  
      ' Create the shell application and Collection of open windows
      Dim shellObj As Object = CreateObject("Shell.Application")
      Dim shellWindows As SHDocVw.ShellWindows = shellObj.Windows()
      getIE = Nothing
  
      ' Scan through the Collection
      For I = (shellObj.Windows.Count - 1) To 0 Step -1
          ' If found, assign this to the function output and exit early
          If InStr(shellWindows(I).LocationName, targetTitle) Then
              getIE = shellWindows(I)
              Debug.Print("Found: " &amp; shellWindows(I).LocationName)
              Exit For
          End If
      Next I
  
  End Function
  
  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  
      Dim IE As SHDocVw.InternetExplorer
      IE = getIE("my site title")
  
      If IE Is Nothing Then
          Debug.Print("Site not open")
          Exit Sub
      End If
  
      ' The code always gets this far, and despite the page being found, starts throwing exceptions from here on if the window has been closed and reopened whilst my application has stayed running.
  
      ' Sample form data insertion code
      IE.Document.getElementById("textbox1").value = "my value"
      ' Click the submit button
      IE.Document.getElementById("submit").click()
  
      ' Wait for page to load
      While IE.Busy
      End While
  
      IE.Document.getElementById("textbox2").value = "my 2nd value"
  
      ' done
      IE = Nothing
  
  End sub
  </code></pre>