Microsoft Excel

Herbers Excel/VBA-Archiv

IE in neuem Tab und Felder füllen

Betrifft: IE in neuem Tab und Felder füllen von: Werner
Geschrieben am: 11.09.2014 07:38:00

Hallo zusammen!

Ich habe lange nach einer Lösung gesucht - leider aber nichts finden können.
Ich möchte, dass sich Hyperlinks in edinem neuen Tab öffnen und nicht in einer neuen IE-Instanz.
Dann möchte ich Daten aus Excel an bestimmte Felder in diesem neuen IE-Tab übergeben.

Hier mein Code, denn ich jetzt verwende:

Sub Atoss()
    Dim objShell As Object, IEDoc As Object
    Dim IEApp As Object, win As Object
    Dim IEDocument As Object
    Dim Adresse As String
    Dim Benutzer As String
    Dim Kennwort As String
    Dim link As Object

    Adresse = ActiveCell.Offset(0, 3)
    Benutzer = ActiveCell.Offset(0, 7)
    Kennwort = ActiveCell.Offset(0, 9)
    
    Set objShell = CreateObject("Shell.Application")
    For Each win In objShell.Windows
    Next
    Set IEApp = CreateObject("InternetExplorer.Application")
    IEApp.Visible = True
    IEApp.navigate Adresse

    Do: Loop Until IEApp.Busy = False
    Set IEDoc = IEApp.document
    Do: Loop Until IEDoc.readyState = "complete"
    Application.Wait TimeSerial(Hour(Now()), _
         Minute(Now()), Second(Now()) + 2)
         
    Set IEDocument = IEApp.document
    IEDocument.getElementById("logonid").Value = Benutzer
    IEDocument.getElementById("password").Value = Kennwort
    Dim WshShell As Object
    
    Set WshShell = CreateObject("WScript.Shell")
    Application.Wait TimeSerial(Hour(Now()), _
         Minute(Now()), Second(Now()) + 1)
    WshShell.SendKeys "{TAB}"
        WshShell.SendKeys "{ENTER}"

    Do: Loop Until IEDoc.readyState = "complete"
    Application.Wait TimeSerial(Hour(Now()), _
         Minute(Now()), Second(Now()) + 1)
    IEDocument.getElementById("zemsdabsemp-cnt").Click
    Set IEApp = Nothing
    Set objShell = Nothing
    
End Sub
Der Code öffnet aber den Internetexplorer neu und nicht die Seite in einem neuen Tab.

Ich habe dann versucht, es so zu lösen:
Sub Atoss_neu()

    Dim objShell As Object, IEDoc As Object
    Dim IEApp As Object, win As Object
    Dim IEDocument As Object
    Dim Adresse As String
    Dim Benutzer As String
    Dim Kennwort As String
    Dim link As Object

    Adresse = ActiveCell.Offset(0, 3)
    Benutzer = ActiveCell.Offset(0, 7)
    Kennwort = ActiveCell.Offset(0, 9)

    Set objShell = CreateObject("Shell.Application")
    For Each win In objShell.Windows
      If InStr(1, UCase(win.FullName), "IEXPLORE") > 0 Then
        Set IEApp = win
        IEApp.Navigate2 Adresse, 2048
        Exit For
      End If
    Next
    If IEApp Is Nothing Then
      Set IEApp = CreateObject("InternetExplorer.Application")
      IEApp.Visible = True
      IEApp.navigate Adresse
    End If

    Application.Wait TimeSerial(Hour(Now()), _
         Minute(Now()), Second(Now()) + 2)
         
    Set IEDocument = IEApp.document
    IEDocument.getElementById("logonid").Value = Benutzer
    IEDocument.getElementById("password").Value = Kennwort
    Dim WshShell As Object
    
    Set WshShell = CreateObject("WScript.Shell")
    Application.Wait TimeSerial(Hour(Now()), _
         Minute(Now()), Second(Now()) + 1)
    WshShell.SendKeys "{TAB}"
        WshShell.SendKeys "{ENTER}"

    Do: Loop Until IEDoc.readyState = "complete"
    Application.Wait TimeSerial(Hour(Now()), _
         Minute(Now()), Second(Now()) + 1)
    IEDocument.getElementById("zemsdabsemp-cnt").Click
    Set IEApp = Nothing
    Set objShell = Nothin

End Sub
Damit öffnet er zwar die Url in einem neuen Tab, jedoch kommt in der Zeile
IEDocument.getElementById("logonid").Value = Benutzer
die Meldung "Laufzeitfehler 91 - Objektvariable oder With-Blockvariable nicht festgelegt".

Kann mir evtl. jemand helfen?

Gruß und Danke!
Werner

  

Betrifft: AW: IE in neuem Tab und Felder füllen von: Martin
Geschrieben am: 11.09.2014 11:50:16

Hallo Werner,

dein Code kann nicht gehen, da du der Objekt-Variable IEApp den neuen Tab zuweisen musst. Folgenden Abschnitt musst du ersetzen:


