Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA-JSON Werte aus zellen einfügen

Forumthread: VBA-JSON Werte aus zellen einfügen

VBA-JSON Werte aus zellen einfügen
02.01.2023 17:36:43
Matze
Hallo,
ich bastle seit geraumer Zeit an einem Exceldokument herum, in dem ich verschiedene API's abfragen möchte, um sie miteinander zu verknüpfen und auszuwerten.
nun bin ich an einem Punkt angelangt, an dem ich nicht weiterkomme. ich möchte von https://api.coincap.io/v2/candles?exchange=poloniex&interval=h1&baseId=ethereum&quoteId=bitcoin&start=1649894400000&end=1649898000000 den Wert "volume" in aufeinanderfolgenden Zellen ausgeben lassen. Das funktioniert auch schon gut. Allerdings möchte ich die Parameter für die Abfrage aus einer Zelle beziehen und da harpert es bei mir. Vermutlich ist es nur eine Kleinigkeit aber ich komme selber einfach nicht weiter. Mein code sieht folgendermaßen aus:

Sub GetVolume()
On Error Resume Next
'List of all symbols
Set http = CreateObject("MSXML2.XMLHTTP")
http.Open "GET", "https://api.coincap.io/v2/candles", False
On Error Resume Next
http.Send
Set json = ParseJson(http.ResponseText)
i = 10
For Each item In json("data")
If item("exchange") = Workbooks(1).Worksheets("Tabelle1").Range("A1").Value And Workbooks(1).Worksheets("Tabelle1").Range("A1").Value  "" Then
Sheets(1).Cells(1, i).Value = item("volume")
i = i + 1
End If
Next
Exit Sub
error:
End Sub
Die Parameter sollen also aus der Zelle A1 genommen werden und die Antwort in J1 und folgenden ausgegeben werden. Die Werte in A1 kommen dann später aus verschiedenen Zellen und sind mit Excel Funktionen zusammengesetzt.
Der Link zu meiner Excel-Datei lautet: https://www.herber.de/bbs/user/157048.xlsm
für jeden Tip bin ich dankbar.
Anzeige

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA-JSON Werte aus zellen einfügen
03.01.2023 00:53:49
Yal
Hallo Matze,
noch keine Antwort, daher lasse ich die Frage offen.
Nur Hygiene-Faktor:
_ ein sauberes Einrücken bringt eine bessere Übersicht über den Code und das Erkennen von dummen Fehler leichter.
_ ich würde auch die Variabledeklaration als "erforderlich" schalten. Profis machen es so. Warum wohl.
Ist es richtig, dass Du bei jedem "Item" abfragst, ob Range("A1") <> "" obwohl dies im Lauf der Behandlung sich nicht ändert?
"sheets(1)" scheint Worksheets("Tabelle1") zu sein. Warum zwei verschiedenen Benennungen? Spass an dich selbst zu verwirren? Zu viel Denkvermögen vorhanden? Langeweile?
Ich bringe den Code nicht zum Laufen: schon auf die Zeile "Sub GetVolume()" bricht es mit "ungültige Prozedureaufruf oder ungültiges Argument".
Ausserdem scheint dein http.Open fehlerhaft zu sein: es ist nicht im Browser zu öffnen.

Sub GetVolume()
On Error Resume Next
'List of all symbols
Set http = CreateObject("MSXML2.XMLHTTP")
http.Open "GET", "https://api.coincap.io/v2/candles", False
http.Send
Set json = ParseJson(http.ResponseText)
With Workbooks(1).Worksheets("Tabelle1")
i = 10
If .Range("A1").Value  "" Then
For Each Item In json("data")
If Item("exchange") = .Range("A1").Value Then
.Cells(1, i).Value = Item("volume")
i = i + 1
End If
Next
End If
End With
Exit Sub
error:
End Sub
VG
Yal
Anzeige
AW: VBA-JSON Werte aus zellen einfügen
03.01.2023 10:58:40
Matze
Vielen Dank, für die schnelle Antwort und das Ordnen meines Codes.
Die Basis für diese Abfrage ist dieser funktionierende Code:

Sub GetPrice()
On Error Resume Next
'List of all prices
Set http = CreateObject("MSXML2.XMLHTTP")
http.Open "GET", "https://api.binance.com/api/v3/ticker/price", False
http.Send
Set json = ParseJson(http.ResponseText)
With Workbooks(1).Worksheets("Tabelle1")
i = 10
If .Range("A1").Value  "" Then
For Each item In json
If item("symbol") = .Range("A1").Value Then
.Cells(1, i).Value = item("price")
i = i + 1
End If
Next
End If
End With
Exit Sub
error:
End Sub
Ich nutze ihn an anderer Stelle in meiner Datei und habe ihn nach deinem Vorbild überarbeitet.
Meine Idee war nun, "symbol" durch "exchange" zu ersetzen und den text in A1 "ETHBTC" durch "binance&interval=h1&baseId=ethereum&quoteId=bitcoin&start=1649894400000&end=1649898000000"
in meinem Vorbild setzt sich die Abfrage dann zu "https://api.binance.com/api/v3/ticker/price?symbol=ETHBTC" zusammen. In meiner nicht funktionierenden Version sollte sich folgende Abfrage ergeben:"https://api.coincap.io/v2/candles?exchange=binance&interval=h1&baseId=ethereum&quoteId=bitcoin&start=1649894400000&end=1649898000000" aber leider funktioniert das nicht.
Anzeige
AW: VBA-JSON Werte aus zellen einfügen
03.01.2023 13:38:48
ChrisL
Hi
Der Server gibt öfters Fehler zurück wie nicht (ich vermute eine allgemeine Überlast). Wenn der Server zufälligerweise mal erreichbar ist, sollte folgender Code funktionieren. Das Parsen ist im Code bereits enthalten.
Beispieldaten in Zelle A1 und A2:
https://www.herber.de/bbs/user/157061.txt

Sub GetVolume()
Dim objHTTP As Object, lngZeile As Long, strAntwort As String
Set objHTTP = CreateObject("MSXML2.XMLHTTP")
With ThisWorkbook.Worksheets("Tabelle1")
For lngZeile = 1 To .Cells(.Rows.Count, 1).End(xlUp).Row
objHTTP.Open "GET", "https://api.coincap.io/v2/candles?exchange=" & .Cells(lngZeile, 1), False
objHTTP.Send
strAntwort = objHTTP.ResponseText
If InStr(strAntwort, "volume") Then
strAntwort = Mid(strAntwort, InStr(strAntwort, "volume") + 9, 999)
strAntwort = Left(strAntwort, InStr(strAntwort, """") - 1)
.Cells(lngZeile, 2) = strAntwort
Else
.Cells(lngZeile, 2) = "Server antwortet nicht"
End If
Next lngZeile
End With
End Sub
cu
Chris
Anzeige
AW: VBA-JSON Werte aus zellen einfügen
03.01.2023 19:38:46
Matze
Danke, das funktioniert super. Ich habe allerdings für mein Beispiel einen ungünstigen Parameter für "interval" gewählt. ich benötige nämlich einen Interval von 15 Minuten. Da werden mir dann vier Werte für "volume" ausgegeben. Ich bekomme es aber nicht hin, zu loopen, dass ich die vier Werte in einer Reihe angezeigt bekomme.

Sub GetVolume()
Dim objHTTP As Object, lngZeile As Long, strAntwort As String
Set objHTTP = CreateObject("MSXML2.XMLHTTP")
With ThisWorkbook.Worksheets("Tabelle1")
For lngZeile = 1 To .Cells(.Rows.Count, 1).End(xlUp).Row
objHTTP.Open "GET", "https://api.coincap.io/v2/candles?exchange=" & .Cells(lngZeile, 1), False
objHTTP.Send
i = 2
strAntwort = objHTTP.ResponseText
If InStr(strAntwort, "volume") Then
strAntwort = Mid(strAntwort, InStr(strAntwort, "volume") + 9, 999)
strAntwort = Left(strAntwort, InStr(strAntwort, """") - 1)
.Cells(lngZeile, i) = strAntwort
i = i + 1
Else
.Cells(lngZeile, i) = "Server antwortet nicht"
End If
Next lngZeile
End With
End Sub

Anzeige
AW: VBA-JSON Werte aus zellen einfügen
04.01.2023 08:46:59
ChrisL
Hi
Übrigens mal "Power-Query Webabfrage mit Parameter" recherchieren. Damit solltest du auch ohne VBA zum Ziel kommen.
Hier den angepassten Code. Wenn die Parserei noch umfangreicher wird, dann würde ich dann doch wieder eher auf einen ordentlichen Jason-Parser zurückgreifen.
Der Interval Parameter ist übrigens m15

Sub GetVolume()
Dim objHTTP As Object, lngZeile As Long, strAntwort As String, varSplit As Variant, i As Integer
Set objHTTP = CreateObject("MSXML2.XMLHTTP")
With ThisWorkbook.Worksheets("Tabelle1")
For lngZeile = 1 To .Cells(.Rows.Count, 1).End(xlUp).Row
objHTTP.Open "GET", "https://api.coincap.io/v2/candles?exchange=" & .Cells(lngZeile, 1), False
objHTTP.Send
strAntwort = objHTTP.ResponseText
If InStr(strAntwort, "volume") Then
varSplit = Split(strAntwort, "volume"":""")
For i = 1 To UBound(varSplit)
.Cells(lngZeile, i + 1) = Left(varSplit(i), InStr(varSplit(i), """") - 1)
Next i
Else
.Cells(lngZeile, 2) = "Server antwortet nicht"
End If
Next lngZeile
End With
End Sub
cu
Chris
Anzeige
AW: VBA-JSON Werte aus zellen einfügen
06.01.2023 20:00:19
Matze
Vielen Dank, ich werde es ausprobieren, sobald es wieder geht. Der Server antwortet leider nur noch mit dem Timestamp und gibt keine Werte mehr raus. Ich werde mich wohl, was die API angeht umorientieren müssen (evtl. Cryptowatch). Mit Powerquery habe ich mich auseinandergesetzt. Da ich aber Werte abfragen möchte, für deren Abfrage veränderliche Parameter benötigt werden, habe ich mich für vba entschieden. Ich habe nämlich keine Möglichkeit gefunden, Parameter für eine Powerquery-Abfrage aus Zellen zu beziehen.
Anzeige
AW: VBA-JSON Werte aus zellen einfügen
07.01.2023 08:20:55
ChrisL
Hi Matze
Danke für die Rückmeldung.
N.b. in PQ kann man auch mit Parametern arbeiten. Wird zwar etwas komplizierter, aber dies ist VBA ja auch. Z.B. mal nach "dynamische Webabfrage" suchen und ein Video schauen.
cu
Chris
;
Anzeige
Anzeige

Infobox / Tutorial

VBA-JSON Werte aus Zellen einfügen


Schritt-für-Schritt-Anleitung

  1. VBA-Editor öffnen: Drücke ALT + F11, um den VBA-Editor zu öffnen.

  2. Modul erstellen: Klicke auf Einfügen > Modul, um ein neues Modul zu erstellen.

  3. Code einfügen: Kopiere den folgenden Code in das Modul:

    Sub GetVolume()
        Dim objHTTP As Object, lngZeile As Long, strAntwort As String
        Set objHTTP = CreateObject("MSXML2.XMLHTTP")
        With ThisWorkbook.Worksheets("Tabelle1")
            For lngZeile = 1 To .Cells(.Rows.Count, 1).End(xlUp).Row
                objHTTP.Open "GET", "https://api.coincap.io/v2/candles?exchange=" & .Cells(lngZeile, 1), False
                objHTTP.Send
                strAntwort = objHTTP.ResponseText
                If InStr(strAntwort, "volume") Then
                    strAntwort = Mid(strAntwort, InStr(strAntwort, "volume") + 9, 999)
                    strAntwort = Left(strAntwort, InStr(strAntwort, """") - 1)
                    .Cells(lngZeile, 2) = strAntwort
                Else
                    .Cells(lngZeile, 2) = "Server antwortet nicht"
                End If
            Next lngZeile
        End With
    End Sub
  4. Parameter anpassen: Stelle sicher, dass der Link korrekt ist und die Parameter aus den Zellen auf deinem Arbeitsblatt entnommen werden.

  5. Makro ausführen: Schließe den VBA-Editor und führe das Makro aus, indem du ALT + F8 drückst, das Makro wählst und auf Ausführen klickst.


Häufige Fehler und Lösungen

  • Fehler: "Ungültiger Prozedurausdruck oder ungültiges Argument": Stelle sicher, dass der API-Link korrekt ist und die Parameter richtig gesetzt sind. Überprüfe auch, ob die Verbindung zum Server funktioniert.
  • Fehler: "Server antwortet nicht": Dies kann an einer Überlastung des Servers liegen. Versuche es später erneut oder prüfe die API-Dokumentation auf Änderungen.
  • Fehler beim Zugriff auf Zellen: Achte darauf, dass die Zellen, von denen du die Werte abziehst, korrekt angegeben sind (z.B. Range("A1").Value).

Alternative Methoden

Falls du VBA nicht verwenden möchtest, kannst du auch Power Query für die Abfrage der API-Daten nutzen. Damit kannst du Parameter aus Zellen einbeziehen, ohne in den VBA-Editor zu gehen. Suche nach "Power-Query Webabfrage mit Parameter" für weitere Informationen.


Praktische Beispiele

Hier ist ein Beispiel, wie du mehrere Werte in einer Reihe anzeigen kannst:

Sub GetVolume()
    Dim objHTTP As Object, lngZeile As Long, strAntwort As String, varSplit As Variant, i As Integer
    Set objHTTP = CreateObject("MSXML2.XMLHTTP")
    With ThisWorkbook.Worksheets("Tabelle1")
        For lngZeile = 1 To .Cells(.Rows.Count, 1).End(xlUp).Row
            objHTTP.Open "GET", "https://api.coincap.io/v2/candles?exchange=" & .Cells(lngZeile, 1), False
            objHTTP.Send
            strAntwort = objHTTP.ResponseText
            If InStr(strAntwort, "volume") Then
                varSplit = Split(strAntwort, "volume"":""")
                For i = 1 To UBound(varSplit)
                    .Cells(lngZeile, i + 1) = Left(varSplit(i), InStr(varSplit(i), """") - 1)
                Next i
            Else
                .Cells(lngZeile, 2) = "Server antwortet nicht"
            End If
        Next lngZeile
    End With
End Sub

Tipps für Profis

  • Code sauber halten: Verwende sauberes Einrücken, um die Lesbarkeit deines Codes zu verbessern. Dies hilft dir, Fehler schneller zu finden.
  • Variable deklarieren: Aktiviere die Option für die Variabledeklaration in den VBA-Einstellungen. Dies verbessert die Codequalität und reduziert Fehler.
  • JSON-Parser verwenden: Für komplexe JSON-Datenstrukturen kann ein JSON-Parser für Excel nützlich sein, um die Daten effizient zu verarbeiten.

FAQ: Häufige Fragen

1. Frage
Wie kann ich Parameter für eine Power Query-Abfrage aus Zellen beziehen?
Antwort: In Power Query kannst du Parameter erstellen und diese mit Zellen im Arbeitsblatt verknüpfen. Suche nach "dynamische Webabfrage" für eine detaillierte Anleitung.

2. Frage
Welche Excel-Version benötige ich für die JSON-Abfragen?
Antwort: Die beschriebenen Methoden sollten in Excel 2010 und späteren Versionen funktionieren. Achte darauf, dass die Microsoft XML-Bibliotheken installiert sind.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige