Internetexplorer - GetObject!

Immer wieder taucht die Frage auf, ob man auf eine laufende Internetexplorerinstanz aufsetzen kann. Man(n) kann das so schreiben "Set objIEApp = GetObject("", "InternetExplorer.Application")" - das bringt keinen Fehler mehr, startet aber bei jedem Aufruf eine neue Instanz - ist also auch keine Lösung. GetObject schaut in der ROT (RunningObjectTable) nach ob sich ein Object dort registriert hat - der IE macht das wohl nicht. Folgender Code bietet eine Alternative:

Option Explicit
'--------------------------------------------------------------------------
' Module    : Modul1
' Procedure : Main
' Author    : Case (Ralf Stolzenburg)
' Date      : 12.09.2010
' Purpose   : Internetexplorer bestehende Instanz - oder neu starten...
'--------------------------------------------------------------------------
Public Sub Test()
    Dim objWindow As Object
    Dim objIEApp As Object
    Dim objShell As Object
    Dim objItem As Object
    On Error GoTo Fin
    Set objShell = CreateObject("Shell.Application")
    Set objWindow = objShell.Windows()
    For Each objItem In objWindow
        If LCase(objItem.FullName Like "*iexplore*") Then
            Set objIEApp = objItem
        End If
    Next objItem
    If objIEApp Is Nothing Then
        Set objIEApp = CreateObject("InternetExplorer.Application")
        objIEApp.Visible = True
    End If
    objIEApp.Navigate2 "http://vbanet.blogspot.com/"
Fin:
    If Err.Number <> 0 Then MsgBox "Fehler: " & _
    Err.Number & " " & Err.Description
    Set objWindow = Nothing
    Set objShell = Nothing
End Sub

Kleines Update (14.05.2017):
Option Explicit
'--------------------------------------------------------------------------
' Module    : Modul1
' Procedure : Main
' Author    : Case (Ralf Stolzenburg)
' Date      : 14.05.2017
' Purpose   : Internetexplorer bestehende Instanz - oder neu starten...
'--------------------------------------------------------------------------
Public Sub Main()
    Dim objWindow As Object
    Dim objIEApp As Object
    Dim objShell As Object
    Dim objItem As Object
    On Error GoTo Fin
    Set objShell = CreateObject("Shell.Application")
    Set objWindow = objShell.Windows()
    For Each objItem In objWindow
        If LCase(objItem.FullName Like "*iexplore*") Then
            Set objIEApp = objWindow
        End If
    Next objItem
    If objIEApp Is Nothing Then
        Set objIEApp = CreateObject("InternetExplorer.Application")
        With objIEApp
            .Visible = True
            .Navigate "http://delisonline.dpd.de/delisonline/index.jsp"
            Do: Loop Until .Busy = False
            Do: Loop Until .Busy = False
            Do: Loop Until .Document.ReadyState = "complete"
            .Document.All.Item("txtLogin").Value = "mein@email.de"
        End With
    Else
        With objIEApp.Item(1).Document.All
            .Item("txtLogin").Value = "mein@email.de"
        End With
    End If
Fin:
    If Err.Number <> 0 Then MsgBox "Fehler: " & _
        Err.Number & " " & Err.Description
    Set objWindow = Nothing
    Set objShell = Nothing
End Sub

Kleines Update (17.05.2017):

Das Grundgerüst kommt von hier: ;-)

ShellWindows object...

Mit der ersten Methode wird ein Objekt erstellt. Die zweite Methode beinhaltet die Explorerfenster des Shellobjektes. Die daraus resultierende Eigenschaft "Count" beinhaltet alle Adressen.

Daraus lese ich z. B. die "LocationURL". Der Code von Anton geht über "Document.Location". Zusätzlich prüft er noch, ob es der Internetexplorer ist, da sonst auch die Explorerfenster durchlaufen werden. Leicht mit F8 und dem Lokal-Fenster zu überprüfen.

Ohne "Exit For" wird das zuletzt geöffnete Tab - mit der entsprechenden Adresse - genommen.

Da in den "Items" die/alle URLs gelistet sind, muss das jeweilige Tab auch nicht aktiv sein.

Option Explicit
' Code von Anton am 16.05.2017 07:42:23 aus dem Herber Forum...
' http://www.herber.de/forum/archiv/1556to1560/t1558216.htm
Sub b()
    Dim objShell As Object
    Dim IEApp As Object, win As Object, IEDocument As Object
    Dim adresse As String
    adresse = "http://www.skylu.de/auswahl.php" 'anpassen
    Set objShell = CreateObject("Shell.Application")
    For Each win In objShell.Windows
        If InStr(1, UCase(win.FullName), "IEXPLORE") > 0 Then
            If win.Document.Location = adresse Then
                Set IEApp = win
                Exit For
            End If
        End If
    Next
    If IEApp Is Nothing Then
        Set IEApp = CreateObject("InternetExplorer.Application")
        IEApp.Visible = True
        IEApp.Navigate adresse
        Do: Loop Until IEApp.Busy = False
        Do: Loop Until IEApp.Busy = False
    End If
    Set IEDocument = IEApp.Document
    Do: Loop Until IEDocument.ReadyState = "complete"
    IEDocument.getElementById("anrede").Value = "Herr"
    IEDocument.getElementById("vorname").Value = "Sebastian"
    IEDocument.getElementById("name").Value = "lupo"
    Set IEDocument = Nothing
    Set IEApp = Nothing
    Set objShell = Nothing
End Sub

Bzw. alle Explorerfenster (Adressen) im Direktfenster im VBA - Editor ausgeben:

Option Explicit
Sub Main()
    Dim IEXPEX As SHDocVw.ShellWindows
    Dim objIE As Object
    On Error GoTo Fin
    Set IEXPEX = New SHDocVw.ShellWindows
    For Each objIE In IEXPEX
        Debug.Print "URL: " & objIE.LocationURL
    Next objIE
Fin:
    Set IEXPEX = Nothing
    Set objIE = Nothing
End Sub

Kommentare

  1. und wie sieht es aus ohne IE, wenn man den Firefox (FF) nutzt?

    AntwortenLöschen

Kommentar veröffentlichen

Beliebte Posts aus diesem Blog

Formeln - auch Array - per VBA eintragen...

Alle Dateien eines Ordners - Optional mit Unterordner

Excel -> Word in Textmarken (Bookmarks)...