ALT:

    Set objShell = CreateObject("Shell.Application")
    For Each win In objShell.Windows
      If InStr(1, UCase(win.FullName), "IEXPLORE") > 0 Then
        Set IEApp = win
        IEApp.Navigate2 Adresse, 2048
        Exit For
      End If
    Next
NEU:
    Set objShell = CreateObject("Shell.Application")
    For Each win In objShell.Windows
      If InStr(1, UCase(win.FullName), "IEXPLORE") > 0 Then
        Set IEApp = win
            IEApp.Navigate2 Adresse, 2048
            Application.Wait Now + TimeSerial(0, 0, 1)
            With objShell.Windows
                Set IEApp = .Item(.Count - 1)
            End With
            Do While IEApp.Busy = 4
                DoEvents
            Loop
        Exit For
      End If
    Next
Viele Grüße

Martin


  

Betrifft: AW: IE in neuem Tab und Felder füllen von: Werner
Geschrieben am: 11.09.2014 12:43:58

Hallo Martin!

Danke für die Hilfe!
Das klappt soweit.
Wie so oft kommt ein "aber":
Bei dieser Zeile kommt auch wieder der Laufzeitfehler 91:
IEDocument.getElementById("zemsdabsemp-cnt").Click

Kannst du mir noch mal helfen?

Gruß
Werner


  

Betrifft: AW: IE in neuem Tab und Felder füllen von: Martin
Geschrieben am: 11.09.2014 17:42:24

Hallo Werner,

da du in deinem Code die Website nicht angegeben hast, kann ich es leider nicht testen. Ich habe den Code mit einer anderen Website getestet (wo die HTML-Felder auch andere Namen haben) und da klappt die Click-Anweisung problemlos. Daher ist meine erste Vermutung, dass du den Namen des Submit-Buttons falsch angegeben hast.

Alternativ kann ich dir jetzt nur anbieten das Formular direkt abzuschicken:

ALT:

IEDocument.getElementById("Submit").Click

NEU:
IEDocument.forms(0).submit
Das klappt aber nur, wenn die Bezeichnung "submit" in keinem Namen der HTML-Form auftritt! Wenn auch das nicht hilft, musst du mir zum Testen wenigstens die Website mitteilen.

Viele Grüße

Martin


  

Betrifft: AW: IE in neuem Tab und Felder füllen von: Martin
Geschrieben am: 11.09.2014 19:09:02

Hallo Werner,

kleine Korrektur, selbstverständlich ist folgende Zeile zu ersetzen:

ALT:

IEDocument.getElementById("zemsdabsemp-cnt").Click

NEU:
IEDocument.forms(0).submit

Kontrolliere aber trotzdem mal, ob der Submit-Button tatsächlich die ID-Bezeichnung "zemsdabsemp-cnt" hat, denn vielleicht ist das der Name des Buttons. Einen Namen kannst du mit getElementsByName ansprechen. Dann sollte die Anweisung wie folgt lauten:
IEDocument.getElementsByName("zemsdabsemp-cnt")(0).Click
Viele Grüße

Martin


  

Betrifft: AW: IE in neuem Tab und Felder füllen von: Martin
Geschrieben am: 12.09.2014 00:19:51

Hallo Werner,

mir ist noch ein recht sicherer Lösungsweg zum Absenden des Formulars eingefallen: In einer For Each-Schleife wird der Submit-Button einfach ermittelt. Bei der Gelegenheit habe ich noch einige kleine Optimierungen des Makros vorgenommen, deshalb hier der gesamte Code:

Sub Atoss_neu()
   
    Dim objShell As Object
    Dim IEApp As Object, win As Object
    Dim IEDocument As Object
    Dim Adresse As String
    Dim Benutzer As String
    Dim Kennwort As String
    Dim iCount As Integer
    Dim objCtrl As Object

    Adresse = ActiveCell.Offset(0, 3)
    Benutzer = ActiveCell.Offset(0, 7)
    Kennwort = ActiveCell.Offset(0, 9)
   
    Set objShell = CreateObject("Shell.Application")
    For Each win In objShell.Windows
        If InStr(1, UCase(win.FullName), "IEXPLORE") > 0 Then
            Set IEApp = win
            
            With objShell.Windows
                iCount = .Count
                IEApp.Navigate2 Adresse, 2048
                Do Until .Count > iCount
                    DoEvents
                Loop
                Set IEApp = .Item(.Count - 1)
            End With
    
            Exit For
        End If
    Next
       
    'Falls kein IE-Explorer gefunden
    If IEApp Is Nothing Then
        Set IEApp = CreateObject("InternetExplorer.Application")
        IEApp.Visible = True
        IEApp.navigate Adresse
    End If
   
    'Warten bis Seite geladen
    Do While IEApp.Busy Or IEApp.readyState <> 4
        DoEvents
    Loop
             
    'Felder ausfüllen
    Set IEDocument = IEApp.document
    IEApp.document.getElementById("logonid").Value = Benutzer
    IEApp.document.getElementById("password").Value = Kennwort
       
    Dim WshShell As Object
    
    Set WshShell = CreateObject("WScript.Shell")
    Application.Wait DateAdd("s", 1, Now)
    WshShell.SendKeys "{TAB}"
    WshShell.SendKeys "{ENTER}"

    Do: Loop Until IEApp.readyState = "complete"
    Application.Wait DateAdd("s", 1, Now)
    
    'Formular abschicken
    For Each objCtrl In IEApp.document.forms(0).Elements
        If objCtrl.Type = "submit" Then
            objCtrl.Click
            Exit For
        End If
    Next
    
    Set IEApp = Nothing
    Set objShell = Nothing
   
