Сценарий: Я использую некоторые функции для получения данных с веб-сайта с помощью VBA. Эти функции в настоящее время считывают данные в файл JSON и при дальнейшей обработке вставляют их в лист.
Проблема: Необходимость каждый раз очищать и записывать в листы новый JSON извлекается препятствует выполнению кода.
Вопрос: Можно ли было бы проанализировать данные внутри объекта JSON непосредственно в массив Variant, чтобы любые операции с ним сделаны в памяти?
Что я уже пробовал: В продолжение некоторых онлайн-исследований я обнаружил Синтаксический анализ Json массива через VBA и http://excelerator.solutions/2017/08/16/import-json-to-excel-using-vba/ и некоторые другие страницы. Во всех этих случаях данные сначала анализируются в таблице или непосредственно в листе, но не в массиве. Я попытался изменить свою функцию, которая записывает JSON в лист, путем анализа таблицы, но для этого по-прежнему требуется мне нужно выполнить шаг «вставить на лист», прежде чем читать его в массив.
Функция, с которой я работаю: Когда я вызываю эту функцию, мой JSON файл уже получен и хранится в памяти. Кроме того, способ, которым это работает, заключается в итеративном разборе каждого смещения, которое будет эквивалентно строкам массива. Моя идея состояла в том, чтобы вообще пропустить это, так как непосредственно разбираем jSON .:
Public Sub WriteJsonToSheet(s As Worksheet, j As JSON, Optional ByVal fields As Variant, Optional rowOffset As Long = 0)
If (rowOffset = 0) Then
Dim loopvar1 As Long, loopvar2 As Long
With s.UsedRange
.ClearFormats
.ClearContents
.ClearComments
.ClearHyperlinks
.ClearOutline
.ClearNotes
End With 's.UsedRange.Clear
End If
If j.count = 0 Then Exit Sub
' get the list of all the fields in the -first- record
If IsMissing(fields) Then
fields = j.item("0.$").GetKeys("$.")
End If
' create a table and write to the spreadsheet
If (rowOffset = 0) Then
WriteRowToRange s.Cells(1, 1), fields
s.rows(1).AutoFilter
s.rows(1).Font.Bold = True
End If
' this is part of the original function, to paste to a worksheet
If (j.count > 0) Then
'Dim table As Variant
table = JsonArrayToTable(j, fields)
WriteTableToRange s.Cells(2 + rowOffset, 1), table
End If
End Sub
Я создал это, чтобы добавить в свой код, но код просто пропускает эту часть, и никаких действий не происходит:
' This is my attempt to past it directly to an array
Dim table As Variant
table = JsonArrayToTable(j)
For loopvar1 = 0 To UBound(table, 2)
'For loopvar2 = 1 To UBound(table, 2)
TEST.Cells(1, loopvar1 + 1) = table(0, loopvar1)
'Next loopvar2
Next loopvar1
OBS. Данные в JSON могут сильно различаться, поэтому идея заключалась в создании общей функции, которая могла бы передавать JSON в массив. В этом случае примером данных может быть (внутри моего кода это JSON извлекается для нескольких идентификаторов. Каждый раз, когда один извлекается, он вставляется в новую строку выходного листа):
{
"Response": {
"dm": [
{
"$": {
"id": ""830778192",
"end_period": ""2023-10-25T00:00:00",
"end_period1": "2021-01-25T00:00:00",
}
}
]
}
}