VBAでJSON形式のデータを扱うに便利なVBA-JSON

JSONそのものが大事と言うよりAPIを使うためにJSONが必要だから覚えた

多分EXCELを使っていてAPI以外にJSONに出会うことないんじゃないかな

EXCEL脳の人へのざっくりJSON解説

例えばこんなJSON形式のデータがあるとして

[{"名前":"ジャベ雄","生年月日":{"年":2000,"月":1,"日":1},"身長":180,"体重":70,"好きな食べ物":["肉","野菜"],"眼鏡":true},{"名前":"ジャベ雌","生年月日":{"年":2002,"月":2,"日":2},"身長":150,"体重":null,"好きな食べ物":["甘いもの"],"眼鏡":false}]

よく見るわかりやすい形にすると

[
    {
        "名前": "ジャベ雄",
        "生年月日": {
            "年":2000,
            "月":1,
            "日":1
        },
        "身長":180,
        "体重":70,
        "好きな食べ物":["肉","野菜"],
        "眼鏡":true
    },
    {
        "名前": "ジャベ雌",
        "生年月日": {
            "年": 2002,
            "月": 2,
            "日": 2
        },
        "身長": 150,
        "体重": null,
        "好きな食べ物": ["甘いもの"],
        "眼鏡":false
    }   
]

これをEXCEL的に表にするとこうなる

名前 生年月日 身長 体重 好きな食べ物 眼鏡
ジャベ雄 2001 1 1 180 70 野菜
ジャベ雌 2002 2 2 150 甘いもの ×

つまりJSONをざっくり説明すると必ず項目と値が対になっていて、『{}』が階層を『[]』は配列のデータ郡になっている表だと思えばOK

もう一つ理解しておく必要があるのが下に簡単にまとめているお作法

他にも細かな点はいくつかあるけどもWEB系を本格的にやる時に勉強すればいいと思う

JSONのお作法

  • 項目は必ず””(ダブルクォーテーション)で囲む
  • 文字列は必ず””(ダブルクォーテーション)で囲む
  • 数値は小数点型を含めてそのまま表記
  • 真偽値(Boolean)は「true、false」のどちらか ※小文字、””は付けない
  • Null値は「null」 ※小文字、””は付けない
  • 『[]』の配列内も上記と同じルール

VBA用のライブラリ「VBA-JSON」を入手

GitHubに公開されているのでダウンロードして「JsonConverter.bas」をVBEの画面でインポートするだけ

GitHub - VBA-tools/VBA-JSON: JSON conversion and parsing for VBA
JSON conversion and parsing for VBA. Contribute to VBA-tools/VBA-JSON development by creating an account on GitHub.

プロジェクトエクスプローラー
右クリック→「ファイルのインポート」

もしくは「JsonConverter.bas」をプロジェクトエクスプローラーへドラック&ドロップでもインポートできる

VBA-JSONの使い方

まずはサンプルソース

今回はAPIの説明ではなくVBA-JSONの説明なので細かな話は割愛
とは言え、実際にAPIを叩ソースをちょっと弄っただけなんでそれっぽい感じに

Sub Sample()
Dim url As String
Dim http As MSXML2.XMLHTTP60
Dim params As Scripting.Dictionary
Set http = New MSXML2.XMLHTTP60
Set params = New Scripting.Dictionary
With params
    .RemoveAll
    .Add "apiKey", "sampleapi"
End With
url = "https://example.com?" & encodeParams(params)
With http
    .Open "GET", url, False
    .send
    Set res = ParseJson(.responseText)
    For Each obj In res
        Debug.Print obj("名前")
    Next
    Set res = Nothing
End With
End Sub
Private Function encodeParams(ByVal objDic As Scripting.Dictionary)
Dim arr() As String
Dim i As Long
ReDim arr(objDic.Count - 1) As String
For i = 0 To pDic.Count - 1
    arr(i) = objDic.Keys(i) & "=" & Application.WorksheetFunction.EncodeURL(objDic.Items(i))
Next i
encodeParams = Join(arr, "&")
End Function

結局VBA-JSONを使ってる箇所はこの一行だけ

Set res = ParseJson(.responseText)

でもこの一行がないと一番最初のただの長い文字になってしまうところをこんな感じで要素を指定してデータを取り出すことができる

Debug.Print obj("名前") '---ジャベ雄
Debug.Print obj("生年月日")("年") '---2001
Debug.Print obj("好きな食べ物")(0) '---肉

あとがき

JSONの話だけしてもあまり伝わらない気もしますがAPIを利用する前知識と言うか前準備として必要なんで存在を知っておくだけでも違うと思う

実際のAPIの話は何か参考例見つけた時に説明しようかと思います

コメント

タイトルとURLをコピーしました