Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1724to1728
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
Inhaltsverzeichnis

Excel VBA Butoon in ie explorer

Excel VBA Butoon in ie explorer
18.11.2019 13:16:53
Joerg
Hallo.
Ich möchte folgenden vba code ausführen.
Er läuft auch durch.....aber ich möchte gerne auf der Seite die Zahl 2,3.... usw. per vba ansprechen

Sub js_www_Bewertung_holen()
js_file = "c:\temp\war.txt"
Close #1
Open js_file For Output As #1
rene_ww = "https://www.ariva.de/zertifikate/suche/index.m?zertart_id=13#eq_underlying_ag=409& _
noscript_min_laufzeit_ende=&noscript_max_laufzeit_ende=&noscript_min_laufzeit_start=& _
noscript_max_laufzeit_start=&noscript_min_ratio=&noscript_max_ratio=&noscript_min_strike=& _
noscript_max_strike=&noscript_min_k_diff_security=&noscript_max_k_diff_security=& _
noscript_min_k_diff_security_rel_pa=&noscript_max_k_diff_security_rel_pa=& _
noscript_min_k_diff_strike=&noscript_max_k_diff_strike=&noscript_min_k_diff_strike_rel=& _
noscript_max_k_diff_strike_rel=&noscript_min_k_implied_vola=&noscript_max_k_implied_vola=& _
noscript_min_k_omega=&noscript_max_k_omega=&noscript_min_k_innerer_wert=& _
noscript_max_k_innerer_wert=&noscript_min_k_leverage=&noscript_max_k_leverage=&noscript_min_k_aufgeld=&noscript_max_k_aufgeld=&noscript_min_k_aufgeld_rel=&noscript_max_k_aufgeld_rel=&noscript_min_k_aufgeld_rel_pa=&noscript_max_k_aufgeld_rel_pa=&noscript_min_k_delta=&noscript_max_k_delta=&noscript_min_k_theta=&noscript_max_k_theta="
rene_ww = rene_ww & "&noscript_min_k_zeitwert=&noscript_max_k_zeitwert=& _
noscript_min_k_spread_abs=&noscript_max_k_spread_abs=&noscript_min_k_spread_hom=& _
noscript_max_k_spread_hom=&noscript_min_k_spread_rel=&noscript_max_k_spread_rel=&eq_typ=long& _
search_id=0ca5845ef250e2d284ae377deb2bb902"
Range("c15") = rene_ww
Dim Response As String
' Zugriff aufs Web
Dim WebBrowser As Object
Set WebBrowser = CreateObject("InternetExplorer.Application")
WebBrowser.Navigate rene_ww
' Warten, bis die Seite geladen ist
Do While WebBrowser.busy
DoEvents
Loop
newHour = Hour(Now())
newMinute = Minute(Now())
newSecond = Second(Now()) + 1
waitTime = TimeSerial(newHour, newMinute, newSecond)
Application.Wait waitTime
Set frm = WebBrowser.Document.getElementsByname("pagenav26377")
' hier passier nichts bzw. der Button wird nicht gefunden
For Each e In frm
If (e.getAttribute("value") = "2") Then
e.Click
Exit For
End If
Next e
Response = WebBrowser.Document.Body.outerText
Print #1, Response
End Sub

Danke für eure Hilfe Vorab
Lieben Gruß
Jörg

1
Beitrag zum Forumthread
Beitrag zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Excel VBA Butoon in ie explorer
20.11.2019 22:57:31
Zwenn
Hallo Jörg,
ich habe Deine Anfrage schon gesehen, als Du sie am 18.11. gepostet hast. Ich habe mir die Seite auch direkt angesehen und wollte eigentlich nix dazu schreiben. Aber da bisher niemand geantwortet hat, wollte ich Dir heute Abend zunächst nur mitteilen, warum. Das funktioniert nämlich völlig anders als Du dachtest. Nun habe ich mich aber nochmal reingedacht und habe Dir was programmiert, womit Du arbeiten kannst.
Du möchtest alle Seiten durchgehen, um vermutlich Daten aus den Tabellen zu ziehen. Das Daten Auslesen habe ich auch mit eingebaut, aber nur grob und unkommentiert, um sicherzustellen, das am Ende alles so funktioniert, wie ich mir das vorstelle.
Deine Idee war alle Elemente der Paginierung auszulesen und dann nacheinander anzuklicken. Das funktioniert aus vier Gründen nicht so, wie Du es versuchst:
1. Die Zeile ...
Set frm = WebBrowser.Document.getElementsByname("pagenav26377")

... funktioniert nicht, weil der Wert "pagenav26377" kein Name, sondern eine ID ist. Die Methode getElementsByName() ist im DOM Standard aber sowieso outdated und sollte nicht mehr verwendet werden. Aber auch .getElementByID("pagenav26377") funktioniert nicht. Denn diese IDs werden bei jedem Seitenaufruf individuell erstellt. Das ist also nie die gleiche.
2. Würde es funktionieren die Paginierung so zu holen, würde For-Each trotzdem nicht gehen. Du würdest ausschließlich das DropDown inklusive der option-Tags ansprechen. Um die option-Tags durchzugehen, musst Du sie aber einzeln verfügbar machen. Also in einer eigenen NodeCollection und dann durchgehen.
3. Sobald Du die nächste Tabelle aufrufst, ändert sich auch das Element mit der Paginierung. Ich bin mir nicht sicher, aber ich nehme an, damit würde auch Deine einmal gebildete NodeCollection für das DropDown nicht mehr funktionieren, um die weiteren Seiten durchzugehen. Das denke ich, weil das DropDown nach dem neuen Seitenaufruf auf einer anderen Zahl liegt, also ein ganz anderes Element ist.
4. Das richtige Value des DropDown muss nicht mit getAttribute() geholt werden, sondern mit dropDownName.value gesetzt werden. Es funktioniert weiterhin auch nicht mit .click, sondern es muss das Change Event vom DropDown ausgelöst werden. Wie HTML Events funktionieren habe ich auch erst kürzlich verstanden:
https://www.herber.de/forum/cgi-bin/callthread.pl?index=1722450
Das Durchgehen der Paginierung über das Dropdown ist Kern meiner Lösung. Das Makro PaginierungDurchgehenUeberDropDown() ist auch ganz gut kommentiert denke ich. Ich habe da jetzt keine HTML-Abschnitte als Kommentare hinterlegt, auf denen geade gearbeitet wird. Du kannst aber im Seitenquelltext der Seite selbst nachvollziehen, wo das Makro da so rumfuhrwerkt.
Bevor ich das Makro poste, möchte ich noch auf Deinen Erstaufruf der Seite eingehen.
Du hast erkannt, dass man die Seite direkt aufrufen kann, ohne automatisiert irgendwelche Suchfelder ausfüllen und abschicken zu müssen. Das ist schonmal gut. Du verwendest allerdings den monströs langen Link, den die Seite liefert. Den kannst Du stark einkürzen.
So eine URL ist aufgebaut aus dem eigentlichen Link auf die Seite und dann folgt eine Parameterliste. Der erste Parameter wird mit einem Fragezeichen (?) eingeleitet, alle weiteren werden mit einem Kaufmanns-Und (&) abgegrenzt. Dein Link hat 45 Parameter. Wenn Du Dir diese mal näher ansiehst, dann stellst Du fest, dass 42 davon mit dem Gleichheitszeichen (=) enden, bevor der nächste Parameter kommt. Das heißt, die haben alle keinen zugewiesenen Wert und damit sind sie überflüssig. Die kannst Du einfach weglassen. Auch die Reihenfolge solcher Parameter ist übrigens egal.
Übrig bleiben also nur der Grundlink und 3 Parameter:
Grundlink: https://www.ariva.de/zertifikate/suche/index.m
Parameter 1: ?zertart_id=13#eq_underlying_ag=409
Parameter 2: &eq_typ=long
Parameter 3: &search_id=0ca5845ef250e2d284ae377deb2bb902
Dann hast Du auch erkannt, dass eine manuelle Pause gemacht werden muss, damit die Seite vollständig zur Verfügung steht. Auch das ist richtig. Das würde ich allerdings in einer Zeile abwickeln und nicht so einen Aufwand betreiben. Den jetzigen Zeitpunkt zuzüglich der Zeit, die Du eine Pause einlegen willst, kannst Du sinngemäß so schreiben:
Application.Wait (Now + TimeSerial(STUNDEN, MINUTEN, SEKUNDEN))
Das Speichern des body-Tags habe ich nicht gemacht. Ich denke auch nicht, dass Du das brauchst:

Sub PaginierungDurchgehenUeberDropDown()
Dim htmlSeite As Long
Dim browser As Object
Dim urlGrund As String
Dim urlParameter1 As String
Dim urlParameter2 As String
Dim urlParameter3 As String
Dim url As String
Dim knotenPaginierung As Object
Dim knotenOptionTags As Object
Dim knotenEinOptionTag As Object
Dim knotenDropDown As Object
Dim letzteSeite As Boolean
'URL zusammenbauen
'Es sind nur 3 von 45 Parametern notwendig
urlGrund = "https://www.ariva.de/zertifikate/suche/index.m"
urlParameter1 = "?zertart_id=13#eq_underlying_ag=409"
urlParameter2 = "&eq_typ=long"
urlParameter3 = "&search_id=0ca5845ef250e2d284ae377deb2bb902"
url = urlGrund & urlParameter1 & urlParameter2 & urlParameter3
'Internet Explorer initialisieren, Sichtbarkeit festlegen,
'URL aufrufen und warten bis Seite vollständig geladen wurde
Set browser = CreateObject("internetexplorer.application")
browser.Visible = False
'browser.FullScreen = True
browser.navigate url
Do Until browser.ReadyState = 4: DoEvents: Loop
'Manuelle Pause, damit die Seite komplett zur Verfügung steht
Application.Wait (Now + TimeSerial(0, 0, 5))
'Alle Seiten durchgehen. Die erste ist schon geladen, also
'wird eine fußgesteuerte Schleife verwendet, um das Makro
'nach der letzten Seite zu verlassen
Do
'Den Paginierungsblock als DOM Object holen
'Die Methode getElementByID() fürt in VBA sofort zu einem Laufzeitfehler,
'wenn die ID nicht im HTML-Quelltext der Seite steht. Deshalb wird vor dem
'Aufruf der Methode die Fehlerbehandlung auf "egal was kommt, mach einfach
'weiter" geschaltet. Dieses Übergehen von Fehlern wird nach dem Aufruf
'sofort wieder deaktiviert.
'ACHTUNG: Alle Fehler so pauschal zu übergehen führt in der Regel zu
'nicht nachvollziehbarem Verhalten eines Makros, wenn Fehler auftreten,
'weil es keine Reaktion der Laufzeitumgebung gibt (hier Excel)
On Error Resume Next
Set knotenPaginierung = browser.document.getElementByID("PAGINATION_BLOCK")
On Error GoTo 0
'Dieses Makro prüft an dieser Stelle, ob der Mathodenaufruf gelungen ist
'und reagiert bei Misserfolg. Bei Erfolg gehts einfach weiter. Wir wissen
'also immer, ob es einen Laufzeitfehler gab oder nicht. Wir fangen ihn
'ggf. nur kontrolliert ab
If knotenPaginierung Is Nothing Then
MsgBox "Es wurde keine Seitennummerierung gefunden"
'Makro beenden, wobei der IE hier zu Kontrollzwecken geöffnet bleibt
'und sichtbar gemacht wird
browser.Visible = True
Exit Sub
End If
'Feststellen ob es eine weitere Seite gibt und welche es ist
'Dazu nutzen wir das DropDown Menü, das der aktuellen Seitenzahl
'zugewiesen ist. Die Anzahl der Option-Tags gibt Auskunft über
'die Anzahl der Seiten. Der aktuell gewählte Eintrag hat das
'Attribut "selected"
Set knotenOptionTags = knotenPaginierung.getElementsByTagName("option")
If knotenOptionTags Is Nothing Then
MsgBox "Es wurde kein Dropdown für die Seitenauswahl gefunden"
'Makro beenden, wobei der IE hier zu Kontrollzwecken geöffnet bleibt
'und sichtbar gemacht wird
browser.Visible = True
Exit Sub
End If
'Alle DropDown Einträge bis zum ausgewählten durchgehen
For Each knotenEinOptionTag In knotenOptionTags
If knotenEinOptionTag.hasAttribute("selected") Then
'Ausgewählten Eintrag auslesen
htmlSeite = Trim(knotenEinOptionTag.Value) + 1
Exit For
End If
Next knotenEinOptionTag
'Hier die Werte auslesen, um die es geht
If WerteHolen(browser.document, htmlSeite) = False Then
MsgBox "Es ist ein Fehler beim Auslesen der aktuellen Datentabelle aufgetreten"
'Makro beenden, wobei der IE hier zu Kontrollzwecken geöffnet bleibt
'und sichtbar gemacht wird
browser.Visible = True
Exit Sub
End If
'Auf letzte Seite prüfen und ggf nächste Seite aufrufen
If htmlSeite = knotenOptionTags.Length Then
'Letzte Seite wurde ausgelesen
letzteSeite = True
Else
'DropDown holen
Set knotenDropDown = knotenPaginierung.getElementsByTagName("select")(0)
'DropDown auf nächste Seite schalten
knotenDropDown.Value = htmlSeite
'Das onChange Event des DropDown auslösen
Call TriggerEvent(browser.document, knotenDropDown, "change")
'Warten auf Nachladen der Daten
Application.Wait (Now + TimeSerial(0, 0, 3))
End If
Loop Until letzteSeite
'Aufräumen
browser.Quit
Set browser = Nothing
Set knotenPaginierung = Nothing
Set knotenOptionTags = Nothing
Set knotenEinOptionTag = Nothing
Set knotenDropDown = Nothing
End Sub

Function WerteHolen(htmlDokument As Object, vonSeite As Long) As Boolean
'Diese Unterroutine liest die Datentabelle einer Seite grob aus
'Es werden alle Werte geholt, aber nicht formatiert, da es hier
'um das durchblättern aller Seiten geht
Dim knotenDatenTabelle As Object
Dim knotenDatenZeilen As Object
Dim knotenEineDatenZeile As Object
Dim knotenDatenZellen As Object
Dim knotenDatenEineZelle As Object
Dim zeile As Long
Dim spalte As Long
Dim ergebnis As Boolean
If ActiveSheet.Cells(1, 2).Value = "" Then
zeile = 1
Else
zeile = ActiveSheet.Cells(Rows.Count, 2).End(xlUp).Row + 1
End If
spalte = 1
On Error Resume Next
Set knotenDatenTabelle = htmlDokument.getElementByID("RESULT_TABLE_CONTENT_BLOCK")
On Error GoTo 0
If Not knotenDatenTabelle Is Nothing Then
Set knotenDatenZeilen = knotenDatenTabelle.getElementsByTagName("tr")
If Not knotenDatenZeilen Is Nothing Then
For Each knotenEineDatenZeile In knotenDatenZeilen
Set knotenDatenZellen = knotenEineDatenZeile.getElementsByTagName("td")
If Not knotenDatenZellen Is Nothing Then
For Each knotenDatenEineZelle In knotenDatenZellen
ActiveSheet.Cells(zeile, spalte).Value = Trim(knotenDatenEineZelle.innertext)
spalte = spalte + 1
Next knotenDatenEineZelle
ActiveSheet.Cells(zeile, spalte).Value = vonSeite
If zeile > 14 Then
ActiveWindow.SmallScroll down:=1
End If
spalte = 1
zeile = zeile + 1
ergebnis = True
End If
Next knotenEineDatenZeile
End If
End If
WerteHolen = ergebnis
End Function

Sub TriggerEvent(htmlDocument As Object, htmlElementWithEvent As Object, eventType As String)
Dim theEvent As Object
htmlElementWithEvent.Focus
Set theEvent = htmlDocument.createEvent("HTMLEvents")
theEvent.initEvent eventType, True, False
htmlElementWithEvent.dispatchEvent theEvent
End Sub
Viele Grüße,
Zwenn
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige