Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1612to1616
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Mit Schleife Internetseite öffnen und kopieren
15.03.2018 14:59:09
Patrick
Hallo liebes Forum
Unsere Firma bietet sogenanntes Valet- Parking an. Das heisst, der Kunde kann, nach der Reservation, sein Fahrzeug am Flughafen abgeben und bei der Rückkehr wieder dort abholen. Er kann verschiedene verschiedene Dienstleistungen buchen: Parkplatz im Freien, im Parkhaus und zudem kann er das Fahrzeug auch noch waschen lassen. Je nachdem wird das Fahrzeug von unseren Fahrern an einen anderen Standort gefahren.
Damit wir nun unsere Parkplatzbelegung besser planen und auch das Personal welches die Fahrzeuge wäscht, optimal einteilen können, möchten wir nun die Daten aus der Internetseite ins Excel kopieren.
Dies für einen Tag zu machen habe ich mit folgendem VBA- Code bereits geschafft:
Sub PrintAnsichtÖffnen()
'Tip: HTML-Codes mit FireFox auslesen
'("Links Klick" und Element untersuchen)
'Seite wird markiert, kopiert und auf Arbeitsblatt eingefügt
'InternetExplorer wird geschlossen
Dim IEApp As Object
Dim IEDoc As Object
Dim objCtrl As Object
  'InternetExplorer -> Internetseite öffnen
Set IEApp = CreateObject("InternetExplorer.Application")
  'Bildschirmaktualisierung ausschalten
'Application.ScreenUpdating = False
'InternetExplorer sichtbar = True, nicht sichtbar = False
IEApp.Visible = False
IEApp.Navigate "https://www.aaa.bb/admin/login.php"
  'Warten bis Seite geladen ist
Do: Loop Until IEApp.Busy = False
Do: Loop Until IEApp.Busy = False
With IEApp.document
Do: Loop Until .ReadyState = "complete"
Set IEDoc = IEApp.document
      'Benutzername und Passwort eintragen (HTML-Code auslesen für ID)
.getelementbyid("user").Value = "XXX" 'anpassen
.getelementbyid("passwort").Value = "YYY" 'anpassen
      'OK-Knopf hat keine ID (HTML-Code auslesen, "Type" und "Value" ermitteln)
For Each objCtrl In IEApp.document.forms(0).elements
If objCtrl.Type = "submit" Then
If objCtrl.Value = "Login" Then
objCtrl.Click
Exit For
End If
End If
Next
End With
'  Warten bis Seite geladen ist
Do: Loop Until IEApp.Busy = False
Do: Loop Until IEApp.Busy = False
With IEApp.document
Do: Loop Until .ReadyState = "complete"
      'Datum eintragen (HTML-Code auslesen für ID, Format ermitteln)
'(In diesem Fall muss es Text sein)
.getelementbyid("datesearch").Value = Tabelle1.Name 'anpassen
      'Search-Knopf hat keine ID (HTML-Code auslesen, "Type" und "Value" ermitteln)
For Each objCtrl In IEApp.document.forms(0).elements
If objCtrl.Type = "submit" Then
If objCtrl.Value = "Suche" Then
objCtrl.Click
Exit For
End If
End If
Next
End With
  'Warten bis Seite geladen ist
Do: Loop Until IEApp.Busy = False
Do: Loop Until IEApp.Busy = False
With IEApp.document
Do: Loop Until .ReadyState = "complete"
    'Zu Internetseite für Print-Ansicht navigieren (HTML-Code auslesen)
IEApp.Navigate "https://www.aaa.bb/admin/print.php"
      'Warten bis Seite geladen ist
Do: Loop Until IEApp.Busy = False
Do: Loop Until IEApp.Busy = False
With IEApp.document
Do: Loop Until .ReadyState = "complete"
        'Seite markieren...
IEApp.ExecWB 17, 2, 0, 0
        '...kopieren...
IEApp.ExecWB 12, 2, 0, 0
          'Einfügebereich auswählen
Application.Goto reference:=Tabelle1.Cells(1, 1), Scroll:=False
          '...einfügen
Tabelle1.Paste
          'Zwischenablage leeren, Kopierbereich entfernen
Application.CutCopyMode = False
End With
End With
IEApp.Quit
Set IEDoc = Nothing
Set IEApp = Nothing
Set objCtrl = Nothing
'  Application.ScreenUpdating = True
End Sub

Mein Ziel wäre nun, mittels einer Schleife, dies für mehrere Tage zu machen.
Die Codenamen der Arbeitsblätter sind Tabelle1, Tabelle2, u.s.w. bis Tabelle11. Die Register werden dynamisch mit dem jeweiligen Datum (heutiges Datum - 4 bis heutiges Datum + 6) beschriftet. Dies um am Montag zu Überprüfen, ob übers Wochenende alle Kunden tatsächlich gekommen sind oder ob es noch spontan Buchungen gegeben hat u.s.w. um dies in Zukunft eventuell auch noch berücksichtigen zu können.
Ich habe wieder mal eine Menge gegoogelt und ausprobiert, aber es gelingt mir nicht.
Ich habe den obenstehenden Code erweitert, bekomme jedoch immer die Fehlermeldung "Next ohne For" und ich kriege nicht heraus warum (zur besseren Übersicht, habe ich die Änderungen fett formatiert):

Sub MehrereDatenAusWeb()
'Tip: HTML-Codes mit FireFox auslesen '("Links Klick" und Element untersuchen) 'Seite wird markiert, kopiert und auf Arbeitsblatt eingefügt 'InternetExplorer wird geschlossen Dim IEApp As Object Dim IEDoc As Object Dim objCtrl As Object Dim lngZiel As Long Dim strZiel As String Dim wksZiel As Worksheet 'InternetExplorer -> Internetseite öffnen Set IEApp = CreateObject("InternetExplorer.Application") 'Bildschirmaktualisierung ausschalten 'Application.ScreenUpdating = False 'InternetExplorer sichtbar = True, nicht sichtbar = False IEApp.Visible = False IEApp.Navigate "https://www.aaa.bb/admin/login.php" 'Warten bis Seite geladen ist Do: Loop Until IEApp.Busy = False Do: Loop Until IEApp.Busy = False With IEApp.document Do: Loop Until .ReadyState = "complete" Set IEDoc = IEApp.document 'Benutzername und Passwort eintragen (HTML-Code auslesen für ID) .getelementbyid("user").Value = "XXX" 'anpassen .getelementbyid("passwort").Value = "YYY" 'anpassen 'OK-Knopf hat keine ID (HTML-Code auslesen, "Type" und "Value" ermitteln) For Each objCtrl In IEApp.document.forms(0).elements If objCtrl.Type = "submit" Then If objCtrl.Value = "Login" Then objCtrl.Click Exit For End If End If Next End With ' Warten bis Seite geladen ist Do: Loop Until IEApp.Busy = False Do: Loop Until IEApp.Busy = False For lngZiel = 1 To 11 strZiel = ("Tabelle" & lngZiel) wksZiel = strZiel With IEApp.document Do: Loop Until .ReadyState = "complete" 'Datum eintragen (HTML-Code auslesen für ID, Format ermitteln) '(In diesem Fall muss es Text sein) .getelementbyid("datesearch").Value = wksZiel.Name 'anpassen 'Search-Knopf hat keine ID (HTML-Code auslesen, "Type" und "Value" ermitteln) For Each objCtrl In IEApp.document.forms(0).elements If objCtrl.Type = "submit" Then If objCtrl.Value = "Suche" Then objCtrl.Click Exit For End If End If Next End With 'Warten bis Seite geladen ist Do: Loop Until IEApp.Busy = False Do: Loop Until IEApp.Busy = False With IEApp.document Do: Loop Until .ReadyState = "complete" 'Zu Internetseite für Print-Ansicht navigieren (HTML-Code auslesen) IEApp.Navigate "https://www.aaa.bb/admin/print.php" 'Warten bis Seite geladen ist Do: Loop Until IEApp.Busy = False Do: Loop Until IEApp.Busy = False With IEApp.document Do: Loop Until .ReadyState = "complete" 'Seite markieren... IEApp.ExecWB 17, 2, 0, 0 '...kopieren... IEApp.ExecWB 12, 2, 0, 0 'Einfügebereich auswählen Application.Goto reference:=wksZiel.Cells(1, 1), Scroll:=False '...einfügen wksZiel.Paste 'Zwischenablage leeren, Kopierbereich entfernen Application.CutCopyMode = False End With lngZiel = lngZiel + 1 Next lngZiel End With IEApp.Quit Set IEDoc = Nothing Set IEApp = Nothing Set objCtrl = Nothing ' Application.ScreenUpdating = True End Sub
Ich bin mir sicher, dass hier ein Profi im Forum ist, der sieht, wo der Fehler liegt.
Freundliche Grüsse aus der Schweiz
Patrick Zaugg

16
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Mit Schleife Internetseite öffnen und kopieren
15.03.2018 15:31:36
Zwenn
Hallo Patrick,
Du darfst den Schleifenzähler einer For-Schleife nicht zusätzlich von Hand hochzählen. Lösch mal diese Zeile komplett:

lngZiel = lngZiel + 1

Das ist der Fehler, der mir direkt ins Auge springt. Vielleicht ist noch mehr zu finden. Aber probiere das erstmal aus bitte.
Viele Grüße,
Zwenn
AW: Mit Schleife Internetseite öffnen und kopieren
16.03.2018 06:52:21
Patrick
Guten Morgen Zwenn
Vielen Dank schon mal.
Ich habe die Zeile gelöscht. Der Fehler bleibt aber: "Fehler beim Kompilieren: Next ohne For"
Freundliche Grüsse
Patrick
AW: Mit Schleife Internetseite öffnen und kopieren
16.03.2018 07:28:01
Patrick
Ich habe einen Fehler gefunden:
Application.CutCopyMode = False
End With
End With

Next lngZiel
IEApp.Quit
Das fette End With war unter Next lngZiel.
Nun kommt jedoch der Fehler: "Laufzeitfehler'91': Objektvariable oder With-Blockvariable nicht festgelegt"
Markiert ist folgende Zeile:
wksZiel = strZiel
Wenn ich mit dem Mauszeiger über wksZiel fahre erscheint die Info: wksZiel = Nothing.
Über strZiel kommt die Info: strZiel = "Tabelle1".
Ich vermute mal, dass die Gänsefüsschen "" weg müssten. Ich weiss nur noch nicht wie...
Grüsse
Patrick
Anzeige
AW: Mit Schleife Internetseite öffnen und kopieren
16.03.2018 08:41:12
Oberschlumpf
Hi
Versuch mal:
wksZiel = SHEETS(strZiel)
Hilfts?
Ciao
Thorsten
AW: Mit Schleife Internetseite öffnen und kopieren
16.03.2018 10:56:23
Patrick
Hallo Thorsten
Nein, leider nicht. Die Fehlermeldung lautet jetzt: "Laufzeitfehler '9': Index ausserhalb des gültigen Bereichs". Mit
wksZiel = Worksheets(strZiel)
genauso.
Userbild
AW: Mit Schleife Internetseite öffnen und kopieren
16.03.2018 11:24:52
Oberschlumpf
Hi Patrick
Der Fehler 9 zeigt, dass es keinen Tabellennamen gibt, der in strZiel gespeichert ist.
Was ist denn während der Laufzeit in strZiel gespeichert?
Und überprüf dann mal, ob es so ein Tabellenblatt mit dem Namen gibt.
wksZiel = Worksheets(strZiel) funktioniert nur, wenn strZiel = ein vorhandenes Tabellenblatt ist.
Ciao
Thorsten
Anzeige
AW: Mit Schleife Internetseite öffnen und kopieren
16.03.2018 12:02:49
Patrick
Hallo Thorsten
strZiel zeigt bei Mauskontakt "Tabelle1". Die Codenamen meiner Arbeitsblätter sind Tabelle1 bis Tabelle11 (siehe vorhin geposteten PrintScreen).
Wahrscheinlich liegt die Lösung direkt vor meinen Augen, aber ich sehe vor lauter Bäumen den Wald nicht mehr...
Viele Grüsse
Patrick
AW: Mit Schleife Internetseite öffnen und kopieren
16.03.2018 12:12:59
Oberschlumpf
Hi Patrick
Entscheidend ist der Blattname, der auch in der Registerleiste unterhalb jeder Tabelle.
Versuch mal, nur für n Test, diesen Code:
wksZiel = Worksheets("12.03.2018")

Jetzt sollte es problemlos funktionieren.
Natürlich müsstest du dann den Code entsprechend umbauen, damit es auch im laufenden Betrieb funktioniert.
Also:
Verwende nicht "Tabelle1", "Tabelle2", usw als Blattnamen im Code, sondern die Angaben, die in deinem Screenshot in Klammern gezeigt werden.
Wenn das auch nich hilft, zeig uns per Upload eine Bsp-Datei mit Bsp-Daten. Und natürlich auch inkl. des relevabten VBA-Codes um den es geht.
Ciao
Thorsten
Anzeige
AW: Mit Schleife Internetseite öffnen und kopieren
16.03.2018 12:59:54
Patrick
Hi Thorsten
Eine Datei kann ich leider schlecht hochladen, da von unseren Kunden die gesamte Adresse sowie Kontrollschild und Telefonnummer ersichtlich sind.
Aber nun haben wir den Wald gefunden :-)
Ich habe nun zuerst die Tabellenblätter alle umbenannt:
Sub TabNamenWieCodenamen()
Tabelle1.Name = "Tabelle1"
Tabelle2.Name = "Tabelle2"
Tabelle3.Name = "Tabelle3"
Tabelle4.Name = "Tabelle4"
Tabelle5.Name = "Tabelle5"
Tabelle6.Name = "Tabelle6"
Tabelle7.Name = "Tabelle7"
Tabelle8.Name = "Tabelle8"
Tabelle9.Name = "Tabelle9"
Tabelle10.Name = "Tabelle10"
Tabelle11.Name = "Tabelle11"
End Sub

Nun habe ich den Fehler: "Laufzeitfehler '91': Objektvariable oder With-Blockvariable nicht festgelegt" erhalten.
Markiert ist immer noch die Zeile:
wksZiel = Worksheets(strZiel)
Aber Set wksZiel = Worksheets(strZiel) hat nun geholfen.
Jetzt muss ich nur noch schauen, wie ich in folgende Zeile das Datum hereinkriege.. Aber das kriege ich noch hin:
.getelementbyid("datesearch").Value = wksZiel.Name 'anpassen
Vielen tausend Dank
Freundliche sonnige Grüsse
Patrick
Anzeige
da bin ich leider raus...
16.03.2018 13:16:03
Oberschlumpf
Hi Patrick,
Du sollst ja auch nicht die Originaldatei zeigen.
Ich schrieb: Zeig eine BSP-Datei
In der musst du natürlich die Realdaten gegen Bsp-Daten austauschen.
Ich kann leider nicht weiter helfen.
Ciao
Thorsten
AW: da bin ich leider raus...
16.03.2018 15:23:28
Patrick
Hallo Thorsten
Ich habe Dich schon verstanden.
Aber es ist so: Das erste mal läuft die Schleife, kopiert mir die Internetseite tadellos ins richtige Excelblatt. Allerdings müsste zum Schluss der InternetExplorer wieder zurück (Alt+links im manuellen Gebrauch) zur Ausgangsseite, da das Makro auf dieser Seite nichts findet, wo er das Datum eintragen könnte. Die bessere Lösung wäre, wenn er die Print-Ansicht
IEApp.Navigate "https://www.aaa.bb/admin/print.php"
in einem neuen Fenster öffnen würde und am Ende wieder schliessen, bevor die Schleife zum zweiten mal gestartet wird.
Ich wüsste aber nicht, wie ich die Internetseite als Beispiel zur Verfügung stellen könnte :-)
Das Datum das hier
.getelementbyid("datesearch").Value = wksZiel.Name neu: = wksZiel.Range("U1")

