VBAでJSONを扱いたいけれど、どうすればいいか分からない…そんな悩みを解決します!この記事では、外部ライブラリ「VBA-JSON」を使って、VBAで手軽にJSONデータを操る方法を、初心者にも分かりやすく解説します。
そもそもJSONって何?
JSON(JavaScript Object Notation)は、テキストベースのデータ交換フォーマットです。Web APIからデータを取得する際など、様々な場面で利用されています。
JSONの基本構造と記述ルール
「<key>: <value>」
の形式が基本で、複数のデータを {}
で囲んで「オブジェクト」として、また、順序のあるデータのリストを []
で囲んで「配列」として表現します。軽量で人間にも機械にも読みやすいのが特徴です。
他にも細かな点はいくつかありますが、本格的に覚えるならWEB系をやる時で大丈夫かと。
JSONデータのサンプル
CSVほど一見でわかる形式ではないのでサンプルと共に見方の説明になります
例えばこんなJSON形式のデータがあるとして
[{"name":"Javeo","birthdate":{"year":2000,"month":1,"day":1},"height":180,"weight":70,"favorite_foods":["Meat","Vegetables"],"glasses":true},{"name":"Javelin","birthdate":{"year":2002,"month":2,"day":2},"height":150,"weight":null,"favorite_foods":["Sweets"],"glasses":false}]
よく見るわかりやすい形にすると・・・※VSCodeなどツールを使えば簡単に変換できます
[
{
"name": "Javeo",
"birthdate": {
"year": 2000,
"month": 1,
"day": 1
},
"height": 180,
"weight": 70,
"favorite_foods": [
"Meat",
"Vegetables"
],
"glasses": true
},
{
"name": "Javelin",
"birthdate": {
"year": 2002,
"month": 2,
"day": 2
},
"height": 150,
"weight": null,
"favorite_foods": [
"Sweets"
],
"glasses": false
}
]
これをEXCEL的に表にするとこうなります
name | birthdate | height | weight | favorite_foods | glasses | |||
year | month | day | ||||||
Javeo | 2001 | 1 | 1 | 180 | 70 | Meat | Vegetables | true |
Javelin | 2002 | 2 | 2 | 150 | Sweets | false |
つまりJSONをざっくり説明すると必ず項目と値が対になっていて、『{}』が階層を『[]』は配列のデータ群になっていると思えばOK
VBAでJSONを扱う準備をしよう!
VBAには標準でJSONを扱う機能がないため、オープンソースのライブラリ「VBA-JSON」を導入します。
「VBA-JSON」の導入手順
導入までは3STEPで完了します
- STEP1ライブラリのダウンロード
GitHubのVBA-tools/VBA-JSONリポジトリにアクセス
- STEP2ファイルを探す
ページ内にある「
JsonConverter.bas
」をダウンロード※何年も更新されてませんが文字列を分解するプログラムで特に改良点もないってことだけなので気にせず
- STEP3
VBAでJSONを解析(パース)してみよう
JSON形式のテキストデータをVBAで扱えるデータ構造(DictionaryオブジェクトやCollectionオブジェクト)に変換することを「解析(パース)」と言います
JsonConverter
モジュールにある ParseJson
関数を使えば、この処理が一行で完了します
ということでサンプルコードを
' /// 事前準備 ///
' VBEの [ツール] > [参照設定] から下記2つにチェックを入れてください
' 1. Microsoft ActiveX Data Objects 6.1 Library (バージョンは環境により異なります)
' 2. Microsoft XML, v6.0
Sub GetJsonData()
Dim http As MSXML2.XMLHTTP60
Dim jsonText As String
Dim parsedData As Object ' 解析後のデータ格納用
' Web APIからJSONデータを取得(例)
Set http = CreateObject("MSXML2.XMLHTTP")
http.Open "GET", "https://javeo.jp/wp-json/test/v1/data", False
http.send
jsonText = http.responseText
' ★★★ ここがポイント!JSONを解析 ★★★
Set parsedData = ParseJson(jsonText)
' 解析したデータをデバッグ出力
Debug.Print "名前: " & parsedData(1)("name")
Debug.Print "体重: " & parsedData(1)("height")
' 配列のデータを取り出す
Set http = Nothing
Set parsedData = Nothing
End Sub
結局VBA-JSONを使ってる箇所はこの一行だけ
Set res = ParseJson(.responseText)
でもこの一行がないと一番最初のただの長い文字になってしまうところをこんな感じで要素を指定してデータを取り出すことができます
VBAオブジェクトをJSON文字列に変換(生成)
逆に、VBAのDictionaryオブジェクトやCollectionオブジェクトからJSON形式の文字列を生成することも可能で、 ConvertToJson
関数を使用します
Sub CreateJsonString_Revised()
Dim postData As Object
Dim skillsCollection As Collection
Dim jsonString As String
' データを格納する親オブジェクトを準備
Set postData = CreateObject("Scripting.Dictionary")
' 基本的なキーと値を追加
postData("name") = "鈴木 一郎"
postData("age") = 25
' 配列用のオブジェクトを「Collection」で準備
Set skillsCollection = New Collection
' Collectionにデータを追加
skillsCollection.Add "Word"
skillsCollection.Add "PowerPoint"
' 親オブジェクトにCollectionを追加
postData.Add "skills", skillsCollection
' DictionaryをJSON文字列に変換
jsonString = ConvertToJson(postData)
' 結果をイミディエイトウィンドウに出力
Debug.Print jsonString
' 想定される出力: {"name":"鈴木 一郎","age":25,"skills":["Word","PowerPoint"]}
' オブジェクトの解放
Set postData = Nothing
Set skillsCollection = Nothing
End Sub
この jsonString
をWeb APIに送信することで、VBAで作成したデータをサーバーに送ることができます
あとがき
「VBA-JSON」ライブラリを使えば、これまでVBAでは難しかったJSONの扱いが非常に簡単になります。
- JSONを解析するなら
ParseJson
- JSONを生成するなら
ConvertToJson
この2つの関数を覚えるだけで、Web APIとの連携など、VBAでできることの幅が大きく広がります。ぜひ活用してみてください!
コメント
お世話になります。
パース後のjson処理で、連想配列に
name | 眼鏡
名前 | ○×
という形に格納することはできますか?
ニュアンスが掴み切れていないのですが通例”キー:値”の形にパースされるはずです。
差し支えなければパース前後のデータサンプル記載してもらえると判断できる気がします。