我已经从数据库中提取了以下内容:
[{“ identifier”:{“ strategyType”:“ element1”},“ elnSchedules”:[{“ paymentDate”:[“ element2”,“ element2”]},{“ paymentDate”:[“ element2”, “ element2”]}],“ composition”:{“ components”:[{“ instrument”:{“ exerciseType”:[“ element3”,“ element3”]}}},{“ instrument”:{“ exerciseType”:[ “ element3”,“ element3”]}}]},“链接”:[]}]
我想构建一个vba并在excel中创建一个表,该表的标题为:strategyType,paymentDate,exerciseType
和元素:相应标题下的element1,element2,element3(而每个元素只能出现一次)。
到目前为止,我有: 对于i = 1到jsonO.Count '设置标题 如果i = 1那么 j = 1 对于jsonO(i).Keys()中的每个StrKey activeWS.Cells(i + offset,j)= StrKey j = j + 1 下一个 如果结束
j = 1
For Each StrKey In jsonO(i).Keys()
If (StrKey <> "links") Then
activeWS.Cells(i + offset + 1, j) = jsonO(i)(StrKey)
j = j + 1
End If
Next
但这仅提取标识符,电子时间表和组成,而无法进入特定元素。
有什么办法吗?
谢谢。
-------------------新问题----------------------
我使用了答案中发布的内容,并试图在答案中发布的功能下构建新功能(而这两个功能均由主功能调用):
公共子GetEndDate()
Dim activeWS As Worksheet
Set activeWS = ThisWorkbook.Worksheets("Data")
Dim jsonStr As String, Json As Object, headers()
'headers = Array("strategyType", "paymentDate", "exerciseType")
jsonStr = [{"optionFeatures":{"Strike Setting":[{"endDate":["2018-10-16"]}]},"links":[]}] '<== read from cell
Set Json = JsonConverter.ParseJson(jsonStr)(1)
activeWS.Cells(1, 13) = Json("optionFeatures")("Strike Setting")("endDate")
结束子
但是它无法从字符串中读取,还是我需要再次重置lib?
谢谢。
答案 0 :(得分:1)
使用JSONConverter.bas解析从单元格读取的JSON字符串,如下所示。假设您只需要每个值的一个实例。
注意:
添加JSONConverter.bas后,您需要转到VBE>工具>引用>添加对Microsoft脚本运行时的引用。
您的JSON结构如下:
[]
表示一个集合,通过索引从1开始对项目进行访问。{}
表示具有通过键访问的项目的字典。
我使用适当的语法遍历树以检索每个元素的首次出现。
Option Explicit
Public Sub GetInfoFromSheet()
Dim jsonStr As String, Json As Object, headers()
headers = Array("strategyType", "paymentDate", "exerciseType")
jsonStr = [A1] '<== read from cell
Set Json = JsonConverter.ParseJson(jsonStr)(1)
With ThisWorkbook.Worksheets("Sheet1")
.Cells(1, 1).Resize(1, UBound(headers) + 1) = headers
.Cells(2, 1) = Json("identifier")("strategyType")
.Cells(2, 2) = Json("elnSchedules")(1)("paymentDate")(1)
.Cells(2, 3) = Json("composition")("components")(1)("instrument")("exerciseType")(1)
End With
End Sub