После стольких часов я мог бы настроить его так
Const strUrl As String = "https://www.reuters.com/companies/api/getFetchCompanyFinancials/"
Sub GetData()
Dim ws As Worksheet, sSection As String
For Each ws In ThisWorkbook.Worksheets(Array("IS", "BS", "CF"))
Select Case ws.Name
Case "IS": sSection = "income"
Case "BS": sSection = "balance_sheet"
Case "CF": sSection = "cash_flow"
End Select
GetReuters ws, "tbl" & ws.Name, Sheets("Data").Range("B1").Value, sSection, Sheets("Data").Range("B2").Value
Next ws
End Sub
Sub GetReuters(ByVal ws As Worksheet, ByVal tblName As String, ByVal sTicker As String, ByVal sSection As String, ByVal sTime As String)
Dim a, ky, col As Collection, json As Object, data As Object, dic As Object, rng As Range, i As Long, k As Long, c As Long
With CreateObject("MSXML2.ServerXMLHTTP.6.0")
.Open "GET", strUrl & sTicker
.send
Set json = JSONConverter.ParseJson(.responseText)
End With
ReDim b(1 To 10000, 1 To 7)
c = 1: b(1, c) = "Dates"
Set data = json("market_data")("financial_statements")(sSection)(sTime)
Set dic = CreateObject("Scripting.Dictionary")
dic.CompareMode = 1
For Each ky In data.Keys
Set col = data(ky)
a = CollectionToArray(col)
k = k + 1
b(k + 1, 1) = ky
For i = LBound(a) To UBound(a)
If Not dic.Exists(CStr(a(i, 1))) Then
dic(CStr(a(i, 1))) = c
c = c + 1
b(1, c) = CStr(a(i, 1))
b(k + 1, c) = a(i, 2)
Else
b(k + 1, dic.item(CStr(a(i, 1))) + 1) = a(i, 2)
End If
Next i
Erase a
Next ky
Application.ScreenUpdating = False
With ws
On Error Resume Next
.ListObjects(tblName).Delete
On Error GoTo 0
.Range("A1").Resize(k + 1, UBound(b, 2)).Value = b
With .Range("A1").CurrentRegion
Set rng = .Offset(1, 1).Resize(.Rows.Count - 1, .Columns.Count - 1)
rng.NumberFormat = "#,##0.00;(#,##0.00)"
rng.Rows(1).Offset(-1).NumberFormat = "dd-mmm-yy"
.Columns.AutoFit
End With
.ListObjects.Add(xlSrcRange, .Range("A1").CurrentRegion, , xlYes).Name = tblName
End With
Application.ScreenUpdating = True
End Sub
Function CollectionToArray(ByVal c As Collection) As Variant()
Dim a(), i As Long
ReDim a(1 To c.Count, 1 To 2)
For i = 1 To c.Count
a(i, 1) = c.item(i)("date")
a(i, 2) = c.item(i)("value")
Next i
CollectionToArray = a
End Function