Gezielte Börsenkurse aus HTML importieren

  • Excel

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Ferenz.

    Gezielte Börsenkurse aus HTML importieren

    Hallo VBA-Experten,

    vieleicht kann mir einer helfen. Ich habe eine, wie ich finde, elegante Methode entdeckt, um gezielte Daten
    aus einer Internetseite zu importieren. Das Beispielskript habe ich auf
    meine Bedürfnisse versucht anzupassen. Zum einen ein eingeloggtes und
    zum anderen ein ausgeloggtes angepasstes Skript. Gelingt mir aber nur
    teilweise, weil ich das Skript nicht ganz verstehe, obwohl ich schon
    einige VBA-Projekte realisiert habe. HTML ist eben
    Neuland für mich.

    Eingeloggtes Angepasstes Skript:

    Quellcode

    1. Option Explicit
    2. 'Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 'For 32 Bit Systems
    3. #If VBA7 Then
    4. Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr) 'For 64 Bit Systems
    5. #Else
    6. Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 'For 32 Bit Systems
    7. #End If
    8. Sub Einloggen()
    9. Dim IEApp As Object
    10. Dim IEDocument As Object
    11. Dim sSource, sTable As String
    12. Dim lPosBeg, lPosEnd As Long
    13. Dim objData As DataObject
    14. Set IEApp = CreateObject("InternetExplorer.Application")
    15. IEApp.Visible = True
    16. IEApp.Navigate "https://www.targobank.de/de/online-banking/login.cgi#r=head-login"
    17. Do: Loop Until IEApp.Busy = False
    18. Do: Loop Until IEApp.Busy = False
    19. Set IEDocument = IEApp.Document
    20. Do: Loop Until IEDocument.ReadyState = "complete"
    21. IEDocument.getElementById("_userid").Value = "Mustermann"
    22. IEDocument.getElementById("_pwduser").Value = "12345"
    23. Do: Loop Until IEDocument.ReadyState = "complete"
    24. IEDocument.getElementById("submit1").Click
    25. Do: Loop Until IEDocument.ReadyState = "complete"
    26. IEApp.Navigate "https://www.targobank.de/kurse/index.html?ciwi=CIWI0427&ID_NOTATION=31345909&addEvent=filter_wpsuche"
    27. Do
    28. Sleep 100
    29. Loop Until IEApp.Busy = False
    30. Sleep 100
    31. sSource = IEApp.Document.DocumentElement.outerHTML
    32. lPosBeg = InStr(1, sSource, "<table", vbTextCompare)
    33. lPosEnd = InStr(1, sSource, "</table>", vbTextCompare)
    34. sTable = Mid(sSource, lPosBeg, (lPosEnd - lPosBeg))
    35. Set objData = New DataObject
    36. objData.SetText ""
    37. objData.PutInClipboard
    38. objData.SetText sTable
    39. objData.PutInClipboard
    40. Worksheets.Add after:=Worksheets(Worksheets.Count)
    41. ActiveSheet.Name = "temp1"
    42. ActiveSheet.Paste
    43. Set IEDocument = Nothing
    44. Set IEApp = Nothing
    45. End Sub


    Ausgeloggtes Angepasstes Skript:

    Quellcode

    1. Option Explicit
    2. 'Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 'For 32 Bit Systems
    3. #If VBA7 Then
    4. Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr) 'For 64 Bit Systems
    5. #Else
    6. Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 'For 32 Bit Systems
    7. #End If
    8. Sub Ausgeloggt()
    9. Dim IEApp As Object
    10. Dim IEDocument As Object
    11. Dim sSource, sTable As String
    12. Dim lPosBeg, lPosEnd As Long
    13. Dim objData As DataObject
    14. Set IEApp = CreateObject("InternetExplorer.Application")
    15. IEApp.Visible = True
    16. IEApp.Navigate "https://www.targobank.de/kurse/index.html?ciwi=CIWI0427&ID_NOTATION=31345909&addEvent=filter_wpsuche"
    17. Do: Loop Until IEApp.Busy = False
    18. Do: Loop Until IEApp.Busy = False
    19. Set IEDocument = IEApp.Document
    20. '--- Einloggen
    21. ' Do: Loop Until IEDocument.ReadyState = "complete"
    22. ' IEDocument.getElementById("_userid").Value = "Mustermann"
    23. ' IEDocument.getElementById("_pwduser").Value = "12345"
    24. Do: Loop Until IEDocument.ReadyState = "complete"
    25. IEDocument.getElementById("submit1").Click
    26. ' Do: Loop Until IEDocument.ReadyState = "complete"
    27. ' IEApp.Navigate "http?:"
    28. Do
    29. Sleep 100
    30. Loop Until IEApp.Busy = False
    31. Sleep 100
    32. sSource = IEApp.Document.DocumentElement.outerHTML
    33. lPosBeg = InStr(1, sSource, "<table", vbTextCompare)
    34. lPosEnd = InStr(1, sSource, "</table>", vbTextCompare)
    35. sTable = Mid(sSource, lPosBeg, (lPosEnd - lPosBeg))
    36. Set objData = New DataObject
    37. objData.SetText ""
    38. objData.PutInClipboard
    39. objData.SetText sTable
    40. objData.PutInClipboard
    41. Worksheets.Add after:=Worksheets(Worksheets.Count)
    42. ActiveSheet.Name = "temp1"
    43. ActiveSheet.Paste
    44. Set IEDocument = Nothing
    45. Set IEApp = Nothing
    46. End Sub


    Meine Anliegen mit dieser Anfrage sind:
    1. Welches ist das "getElementByID()" des fetten (rot/grün) Kurses im Quellcode der folgenden Internetseite? targobank.de/kurse/index.html?…9&addEvent=filter_wpsuche
    2. Welches ist das "getElementByID()" des Bestätigungs-Buttons im Quellcode der folgenden Login-Seite? targobank.de/de/online-banking/login.cgi#r=head-login
    3. Erbitte um Erläuterung des VBA-Skripts bezüglich der folgenden Beispiele;
      1. a. [color=#0000CD]Do: Loop Until[/color] Diese Schreibweise kam bei meinen Lehrmaterialien nie vor, sondern immer mehrzeilig.
        1. Wie wird der Befehl abgearbeitet und wieso kommt der Befehl doppelt vor?
          • Quellcode

            1. Do: Loop Until IEApp.Busy = False
            2. Do: Loop Until IEApp.Busy = False

        2. Wie werden diese Befehle abgearbeitet?
          • Quellcode

            1. Do: Loop Until IEDocument.ReadyState = "complete"
            2. IEDocument.getElementById("_userid").Value = "Mustermann"
            3. IEDocument.getElementById("_pwduser").Value = "12345"

      2. Wozu wird "Sleep" im Skript benötigt?
    4. Wieso funktioniert die IF-Bedingung außerhalb einer Sub, wenn das Raute-Symbol "#" vorneweg steht?

    Vielen Dank schon im Voraus
    Ferenz
    Zu allen von dir aufgezählten Punkten...

    -> Vergiss es! :D


    Macht keinen bis wenig Sinn eine Seite die komplett auf dynamischen Inhalten basiert auszulesen.

    DU benötigst eine API wie die von Yahoo Finance
    Damit kannst du ganz einfach und unkompliziert alles auslesen und verarbeiten.
    HIER ein kleines Beispiel.
    Hallo Shaebich,

    wieso "vergiss es" :?:
    ich benötige nur 2 Kursdaten pro Seite von 4 Seiten. Den aktuellen Kurs und den Höchstkurs 1 Jahr rückwirkend.
    Das API-Beispiel blick ich leider nicht, aber ich erkundige mich mal bei der Targobank, ob die eine API anbieten. Auf der Homapge steht leider nichts dazu, muß ich also anfragen. Wäre schön, wenn Du mich dann unterstützen könntest, wenn Targobank eine API anbietet.

    Schönen Gruß
    Ferenz
    @Ferenz, wie gesagt :D Yahoo Finance bietet eine API an. Dort kannst du ganz easy deine Abfragen machen.

    Wenn du den Code oben selbst geschrieben hast, sollte dir ein Request an eine API einfach von den Fingern gehen.
    Wenn du Probleme dabei bekommst, kannst du jederzeit hier deinen Code posten und es wird dir geholfen.

    Hilfestellung ist ok aber alles andere läuft dann vermutlich eher auf "geschäftlicher" Ebene...

    Außerdem wäre es auch nicht schlecht zu wissen, was du überhaupt vorhast und wieso es Excel sein muss
    Hallo Shaebich,

    den Code habe ich nicht selbst geschrieben, deshalb auch meine Fragen am Anfang. Nur die "getElementById" des Benutzernames und des Passworts habe ich angepasst, sowie die Internetlinks. Der Code funnktioniert soweit.
    Der obige Code ist, wenn Du so willst mein Code, aber nicht verstanden. Meine 3 Probleme (Einlogg-Befehl, dynamischer Kurs, ein Jahr rückwirkenden Maximalkurs) sind meine konkreten Probleme und ich hoffe nun, daß mir geholfen wird.
    Mehr brauche ich nicht :rolleyes:

    Bei der Targobank habe ich 4 ETFs, die ich über Excel tracke. Aus diesem Grund muß es Excel sein und weil ich mich mit VBA auskenne. Bei der Targobank gibt es jedoch keine dynamisch Stopp-Loss-Order (Trailing-Stopp-Loss-Order). Deshalb möchte ich beim öffnen des Excel-Tools, daß sich die Kurse automatisch aktualisieren, damit sich meine Stopp-Loss-Order-Kurse automatisch berechnen. Wenn der Stopp-Loss-Order-Kurs gestiegen ist, dann passe ich die Stopp-Loss-Order bei der Targobank an.
    Die Aktualsierung muß von der Targobank sein, weil ich auch dort meine ETFs kaufe und verkaufe und ich gerne den realen Kurs verwenden möchte bei dem ich auch irgendwann verkaufen werde. Ich verfolge ja auch nicht den Preis bei Aldi und kaufe dann blind bei Lidl. 8o

    Meine Anfrage ist also rein privater Natur.
    Deshalb wäre es super 8o, wenn Du mir meine 3 Probleme lösen könntest. Ich verichte sogar auf das Verstehen, das ich in meinem ersten Post gebeten hatte.

    Gruß Ferenz