End Sub
Der Abschnitt mit dem WshShell-Objekt erscheint mir eher suboptimal. Ich bin allgemein kein Freund von der SendKeys-Methode. Da ich aber nicht weiß was du damit genau bezweckst, kann ich den Code an dieser Stelle nicht optimieren. Jetzt sollte - hoffentlich - alles klappen.

Viele Grüße

Martin


  

Betrifft: AW: IE in neuem Tab und Felder füllen von: Werner
Geschrieben am: 12.09.2014 07:58:55

Guten Morgen Martin

Erstmal Danke für deine Hilfe!
Die Internetseite ist unsere Gleitzeit-Buchung.
Einen Link kann ich dir also nicht schicken.
Aber bei dieser Seite kannst du es ja mal prüfen?

www.meine-fahrgemeinschaft.de

Bei der anderen Anmeldung (Atoss-Makro) habe ich mal den html-Code kopiert.
Hilft das?
Der Anmelde-Knopf wird nämlich mit deinem Code leider nicht "gedrückt".

td class="z-button-cm"
Text - Anmelden

Mehr steht da leider nicht.

Gruß und Danke!
Werner


  

Betrifft: AW: IE in neuem Tab und Felder füllen von: Martin
Geschrieben am: 12.09.2014 08:27:10

Hallo Werner,

leider habe ich heute kaum Zeit. Jetzt auf die Schnelle ein Versuch:

IEApp.document.getelementsbyclassname("z-button-cm")(0).Click
Viele Grüße

Martin


  

Betrifft: ...habe vergessen zu schreiben, dass... von: Martin
Geschrieben am: 12.09.2014 08:31:57

Hallo Werner,

getelementsbyclassname wird erst ab dem Internet Explorer 9 unterstützt!

Viele Grüße

Martin


  

Betrifft: AW: ...habe vergessen zu schreiben, dass... von: Werner
Geschrieben am: 12.09.2014 08:33:18

IE9 habe ich.
Ich werde es testen.
Kann mich aber erst nächste Woche wieder melden.

Danke und schönes Wochenende!
Werner


  

Betrifft: AW: IE in neuem Tab und Felder füllen von: Werner
Geschrieben am: 12.09.2014 08:02:53

Vielleicht ist das hier auch hilfreich...
Auch dieser Link wird in einem neuen Fenster geöffnet anstatt in einem neuen Tab.
Sonst klappt das Teil ganz gut.
Sendkeys würede ich gerne weglassen. Aber dafür reicht mein Wissen nicht aus.

Sub GMX()
    Dim objShell As Object, IEDoc As Object
    Dim IEApp As Object, win As Object
    Dim IEDocument As Object
    Dim Adresse As String
    Dim Benutzer As String
    Dim Kennwort As String
    Dim link As Object

    Adresse = ActiveCell.Offset(0, 3)
    Benutzer = ActiveCell.Offset(0, 7)
    Kennwort = ActiveCell.Offset(0, 9)
 
    Set objShell = CreateObject("Shell.Application")
    For Each win In objShell.Windows
    Next
    Set IEApp = CreateObject("InternetExplorer.Application")
    IEApp.Visible = True
    IEApp.navigate Adresse
    Do: Loop Until IEApp.Busy = False
    Set IEDoc = IEApp.document
    Do: Loop Until IEDoc.readyState = "complete"
    
    Set IEDocument = IEApp.document
    IEDocument.getElementById("inpLoginFreemailUsername").Value = Benutzer
    IEDocument.getElementById("inpLoginFreemailPassword").Value = Kennwort
    Application.Wait TimeSerial(Hour(Now()), _
         Minute(Now()), Second(Now()) + 1)
    
    IEDocument.getElementById("inpLoginFreemailPassword").Focus
    IEDocument.getElementById("inpLoginFreemailPassword").Select
    
    Dim WshShell As Object
    
    Set WshShell = CreateObject("WScript.Shell")
    Application.Wait TimeSerial(Hour(Now()), _
         Minute(Now()), Second(Now()) + 1)

    WshShell.SendKeys "{enter}"
    
    Do: Loop Until IEDoc.readyState = "complete"

    Set IEApp = Nothing
    Set objShell = Nothing
 
End Sub
Gruß
Werner


 

Beiträge aus den Excel-Beispielen zum Thema "IE in neuem Tab und Felder füllen"