Я бы использовал ту же конечную точку, которую использует страница для обновления тех значений, которые возвращают json. Затем используйте синтаксический анализатор json, чтобы извлечь нужные значения.
Я использую jsonconverter.bas - вы добавляете код из этой ссылки в модуль с именем JsonConverter, затем идете VBE> Инструменты> Ссылки> Добавить ссылку на Microsoft Scripting Runtime.
В VBA для json []
обозначает коллекцию, к которой обращается For Each
или по индексу, {}
представляет словарь, доступ к которому можно получить по ключу или через For Each
.
Я сохраняю результаты в массиве и записываю их за один раз для повышения эффективности. Вы можете написать в Activesheet.Cells(2,1)
и затем добавить заголовки, если хотите, в строку 1.
Вы можете посмотреть пример ответа json здесь .
Option Explicit
Public Sub GetPrices()
Dim s As String, json As Object, p As String
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", "https://www.betfair.com/www/sports/exchange/readonly/v1/bymarket?_ak=nzIFcwyWhrlwYMrh&alt=json¤cyCode=GBP&locale=en_GB&marketIds=1.157348157,1.157348529,1.157347785,1.157347909,1.157348405,1.157348653,1.157348281,1.157349025,1.159492425,1.157348777,1.157348033,1.157348901,1.157350197,1.157350445,1.157351280,1.157349949&rollupLimit=10&rollupModel=STAKE&types=MARKET_STATE,MARKET_RATES,MARKET_DESCRIPTION,EVENT,RUNNER_DESCRIPTION,RUNNER_STATE,RUNNER_EXCHANGE_PRICES_BEST,RUNNER_METADATA,MARKET_LICENCE,MARKET_LINE_RANGE_INFO", False
.send
s = .responseText
Set json = JsonConverter.ParseJson(s)
End With
Dim runners As Object, runner As Object, results(), r As Long
Set runners = json("eventTypes")(1)("eventNodes")
ReDim results(1 To runners.Count, 1 To 7)
For Each runner In runners
r = r + 1
results(r, 1) = runner("event")("eventName")
results(r, 2) = runner("marketNodes")(1)("runners")(1)("exchange")("availableToBack")(1)("price")
results(r, 3) = runner("marketNodes")(1)("runners")(1)("exchange")("availableToLay")(1)("price")
results(r, 4) = runner("marketNodes")(1)("runners")(3)("exchange")("availableToBack")(1)("price")
results(r, 5) = runner("marketNodes")(1)("runners")(3)("exchange")("availableToLay")(1)("price")
results(r, 6) = runner("marketNodes")(1)("runners")(2)("exchange")("availableToBack")(1)("price")
results(r, 7) = runner("marketNodes")(1)("runners")(2)("exchange")("availableToLay")(1)("price")
Next
ActiveSheet.Cells(1, 1).Resize(UBound(results, 1), UBound(results, 2)) = results
End Sub
Результаты:
