【问题标题】:Write data from JSON to Excel using VBA使用 VBA 将数据从 JSON 写入 Excel
【发布时间】:2021-08-28 04:54:48
【问题描述】:

我尝试使用 VBA 将 JSON 数据从 API 提取到 Excel 表中。
我已经安装了 VBA-JSON 并打开了Microsoft Scripting Runtime

json 请求传递:

[
  {
    "Itemcode": "6FSTGWD40",
    "DeliveryTimeInDays": 999,
    "PalletQuantity": 12,
    "Description": "Fiberstone",
    "ItemDescription_NL": "Fiberstone",
    "ItemStatus": "E",
    "SalesPackage_NL": "Stuks   ",
    "SalesPackage_DE": "Stück",
    "SalesPackage_EN": "Unit",
    "SalesPackage_FR": "Pièce",
    "Salesprice": 132,
    "MainGroupCode": "200",
    "MainGroupDescription_NL": "Hardware",
    "MainGroupDescription_DE": "Hardware",
    "MainGroupDescription_EN": "Hardware",
    "MainGroupDescription_FR": "Hardware",
    "ProductGroupCode": "300",
    "ProductGroupDescription_NL": "Plantenbakken",
    "ProductGroupDescription_DE": "Gefässe",
    "ProductGroupDescription_EN": "Planters",
    "ProductGroupDescription_FR": "Bacs",
    "GroupDescription": "FSTC",
    "GroupDescription_NL": "Pottery Pots Fiberstone",
    "GroupDescription_DE": "Pottery Pots Fiberstone",
    "GroupDescription_EN": "Pottery Pots Fiberstone",
    "GroupDescription_FR": "Pottery Pots Fiberstone",
    "MaterialGroupCode": "500",
    "MaterialGroupDescription_NL": "Composiet",
    "MaterialGroupDescription_DE": "Verbundwerkstoff",
    "MaterialGroupDescription_EN": "Composite",
    "MaterialGroupDescription_FR": "Matériau composite",
    "ItemDescription_EN": "Fiberstone",
    "ItemDescription_DE": "Fiberstone",
    "ItemDescription_FR": "Fiberstone",
    "GTINCode": "8717775668411",
    "IsStockItem": true,
    "Warehouse": "A",
    "ItemVariety_NL": "Dice XL Glossy White",
    "ItemVariety_DE": "Dice XL Glossy White",
    "ItemVariety_EN": "Dice XL Glossy White",
    "ItemVariety_FR": "Dice XL Glossy White",
    "PotSize": null,
    "ItemPictureName": "6FSTGWD40.png",
    "ItemPictureSysmodified": "2019-03-04T11:51:24",
    "Content_Ltr": null,
    "PlantPassportCode": null,
    "Diameter": 46,
    "Length": 0,
    "Width": 0,
    "Height": 60,
    "Depth": 59,
    "Opening": 36,
    "IsOffer": false,
    "ShowOnWebsite": false,
    "Sysmodified": "2021-07-13T07:38:08.853",
    "SalesOrderSize": 1,
    "Tags": [
      {
        "Code": "Brand",
        "Values": [
          {
            "Description_NL": "Pottery Pots",
            "Description_DE": "Pottery Pots",
            "Description_EN": "Pottery Pots",
            "Description_FR": "Pottery Pots"
          }
        ]
      },
      {
        "Code": "Collection",
        "Values": [
          {
            "Description_NL": "Essential",
            "Description_DE": "Essential",
            "Description_EN": "Essential",
            "Description_FR": "Essential"
          }
        ]
      },
      {
        "Code": "ColourPlanter",
        "Values": [
          {
            "Description_NL": "Wit",
            "Description_DE": "Weiß",
            "Description_EN": "White",
            "Description_FR": "Blanche"
          }
        ]
      },
      {
        "Code": "Finish",
        "Values": [
          {
            "Description_NL": "Hoogglans",
            "Description_DE": "Hochglanz",
            "Description_EN": "High gloss",
            "Description_FR": "Brillant"
          }
        ]
      },
      {
        "Code": "Location",
        "Values": [
          {
            "Description_NL": "Buiten",
            "Description_DE": "Draußen",
            "Description_EN": "Outdoor",
            "Description_FR": "Extérieur"
          },
          {
            "Description_NL": "Binnen",
            "Description_DE": "Innen",
            "Description_EN": "Indoor",
            "Description_FR": "Intérieur"
          }
        ]
      },
      {
        "Code": "Material",
        "Values": [
          {
            "Description_NL": "Fiberstone",
            "Description_DE": "Fiberstone",
            "Description_EN": "Fiberstone",
            "Description_FR": "Fiberstone"
          }
        ]
      },
      {
        "Code": "MaterialProperties",
        "Values": [
          {
            "Description_NL": "Handgemaakt",
            "Description_DE": "Handgefertigt",
            "Description_EN": "Handmade",
            "Description_FR": "Fait à la main"
          }
        ]
      },
      {
        "Code": "Serie",
        "Values": [
          {
            "Description_NL": "Fiberstone",
            "Description_DE": "Fiberstone",
            "Description_EN": "Fiberstone",
            "Description_FR": "Fiberstone"
          }
        ]
      },
      {
        "Code": "Shape",
        "Values": [
          {
            "Description_NL": "Cylinder",
            "Description_DE": "Cylinder",
            "Description_EN": "Cylinder",
            "Description_FR": "Cylinder"
          }
        ]
      },
      {
        "Code": "Structure",
        "Values": [
          {
            "Description_NL": "Egaal",
            "Description_DE": "Glatt",
            "Description_EN": "Smooth",
            "Description_FR": "Lisse"
          }
        ]
      }
    ]
  },
{
    "Itemcode": "8EE425140",
    "DeliveryTimeInDays": 2,
    "PalletQuantity": 288,
    "Description": "Begonia maculata",
    "ItemDescription_NL": "Begonia maculata",
    "ItemStatus": "A",
    "SalesPackage_NL": "Stuks   ",
    "SalesPackage_DE": "Stück",
    "SalesPackage_EN": "Unit",
    "SalesPackage_FR": "Pièce",
    "Salesprice": 8.45,
    "MainGroupCode": "200",
    "MainGroupDescription_NL": "Hardware",
    "MainGroupDescription_DE": "Hardware",
    "MainGroupDescription_EN": "Hardware",
    "MainGroupDescription_FR": "Hardware",
    "ProductGroupCode": "600",
    "ProductGroupDescription_NL": "Artificial ",
    "ProductGroupDescription_DE": "Artificial ",
    "ProductGroupDescription_EN": "Artificial ",
    "ProductGroupDescription_FR": "Artificielle",
    "GroupDescription": "KUC",
    "GroupDescription_NL": "Artificial decoration",
    "GroupDescription_DE": "Artificial Dekoration",
    "GroupDescription_EN": "Artificial decoration",
    "GroupDescription_FR": "Décoration artificielles",
    "MaterialGroupCode": null,
    "MaterialGroupDescription_NL": null,
    "MaterialGroupDescription_DE": null,
    "MaterialGroupDescription_EN": null,
    "MaterialGroupDescription_FR": null,
    "ItemDescription_EN": "Begonia maculata",
    "ItemDescription_DE": "Begonia maculata",
    "ItemDescription_FR": "Begonia maculata",
    "GTINCode": "8714344320619",
    "IsStockItem": true,
    "Warehouse": "A",
    "ItemVariety_NL": "Tak",
    "ItemVariety_DE": "Zweig",
    "ItemVariety_EN": "Branch",
    "ItemVariety_FR": "Branche",
    "PotSize": "0",
    "ItemPictureName": "8EE425140.png",
    "ItemPictureSysmodified": "2020-02-11T08:57:17",
    "Content_Ltr": null,
    "PlantPassportCode": null,
    "Diameter": 0,
    "Length": 0,
    "Width": 0,
    "Height": 120,
    "Depth": 0,
    "Opening": 0,
    "IsOffer": false,
    "ShowOnWebsite": true,
    "Sysmodified": "2021-07-06T07:38:14.623",
    "SalesOrderSize": 1,
    "Tags": [
      {
        "Code": "ArtificialGroup",
        "Values": [
          {
            "Description_NL": "Overig",
            "Description_DE": "Andere",
            "Description_EN": "Other",
            "Description_FR": "Autres"
          }
        ]
      },
      {
        "Code": "ArtificialType",
        "Values": [
          {
            "Description_NL": "Tak",
            "Description_DE": "Ast",
            "Description_EN": "Branch",
            "Description_FR": "Branche"
          }
        ]
      },
      {
        "Code": "ArtificialVariety",
        "Values": [
          {
            "Description_NL": "Planten",
            "Description_DE": "Pflanzen",
            "Description_EN": "plants-artificial",
            "Description_FR": "Plantes"
          }
        ]
      }
    ]
  }
]

使用以下代码,我可以在特定的 Excel 单元格中编写 ItemcodeDeliveryTimeInDaysPalletQuantity 等项目。

我无法在 Excel 单元格中使用“代码”和“值”编写“标签”。

Sub test_json()
' dieses makro ist der startpunkt: einholen von aid, ean etc. dieses makro ruft eine liste aller artikel mit status ab.
Worksheets("test").Range("a1:zz100000").ClearContents
Dim ws As Worksheet, jsonObject As Object, jsonText As String, i As Long, http As Object
    i = 3
    'requesturl = "https://customerapi_dev.nieuwkoop-europe.com/items?sysmodified=2000-01-01"
     requesturl = "https://customerapi_dev.nieuwkoop-europe.com/items?sysmodified=2021-02-11&itemCode=6PPNLBO80"
        Set http = CreateObject("MSXML2.XMLHTTP")
        http.Open "GET", requesturl, False
        http.send
        
        Set jsonObject = JsonConverter.ParseJson(http.responseText)

Worksheets("test").Cells(1, 1).Value = "Itemcode"
Worksheets("test").Cells(1, 2).Value = "DeliveryTimeInDays"
Worksheets("test").Cells(1, 3).Value = "PalletQuantity"

For Each Item In jsonObject
Worksheets("test").Cells(i, 1).Value = Item("Itemcode")
Worksheets("test").Cells(i, 2).Value = Item("DeliveryTimeInDays")
Worksheets("test").Cells(i, 3).Value = Item("PalletQuantity")

i = i + 1
Next Item
    
End Sub

我尝试了如下循环代码,但总是出错。

For Each Item In jsonObject ("Tags")("Code")("Values")
Worksheets("test").Cells(i, 5).Value = Item("Description_NL")
Worksheets("test").Cells(i, 6).Value = Item("Description_DE")
Worksheets("test").Cells(i, 7).Value = Item("Description_FR")

i = i + 1
Next Item

如何将 JSON 文件中的“标签”数据(例如“代码”和 Description_NL 等值)写入 Excel 单元格中?

【问题讨论】:

    标签: json excel vba


    【解决方案1】:

    Values 是一个数组(解析成一个集合)所以你想要tag("Values")(n)

     Dim item, tag, n as Long
        For Each item In jsonObject
            For Each tag In item("Tags")
                For n = 1 to tag("Values").Count
                    Debug.Print tag("Values")(n)("Description_NL")
                Next
            Next
        Next item
    

    交替迭代对象

        Dim item, tag, val
        For Each item In jsonObject
            For Each tag In item("Tags")
                For Each val In tag("Values")
                    Debug.Print item("Itemcode"), tag("Code"), val("Description_NL")
                Next
            Next
        Next item
    

    【讨论】:

    • 有些但不是所有项目在 Values 数组中的元素超过 1 个:{ "Code": "Location", "Values": [ { "Description_NL": "Buiten", "Description_DE": " Draußen”、“Description_EN”:“室外”、“Description_FR”:“Extérieur”}、{ “Description_NL”:“Binnen”、“Description_DE”:“Innen”、“Description_EN”:“室内”、“Description_FR”:“ Intérieur" } 在这些情况下我该怎么办?写 tag("Values")(2)("Description_NL") 不起作用。
    • @phil 抱歉错过了位置,请参阅更新(未经测试)
    【解决方案2】:

    在 CDP1802 的第一条评论之后,我编写了另一个 for each 循环,它工作正常:

    Sub getactivearticleswithstatus()
    
    Dim ws As Worksheet, jsonObject As Object, jsonText As String, i As Long, http As Object
    Dim item, tag, eigenschaft
    Dim j, m
    
    
    i = 3
       requesturl="..."
            Set http = CreateObject("MSXML2.XMLHTTP")
            http.Open "GET", requesturl, False
            http.send
            
            Set jsonObject = JsonConverter.ParseJson(http.responseText)
    
    
    For Each item In jsonObject
            Worksheets("daten-api").Cells(i, 1).value = item("Itemcode")
            Worksheets("daten-api").Cells(i, 2).value = item("DeliveryTimeInDays")
            Worksheets("daten-api").Cells(i, 3).value = item("PalletQuantity")
            Worksheets("daten-api").Cells(i, 4).value = item("Description")
            Worksheets("daten-api").Cells(i, 5).value = item("ItemDescription_NL")
            Worksheets("daten-api").Cells(i, 6).value = item("ItemStatus")
            Worksheets("daten-api").Cells(i, 7).value = item("SalesPackage_NL")
            Worksheets("daten-api").Cells(i, 8).value = item("SalesPackage_DE")
            Worksheets("daten-api").Cells(i, 9).value = item("SalesPackage_EN")
            Worksheets("daten-api").Cells(i, 10).value = item("SalesPackage_FR")
            Worksheets("daten-api").Cells(i, 11).value = item("Salesprice")
            Worksheets("daten-api").Cells(i, 12).value = item("MainGroupCode")
            Worksheets("daten-api").Cells(i, 13).value = item("MainGroupDescription_NL")
            Worksheets("daten-api").Cells(i, 14).value = item("MainGroupDescription_DE")
            Worksheets("daten-api").Cells(i, 15).value = item("MainGroupDescription_EN")
            Worksheets("daten-api").Cells(i, 16).value = item("MainGroupDescription_FR")
            Worksheets("daten-api").Cells(i, 17).value = item("ProductGroupCode")
            Worksheets("daten-api").Cells(i, 18).value = item("ProductGroupDescription_NL")
            Worksheets("daten-api").Cells(i, 19).value = item("ProductGroupDescription_DE")
            Worksheets("daten-api").Cells(i, 20).value = item("ProductGroupDescription_EN")
            Worksheets("daten-api").Cells(i, 21).value = item("ProductGroupDescription_FR")
            Worksheets("daten-api").Cells(i, 22).value = item("GroupDescription")
            Worksheets("daten-api").Cells(i, 23).value = item("GroupDescription_NL")
            Worksheets("daten-api").Cells(i, 24).value = item("GroupDescription_DE")
            Worksheets("daten-api").Cells(i, 25).value = item("GroupDescription_EN")
            Worksheets("daten-api").Cells(i, 26).value = item("GroupDescription_FR")
            Worksheets("daten-api").Cells(i, 27).value = item("MaterialGroupCode")
            Worksheets("daten-api").Cells(i, 28).value = item("MaterialGroupDescription_NL")
            Worksheets("daten-api").Cells(i, 29).value = item("MaterialGroupDescription_DE")
            Worksheets("daten-api").Cells(i, 30).value = item("MaterialGroupDescription_EN")
            Worksheets("daten-api").Cells(i, 31).value = item("MaterialGroupDescription_FR")
            Worksheets("daten-api").Cells(i, 32).value = item("ItemDescription_EN")
            Worksheets("daten-api").Cells(i, 33).value = item("ItemDescription_DE")
            Worksheets("daten-api").Cells(i, 34).value = item("ItemDescription_FR")
            Worksheets("daten-api").Cells(i, 35).value = item("GTINCode")
            Worksheets("daten-api").Cells(i, 36).value = item("IsStockItem")
            Worksheets("daten-api").Cells(i, 37).value = item("Warehouse")
            Worksheets("daten-api").Cells(i, 38).value = item("ItemVariety_NL")
            Worksheets("daten-api").Cells(i, 39).value = item("ItemVariety_DE")
            Worksheets("daten-api").Cells(i, 40).value = item("ItemVariety_EN")
            Worksheets("daten-api").Cells(i, 41).value = item("ItemVariety_FR")
            Worksheets("daten-api").Cells(i, 42).value = item("PotSize")
            Worksheets("daten-api").Cells(i, 43).value = item("ItemPictureName")
            Worksheets("daten-api").Cells(i, 44).value = item("ItemPictureSysmodified")
            Worksheets("daten-api").Cells(i, 45).value = item("Content_Ltr")
            Worksheets("daten-api").Cells(i, 46).value = item("PlantPassportCode")
            Worksheets("daten-api").Cells(i, 47).value = item("Diameter")
            Worksheets("daten-api").Cells(i, 48).value = item("Length")
            Worksheets("daten-api").Cells(i, 49).value = item("Width")
            Worksheets("daten-api").Cells(i, 50).value = item("Height")
            Worksheets("daten-api").Cells(i, 51).value = item("Depth")
            Worksheets("daten-api").Cells(i, 52).value = item("Opening")
            Worksheets("daten-api").Cells(i, 53).value = item("IsOffer")
            Worksheets("daten-api").Cells(i, 54).value = item("ShowOnWebsite")
            Worksheets("daten-api").Cells(i, 55).value = item("Sysmodified")
            Worksheets("daten-api").Cells(i, 56).value = item("SalesOrderSize")
            
            
            
            k = 0
            
            For Each tag In item("Tags")
            
                For Each eigenschaft In tag("Values")
                
                Worksheets("daten-api").Cells(i, 60 + k).value = tag("Code")
                    Worksheets("daten-api").Cells(i, 61 + k).value = eigenschaft("Description_DE")
                    Worksheets("daten-api").Cells(i, 62 + k).value = eigenschaft("Description_NL")
                    Worksheets("daten-api").Cells(i, 63 + k).value = eigenschaft("Description_EN")
                    Worksheets("daten-api").Cells(i, 64 + k).value = eigenschaft("Description_FR")
                    'Worksheets("daten-api").Cells(i, 61 + k).value = tag("Values")(1)("Description_DE")
                    k = k + 5
                    
                Next
            
            Next tag
               
            i = i + 1
    Next item
      
    End Sub
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-18
      • 2015-09-17
      • 2017-07-07
      相关资源
      最近更新 更多