eingetragen werden muss schreibe ich beim umbennen der Blätter in eine Zelle und dies findet er einwandfrei.
Ich werde noch etwas forschen und das noch hinkriegen. Habe ja gleich das ganze Wochenende Zeit :-)
Ich wünsche Dir jedenfalls ein solches und nochmals vielen Dank.
Freundliche Grüsse
Patrick
Anzeige
AW: Mit Schleife Internetseite öffnen und kopieren
16.03.2018 18:43:46
Zwenn
Hallo Patrick,
nachdem Thorsten schon viel Geduld bewiesen hat, habe ich mir jetzt mal Dein Ausgangsmakro vorgenommen und habe es entschlackt. Dabei ist mir aufgefallen (mit Verlaub), wirklich viel Ahnung, was Du da eigentlich machst hast Du nicht oder?
Ich mache es mal wie Du und gestalte die Zeile fett, von der ich annehme, dass das Makro wegen der 'Formulierung' gar keinen Durchlauf schafft, ausser Du hast die inzwischen angepasst:

Sub MehrereDatenAusWeb()
'Seite wird markiert, kopiert und auf Arbeitsblatt eingefügt
Dim browser As Object
Dim objCtrl As Object
Dim lngZiel As Byte
Dim strZiel As String
Dim wksZiel As Worksheet
Dim url As String
url = "https://www.aaa.bb/admin/login.php"
'InternetExplorer Instanz erzeugen, mit der gearbeitet wird
Set browser = CreateObject("InternetExplorer.Application")
'InternetExplorer sichtbar = True, nicht sichtbar = False
browser.Visible = False
'Seite öffnen
browser.Navigate url
'Warten bis Seite geladen ist
Do Until browser.ReadyState = 4: DoEvents: Loop
'Benutzername und Passwort eintragen (HTML-Code auslesen für ID)
browser.document.getElementByID("user").Value = "XXX" 'anpassen
browser.document.getElementByID("passwort").Value = "YYY" 'anpassen
'OK-Knopf hat keine ID (HTML-Code auslesen, "Type" und "Value" ermitteln)
For Each objCtrl In browser.document.forms(0).elements
If objCtrl.Type = "submit" Then
If objCtrl.Value = "Login" Then
objCtrl.Click
Exit For
End If
End If
Next
'Warten bis Seite nach automatischem LogIn geladen ist
Do Until browser.ReadyState = 4: DoEvents: Loop
For lngZiel = 1 To 11
strZiel = ("Tabelle" & lngZiel)
'Datum eintragen (HTML-Code auslesen für ID, Format ermitteln)
'(In diesem Fall muss es Text sein)
browser.document.getElementByID("datesearch").Value = Sheets(strZiel).Name
'Search-Knopf hat keine ID (HTML-Code auslesen, "Type" und "Value" ermitteln)
For Each objCtrl In browser.document.forms(0).elements
If objCtrl.Type = "submit" Then
If objCtrl.Value = "Suche" Then
objCtrl.Click
Exit For
End If
End If
Next
'Warten bis Seite geladen ist
Do Until browser.ReadyState = 4: DoEvents: Loop
'Zu Internetseite für Print-Ansicht navigieren (HTML-Code auslesen)
browser.Navigate "https://www.aaa.bb/admin/print.php"
'Warten bis Seite geladen ist
Do: Loop Until browser.Busy = False
'Seite markieren...
browser.ExecWB 17, 2, 0, 0
'Seite kopieren
browser.ExecWB 12, 2, 0, 0
'Einfügebereich auswählen
Sheets(strZiel).Activate
Sheets(strZiel).Cells(1, 1).Select
'Daten einfügen
Sheets(strZiel).Paste
'Zwischenablage leeren, Kopierbereich entfernen
Application.CutCopyMode = False
Next lngZiel
'Aufräumen
browser.Quit
Set browser = Nothing
Set objCtrl = Nothing
End Sub

Nach meinem Verständnis wird der Seite im Internet Explorer damit kein Datum übergeben, sondern eine Zeichenkette zwischen Tabelle1 und Tabelle11. "datesearch" klingt aber eher so, als wird ein Datum (im richtigen Format) erwartet.

browser.document.getElementByID("datesearch").Value = Sheets(strZiel).Name

Das klappt natürlich nicht, wenn es so ist. Ist es so? Denn Du hast ja in einem Deiner letzten Postings eine weitere Sub gepostet, die alle 11 Tabellennamen eben auf Tabelle1 bis Tabelle11 setzt. Ansonsten poste mal bitte den Code des Makros, mit allen Subs und Funktionen, wie Du ihn aktuell vorliegen hast.
In Deinem Code hattest Du ansonsten eine With Anweisung mehr, als eine End With Anweisung. Das auch noch um einen Code-Bereich, in dem dieses Brimborium gar nicht verwendet wurde. (Was mich zu dem Schluss brachte, dass Du nicht wirklich weißt, was Du da machst, sorry.)
Viele Grüße,
Zwenn
PS: Warum hast Du so oft auf das Beenden zum Laden einer Seite gewartet? Ok, wird einfach sofort übersprungen, aber man braucht das pro Seitenaufruf nur einmal (war früher wohl mal anders). Außer es werden weitere Inline-Inhalte nachgeladen. Dann muss man aber mit Application.Wait... arbeiten.
Anzeige
AW: Mit Schleife Internetseite öffnen und kopieren
17.03.2018 12:20:14
Patrick
Hallo Zwenn
Ich bin Thorsten auch sehr dankbar dafür, wie ich es Dir auch bin. Ich bin froh um jede Hilfe.
Du hast vollkommen recht, viel Ahnung von dem ich hier mit VBA mache, habe ich nicht. Ich bin aber trotzdem zufrieden, was ich bisher erreicht habe. Das erste mal mit VBA beschäftigt habe ich mich am 10.1.2018. Der Code PrintAnsichtÖffnen habe ich mir zusammengegoogelt und auf unsere Internetseite angepasst. Diesen Code will ich nun einfach um die Schleife erweitern. Ich könnte auch den Code 11mal ins Modul kopieren und manuell 11mal das Ziel ändern. Da ich aber ein bisschen etwas lernen möchte...
Ich möchte für die spätere Auswertung der Daten die Arbeitsblätter mit dem Datum benennen und habe desshalb die Codenamen nicht umbenannt, damit ich mit den Codenamen Schleifen erstellen kann. Ich war mir sicher, dass ich die Codenamen anspreche.
Also ändere ich nun mit folgendem Code zuerst die Namen der Blätter:
Option Explicit
Sub TabellenblätterUmbenennen()
Tabelle1.Name = "Tabelle1"
Tabelle2.Name = "Tabelle2"
Tabelle3.Name = "Tabelle3"
Tabelle4.Name = "Tabelle4"
Tabelle5.Name = "Tabelle5"
Tabelle6.Name = "Tabelle6"
Tabelle7.Name = "Tabelle7"
Tabelle8.Name = "Tabelle8"
Tabelle9.Name = "Tabelle9"
Tabelle10.Name = "Tabelle10"
Tabelle11.Name = "Tabelle11"
End Sub

Kann man sicher noch eleganter gestallten, aber erst muss es mal funktionieren (was es auch tut)
Nun lösche ich alle Inhalte der Tabellenblätter, da diese ja nicht immer gleichviele Daten enthalten. Zudem wird das ein fortlaufendes Datum jeweils in Zelle U1 geschrieben, welches ich später brauche um das Datum ins Feld "datesearch" der Website zu übergeben und das Arbeitsblatt wieder mit dem Datum zu benennen.
Sub TabellenblätterErstellen()
Dim intTabelle As Integer
Dim strTabelle As String
Dim wksTabelle As Worksheet
'Schleife aufsetzen
For intTabelle = 11 To 1 Step - 1
'String "zsammenbauen"
strTabelle = ("Tabelle" & intTabelle)
'Arbeitsblatt einstellen
Set wksTabelle = Sheets(strTabelle)
'Arbeitsblatt
With wksTabelle
'benutzter Bereich löschen
.UsedRange.Clear
'In Zelle U1 Datum schreiben (dynamisch)
.Range("U1").Value = Format(Date + (intTabelle - 5), "DD.MM.YYYY")
'In Tabelle Auswertung ebenfalls dynamisch Datum schreiben
tbl_Auswertung.Cells(2, (intTabelle + 1)) = .Range("U1").Value
End With
'Nächstes Arbeitsblatt
Next intTabelle
End Sub

Ich lasse die Schleife rückwärts laufen, weil ich überzeugt bin, dass ich noch herausfinde, wie ich die Codenamen der Arbeitsblätter in die Schleife einbauen kann. So müsste ich dann die Arbeitsblätter nicht erst umbenennen. Würde ich die Schlaufe vorwärts laufen lasse, erhielt ich einen Fehler, weil das Arbeitsblatt bereits existiert.
Vorerst zum Schluss soll jetzt noch die kopiert und aufs Arbeitsblatt eingefügt werden. Im Prinzip in dieser Reihenfolge:
- Internetseite öffnen
- Datum von Tabelle1 Zelle U1 aun die Internetseite übergeben
- Die Seite "Print-Ansicht" für den Tag des eingetragenen Datums öffnen
- Seite kopieren und in Tabelle1 einfügen, Tabelle1 umbenennen
- "Print-Ansicht" schliessen
Nächstes Arbeitsblatt
- Datum von Tabelle2 Zelle U1 aun die Internetseite übergeben
- Die Seite "Print-Ansicht" für den Tag des eingetragenen Datums öffnen
- Seite kopieren und in Tabelle2 einfügen, Tabelle2 umbenennen
- "Print-Ansicht" schliessen
Nächstes Arbeitsblatt
Dafür habe ich folgenden Code (ich habe schon mal einige "Do: Loop Until IEApp.Busy = False" gelöscht):
Sub MehrereSeitenAusWeb()
'Tip: HTML-Codes mit FireFox auslesen
'("Links Klick" und Element untersuchen)
'Seite wird markiert, kopiert und auf Arbeitsblatt eingefügt
'InternetExplorer wird geschlossen
Dim IEApp As Object
Dim IEDoc As Object
Dim objCtrl As Object
Dim lngZiel As Long
Dim strZiel As String
Dim wksZiel As Worksheet
'InternetExplorer -> Internetseite öffnen
Set IEApp = CreateObject("InternetExplorer.Application")
'InternetExplorer sichtbar = True, nicht sichtbar = False
IEApp.Visible = True
IEApp.Navigate "https://www.aaa.bb/admin/login.php"
'Warten bis Seite geladen ist
Do: Loop Until IEApp.Busy = False
With IEApp.document
Do: Loop Until .ReadyState = "complete"
Set IEDoc = IEApp.document
'Benutzername und Passwort eintragen (HTML-Code auslesen für ID)
.getElementByID("user").Value = "XXX" 'anpassen
.getElementByID("passwort").Value = "YYY" 'anpassen
'OK-Knopf hat keine ID (HTML-Code auslesen, "Type" und "Value" ermitteln)
For Each objCtrl In IEApp.document.forms(0).elements
If objCtrl.Type = "submit" Then
If objCtrl.Value = "Login" Then
objCtrl.Click
Exit For
End If
End If
Next
End With
'  Warten bis Seite geladen ist
Do: Loop Until IEApp.Busy = False
For lngZiel = 1 To 11
strZiel = ("Tabelle" & lngZiel)
Set wksZiel = Sheets(strZiel)
With IEApp.document
Do: Loop Until .ReadyState = "complete"
'Datum eintragen (HTML-Code auslesen für ID, Format ermitteln)
'(In diesem Fall muss es Text sein)
.getElementByID("datesearch").Value = wksZiel.Range("U1") 'anpassen
'Search-Knopf hat keine ID (HTML-Code auslesen, "Type" und "Value" ermitteln)
For Each objCtrl In IEApp.document.forms(0).elements
If objCtrl.Type = "submit" Then
If objCtrl.Value = "Suche" Then
objCtrl.Click
Exit For
End If
End If
Next
End With
'Warten bis Seite geladen ist
Do: Loop Until IEApp.Busy = False
With IEApp.document
Do: Loop Until .ReadyState = "complete"
'Zu Internetseite für Print-Ansicht navigieren (HTML-Code auslesen)
IEApp.Navigate "https://www.aaa.bb/admin/print.php"
'Warten bis Seite geladen ist
Do: Loop Until IEApp.Busy = False
With IEApp.document
Do: Loop Until .ReadyState = "complete"
'Seite markieren...
IEApp.ExecWB 17, 2, 0, 0
'...kopieren...
IEApp.ExecWB 12, 2, 0, 0
'Einfügebereich auswählen
Application.Goto reference:=wksZiel.Cells(1, 1), Scroll:=False
'...einfügen
wksZiel.Paste
'Zwischenablage leeren, Kopierbereich entfernen
Application.CutCopyMode = False
End With
End With
'Tabellenblatt wieder umbenennen
wksZiel.Name = wksZiel.Range("U1").Value
Next lngZiel
IEApp.Quit
Set IEDoc = Nothing
Set IEApp = Nothing
Set objCtrl = Nothing
End Sub

Die Schleife funktioniert 1 mal einwandfrei. Die Seite wird geöffnet, das Datum eingetragen, "Print-Ansicht" geöffnet, kopiert, in Tabelle1 eingefügt, der Name wird geändert. Jetzt ist aber fertig, weil die "Print-Ansicht" nicht geschlossen wird und die Zeile
.getElementByID("datesearch").Value = wksZiel.Range("U1") 'anpassen
nirgends das Datum eintragen kann.
Ach ja, alle Codes stehen in einem Modul.
Ich werde, wenn alles läuft noch eine Userform mit einem Aktualisieren- und einem Schliessen- Button erstellen. Die Codes werde ich dann mit Call aufrufen. Habe ich schon so fürs erste "Projekt" gemacht und wird auch funktionieren.
Deinen Code habe ich auch herein kopiert und angepasst. Es erscheint schon beim ersten Durchlauf der Fehler "Laufzeitfehler '424': Objekt erforderlich" und folgende Zeile wird markiert:
browser.document.getElementByID("datesearch").Value = Sheets(strZiel).Range("U1")
.value, .text und auch das selbe aber mit .Cells(1,21) brachten das selbe Ergebnis.
Ich habe es auch no so probiert:
For lngZiel = 1 To 11 'Step -1
strZiel = ("Tabelle" & lngZiel)
Set wksZiel = Sheets(strZiel)
'Datum eintragen (HTML-Code auslesen für ID, Format ermitteln)
'(In diesem Fall muss es Text sein)
browser.document.getElementByID("datesearch").Value = wksZiel.Range("U1")
Auch wieder mit .Value, .Text u.s.w. aber immer mit dem selbigen Ergebnis.
Trotzdem Danke ich Dir vielmals für Deine Bemühungen. Das ist nicht selbstverständlich.
Ich hoffe, Du hast eventuell eine Idee, wie ich die "Print-Ansicht" vor
Next lngZiel
schliessen kann und zurück zur "Admin"- Seite komme.
Jedenfalls wünsche ich Dir noch ein schönes Wochenende.
Viele Grüsse
Patrick
Anzeige
AW: Mit Schleife Internetseite öffnen und kopieren
17.03.2018 14:28:03
Patrick
Liebes Forum
Ich habe es dank Thorsten und Zwenn doch noch geschafft.
Vollständigkeitshalber poste ich nun noch den Code, welcher mir die Daten für die elf Tage aus der Internetseite kopiert und in die Arbeitsblätter einfügt.
Sub MehrereSeitenAusWeb()
'Tip: HTML-Codes mit FireFox auslesen
'("Links Klick" und Element untersuchen)
'Seite wird markiert, kopiert und auf Arbeitsblatt eingefügt
'InternetExplorer wird geschlossen
Dim IEApp As Object
Dim IEPrint As Object
Dim IEDoc As Object
Dim objCtrl As Object
Dim lngZiel As Long
Dim strZiel As String
Dim wksZiel As Worksheet
'InternetExplorer -> Internetseite öffnen
Set IEApp = CreateObject("InternetExplorer.Application")
'InternetExplorer sichtbar = True, nicht sichtbar = False
IEApp.Visible = False
IEApp.Navigate "https://www.aaa.bb/admin/login.php"
'Warten bis Seite geladen ist
Do: Loop Until IEApp.Busy = False
With IEApp.document
Do: Loop Until .ReadyState = "complete"
Set IEDoc = IEApp.document
'Benutzername und Passwort eintragen (HTML-Code auslesen für ID)
.getElementByID("user").Value = "XXX" 'anpassen
.getElementByID("passwort").Value = "YYY" 'anpassen
'OK-Knopf hat keine ID (HTML-Code auslesen, "Type" und "Value" ermitteln)
For Each objCtrl In IEApp.document.forms(0).elements
If objCtrl.Type = "submit" Then
If objCtrl.Value = "Login" Then
objCtrl.Click
Exit For
End If
End If
Next
End With
'  Warten bis Seite geladen ist
Do: Loop Until IEApp.Busy = False
For lngZiel = 1 To 11
strZiel = ("Tabelle" & lngZiel)
Set wksZiel = Sheets(strZiel)
With IEApp.document
Do: Loop Until .ReadyState = "complete"
'Datum eintragen (HTML-Code auslesen für ID, Format ermitteln)
'(In diesem Fall muss es Text sein)
.getElementByID("datesearch").Value = wksZiel.Range("U1") 'anpassen
'Search-Knopf hat keine ID (HTML-Code auslesen, "Type" und "Value" ermitteln)
For Each objCtrl In IEApp.document.forms(0).elements
If objCtrl.Type = "submit" Then
If objCtrl.Value = "Suche" Then
objCtrl.Click
Exit For
End If
End If
Next
End With
'Warten bis Seite geladen ist
Do: Loop Until IEApp.Busy = False
With IEApp.document
Do: Loop Until .ReadyState = "complete"
'Internet-Explorer noch einmal öffnen
Set IEPrint = CreateObject("InternetExplorer.Application")
'InternetExplorer sichtbar = True, nicht sichtbar = False
IEPrint.Visible = False
'Zu Internetseite für Print-Ansicht navigieren (HTML-Code auslesen)
IEPrint.Navigate "https://www.aaa.bb/admin/print.php"
'Warten bis Seite geladen ist
Do: Loop Until IEPrint.Busy = False
With IEPrint.document
Do: Loop Until .ReadyState = "complete"
'Seite markieren...
IEPrint.ExecWB 17, 2, 0, 0
'...kopieren...
IEPrint.ExecWB 12, 2, 0, 0
'Einfügebereich auswählen
Application.Goto reference:=wksZiel.Cells(1, 1), Scroll:=False
'...einfügen
wksZiel.Paste
'Zwischenablage leeren, Kopierbereich entfernen
Application.CutCopyMode = False
End With
'InternetExplorer 2 schliessen
IEPrint.Quit
'Aufräumen
Set IEPrint = Nothing
End With
'Tabellenblatt wieder umbenennen
wksZiel.Name = wksZiel.Range("U1").Value
Next lngZiel
IEApp.Quit
Set IEDoc = Nothing
Set IEApp = Nothing
Set objCtrl = Nothing
End Sub

Noch einmal vielen Dank an Thorsten und Zwenn für Eure Geduld mit diesem Anfänger.
Allen ein schönes Wochenende
Viele Grüsse
Patrick
Anzeige
AW: Mit Schleife Internetseite öffnen und kopieren
17.03.2018 23:14:12
Zwenn
Hallo Patrick,
schön, dass es jetzt so klappt, wie Du wolltest :-) Ich wollte Dir mit meiner Anmerkung, dass es nicht so aussieht, als wenn Du alles überblickst, was Du da gecodet hast, nicht zu Nahe treten. Für den Zeitraum, in dem Du Dich nun mit VBA beschäftigst (mit Programmieren im allgemeinen?) ist das Ergerbnis sogar echt gut finde ich.
Ich hatte mir auch noch einmal Gedanken gemacht, bin aber nicht auf die Lösung mit 2 IE-Instanzen gekommen. Ich hatte überlegt, ob die Anmeldung wohl verloren geht, wenn man den Browser schließt oder nicht. Deshalb hatte ich zwei Lösungen im Kopf, die den jeweiligen Fall berücksichtigen. Bei einer hätte die Anmeldung einfach bei jedem Durchgang stumpf neu statt gefunden. Da finde ich Deine Lösung wesentlich besser!
Du hast auch mit Deiner sehr ausführlichen Antwort auf meine letzte Einlassung sehr klar gemacht, dass da eine Menge Hirnschmalz von Dir drin steckt. Ich wünschte oft, auch andere Leute, die hier um Hilfe nachfragen, würden auch nur annährend solche Auskünfte zu ihren Gedankengängen geben. Große Klasse^^
Viele Grüße,
Zwenn
Anzeige
AW: Mit Schleife Internetseite öffnen und kopieren
19.03.2018 14:31:03
Patrick
Hallo Zwenn
Erstmal danke für die Blumen.
Ich wollte mal kurz selbst eine Internetseite mit html bauen. Habe dann aber das Programm "Website X5" entdeckt und das Vorhaben wieder abgebrochen. Ich gestallte nun seit etwa 8 Jahren eine Internetseite für meine Mutter so. Allerdings werde ich mich wieder um die html-Programmierung kümmern, sobald die Projekte in der Firma erledigt sind.
Ansonsten habe ich mich nie mit Programmierungen auseinander gesetzt. Ich habe bis vor etwa 10 Jahren auch nie im Büro gearbeitet. Ich war bis 2012 LKW-Fahrer und war danach Schichtleiter in diesem von der Firma neu aufgebauten Betriebszweig. Wir machen auch noch für Mietwagenfirmen die Fahrzeugreinigungen und Transfers vom Flughafen in unser Parkhaus.
Ich habe dann in Excel eine Datei erstellt, wo wir die Valet- Parking Fahrzeuge eintragen um die Übersicht zu haben, welches Fahrzeug wann wieder am Flughafen stehen muss. Die Datei zeigt mir dann auch an, welches Fahrzeug auf welchem Parkplatz bei uns im Parkhaus steht. Dazu hat jedes Parkdeck ein separates Arbeitsblatt wo jeder Parkplatz eingezeichnet ist.
Da darauf fast jeder Mitarbeiter zugriff hat, damit die Fahrzeuge während meinen Frei- und Ferienabwesenheiten eingetragen werden können, ist es meist so, dass ich danach erst wieder das File reparieren muss, weil Formeln gelöscht wurden.
Es gibt nun veränderungen im Betrieb und die Kundendaten werden direkt von der Buchungsplattform übernommen und sobald der Kunde sein Fahrzeug abgiebt, ins SAP übertragen. Damit wir aber ein wenig Planen können, brauche ich die Daten, bevor der Kunde sein Fahrzeug uns übergeben hat.
Da jetzt aber nicht jeder Mitarbeiter alle Kundendaten sehen darf, aber auch bei meiner Abwesenheit die Daten abgerufen werden sollen, habe ich mich entschieden das ganze über VBA zu lösen, damit keine Formeln mehr gelöscht werden können und die Mitarbeiter nur diese Daten sehen können, die sie auch dürfen. Dass einer im VBA-Editor herum pfuscht befürchte ich nicht. Man muss ihn ja zuerst mal öffnen können...
Ich habe unterdessen die Lösung gefunden um den Codenamen in der Schleife anzusprechen um nicht den Umweg über das Ändern des Blattnamens zu gehen. Hier der Code:
Option Explicit

Function objTabelle(strZiel As String) As Object
Dim intZiel As Integer
With ThisWorkbook
For intZiel = 1 To .Sheets.Count
If .Sheets(intZiel).CodeName = strZiel Then
Set objTabelle = .Sheets(intZiel)
Exit Function
End If
Next intZiel
End With
End Function

Sub TabellenblätterErstellen()
Dim objTab As Object
Dim intTabelle As Integer
'Schleife aufsetzen
For intTabelle = 11 To 1 Step -1
'String "zsammenbauen"
Set objTab = objTabelle("Tabelle" & intTabelle)
'Arbeitsblatt einstellen
If Not objTab Is Nothing Then
'Arbeitsblatt
With objTab
'benutzter Bereich löschen
.UsedRange.Clear
'Register beschriften (dynamisch)
.Name = Format(Date + (intTabelle - 5), "DD.MM.YYYY")
'In Tabelle Auswertung ebenfalls dynamisch Datum schreiben
tbl_Auswertung.Cells(2, (intTabelle + 1)).Value = .Name
End With
End If
'Nächstes Arbeitsblatt
Next intTabelle
End Sub

Dann habe ich noch dies im Code "MehrereSeitenAusWeb()" geändert:
      For lngZiel = 11 To 1 Step -1
Set objZiel = objTabelle("Tabelle" & lngZiel)
If Not objZiel Is Nothing Then

Und kann dann hier auf den Blattnamen zugreifen:

.getElementByID("datesearch").Value = objZiel.Name 'anpassen

Zum Schluss muss ich auch die Blätter nicht wieder zurück benennen.
Mit der 2. IE- Instanz habe ich einfach probiert. Zuerst gespeichert und dann den Code geschrieben, lange überlegt, an welcher Stelle ich "Set IEPrint = Cr..." wohl einsetzen müsste und ausprobiert. Zu meinem ersteunen hat es beim ersten Versuch geklappt.
Ich habe einiges gegoogelt und in jedem Code, den ich gefunden habe wo diese Zeile vorkommt:

Do: Loop Until IEApp.Busy = False

Ist diese 2mal nacheinander geschrieben. Du hast schon geschrieben, dass dies nicht nötig sei, bin aber mit Deiner Erklärung etwas überfordert. Wenn es doch so oft gemacht wird, warum ist es dann nicht notwendig?
Nun muss ich wieder etwas körperlich arbeiten. Heute ist die Hölle los. Wahrscheinlich werde ich wieder etaws Freizeit opfern müssen, um hier weiter zu kommen...

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige