【VBA】VBA-JSONのインストール方法と簡単な使い方

本ページはプロモーションが含まれています

VBAでAPIを使ったツールを作成することになりましてJSONでのやり取りが必要になったのですが、そのためにはVBA-JSONが便利だよってことで使い方と超ざっくりJSONの説明をまとめました

まずざっくりJSON解説

そもそもJSONとは何ぞや?と言われるとデータフォーマット(データの記述形式)の一種です

EXCELをよく利用する方々に身近なデータフォーマットはCSVで、特徴(ルール)を簡単にまとめると

  • データが「,」(カンマ)で区切られていている
  • 「”」(ダブルクォーテーション)を囲い文字としてその中では「,」は区切りとしない
  • 「”」を2つ連続させると囲い文字としない(エスケープ)

じゃあJSONはどうなのかと言えば

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

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

JSONデータのサンプル

CSVほど一見でわかる形式ではないのでサンプルと共に見方の説明になります

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

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

よく見るわかりやすい形にすると・・・ ※簡単に変換できるVSCode神です

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

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

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

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

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

ここから実際にVBAで利用する「VBA-JSON」なるモジュールについて

GitHubに公開されているのでダウンロードして「JsonConverter.bas」をダウンロードする

何年も更新されてませんが何の問題もないので気にせずに

https://github.com/VBA-tools/VBA-JSON

VBAで使えるようにするにはVBEの画面でインポートするだけ

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

もしくは「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の話は何か参考例見つけた時に説明しようかと思います

コメント

  1. TK より:

    お世話になります。
    パース後のjson処理で、連想配列に
    name | 眼鏡
    名前 | ○×

    という形に格納することはできますか?

    • ジャベ雄 より:

      ニュアンスが掴み切れていないのですが通例”キー:値”の形にパースされるはずです。
      差し支えなければパース前後のデータサンプル記載してもらえると判断できる気がします。

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