VBAでJSONを扱う方法 VBA-JSONの使い方

「VBAでJSONを読み込みたいんだけど、標準機能だとどうにもならない…」と手が止まっていませんか?

結論から言うと、ExcelVBAでJSONを扱うなら「VBA-JSON」という定番ライブラリを入れるのが一番ラクです

やることはシンプルで、JsonConverter.bas というファイルを1つ取り込んで、参照設定を1つ入れるだけ、あとは ParseJson でJSONを読み込んで、ConvertToJson でJSONを書き出せます

この記事では、VBA-JSONの導入から実際の使い方(パース・生成・配列やネストへのアクセス・ループ処理)まで、初心者の方にも分かるように順を追って解説していきます、つまずきポイントとFAQ、AIにコードを書いてもらうコツもまとめているので、必要なところだけ拾い読みでも大丈夫です

目次

VBAでJSONを扱うなら VBA-JSON が定番

まず大前提として、VBAには標準でJSONを扱う機能がありません

Excelには CSV を読む機能はあっても、JSONをそのまま「項目ごとに取り出す」みたいなことは素のVBAだとできないんですよね

そこで使うのが、オープンソースのライブラリ「VBA-JSON」です

GitHubの VBA-tools/VBA-JSON で公開されていて、JSON界隈ではかなり知られた定番です、最新は v2.3.1 で、WindowsのExcelでもMacのExcelでも動きます

使う関数は基本的にこの2つだけ覚えればOKです

  • ParseJson … JSON文字列を、VBAで扱えるデータ(Dictionary / Collection)に変換する(=読み込む)
  • ConvertToJson … VBAのデータを、JSON文字列に変換する(=書き出す)

「読み込む」と「書き出す」の往復、これだけです、難しそうに見えて中身はシンプルなので安心してください

VBAでJSONを扱う場面はどんなとき?

そもそも「ExcelでJSONなんて使うの?」と思うかもしれませんが、最近のWeb APIはJSONで返ってくるのがほぼ標準なので、意外と日常業務の中で出番があります

たとえばこんなケースです

  • 為替レートや天気予報のWeb APIを叩いてExcelに取り込む
  • WebサービスからダウンロードしたデータをVBAで集計する
  • 取引先のシステムとJSON形式でデータをやり取りする
  • WordPressや社内システムのREST APIを操作する

VBA-JSONを使えるようになると、Excel完結の作業に外部データを取り込める幅が一気に広がります、普段の集計シートに「最新のデータを自動で引っ張ってくる」ような仕組みを足せるイメージですね

実際にWeb APIへリクエストを送ってJSONを受け取る流れは、eBay APIにVBAでリクエストを送る方法を解説した記事でも具体例を扱っているので、API連携をやってみたい方はあわせてどうぞ

そもそもJSONって何?という人向けの基礎

「JSONって言葉は聞くけど、よく分かってない」という方のために、ここで一度ざっくり整理しておきます、もう分かってる方は読み飛ばしてOKです

JSON(JavaScript Object Notation)は、テキストベースのデータ交換フォーマットです

Web APIからデータを取得するとき、他システムとのデータやり取りなど、いろんな場面で使われています、軽量で人間にも機械にも読みやすいのが特徴ですね

JSONの基本構造と記述ルール

細かいルールはいくつかありますが、まず押さえておきたいのはこのあたりです

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

形としては「"キー": 値」のセットが基本で、複数のデータを { } で囲んだものを「オブジェクト」、順序のあるデータの並びを [ ] で囲んだものを「配列」と呼びます

このあたりの言葉は、VBA-JSONを使うときに何度も出てくるので、なんとなく頭に入れておくと後がスムーズです

JSONのサンプルをExcelの表で考えてみる

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的に表にすると、こんなイメージになります

スクロールできます
namebirthdateheightwitghtfavorite_foodsglasses
yearmonthday
javeo20001118070MeatVegetablestrue
Javelin200222150Sweetsfalse

つまりJSONをざっくり言うと、項目と値が対になっていて、「{ }」が階層を、「[ ]」が配列のデータ群を表していると思えばOKです

この「JaveoとJavelinの2人分のデータ」を、これからVBA-JSONで取り出していきます

VBA-JSONの導入手順(2026年版)

ここが一番大事なパートです、導入でつまずく人が多いので、順番にやっていきましょう

やることは大きく分けて2つ、「JsonConverter.basのインポート」と「参照設定」だけです

STEP
ライブラリのダウンロード

GitHubのVBA-tools/VBA-JSONリポジトリにアクセス

STEP
ファイルを探す

ページ内にある「JsonConverter.bas」をダウンロード

※何年も更新されていませんが、文字列を分解するだけのプログラムで特に改良点がないってだけなので気にせずどうぞ

STEP
VBAへのインポート

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

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

もしくは「JsonConverter.bas」をプロジェクトエクスプローラーへドラッグ&ドロップでもOK

STEP
Microsoft Scripting Runtime に参照設定する

VBA-JSONを動かすには参照設定が要ります

VBA-JSONは内部で「Dictionary」という、キーと値をセットで扱うデータの入れ物を使っています、このDictionaryをそのまま書くスタイル(早期バインディングと言います)で動かすために、Microsoft Scripting Runtime への参照設定が必要になります

設定はVBEのメニューからで、手順はこうです

  1. VBEのメニューで「ツール → 参照設定」を開く
  2. 一覧から「Microsoft Scripting Runtime」を探す
  3. チェックボックスにチェックを入れて「OK」を押す

これを忘れると、コードを実行したときに「ユーザー定義型は定義されていません」というエラーが出ます、後ろのFAQでも触れますが、この参照設定はかなりの確率でハマるので先に済ませておくのがおすすめです

Mac の Excel で使う場合

MacのExcelには Microsoft Scripting Runtime が無いので、参照設定の代わりに同じ作者の「VBA-Dictionary」というライブラリを一緒に入れます

VBA-tools/VBA-Dictionary から Dictionary.cls をダウンロードして、JsonConverter.bas と同じようにインポートすればOKです、WindowsとMacの両方で動かしたいときも、参照設定ではなくこのVBA-Dictionaryを使う形にしておくと安心ですね

ここまでできたら準備は完了です、いよいよ実際にJSONを扱っていきます

ParseJson でJSONを解析(パース)してみる

JSON形式のテキストを、VBAで扱えるデータ構造(DictionaryやCollection)に変換することを「解析(パース)」と言います

このパースが、ParseJson 関数を使えばたった一行で完了します

まずはWeb APIからJSONを取ってきてパースする、いちばんよくある形のサンプルです

' /// 事前準備 ///
' VBEの [ツール] > [参照設定] から下記にチェックを入れる
' ・Microsoft Scripting Runtime   (Dictionary用、VBA-JSONに必須)
' ・Microsoft XML, v6.0           (APIを叩く場合)
Sub GetJsonData()
    Dim http As Object
    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

    ' ここがVBA-JSONの本体、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 parsedData = ParseJson(jsonText)

この一行を通すことで、最初のサンプルにあった「長いただの文字列」が、parsedData(1)("name") といった具合に要素を指定してデータを取り出せる構造に変わります

APIを使わず、手元の文字列をそのままパースして試すこともできます、まずは動きを確かめたいときはこちらが手っ取り早いです

Sub ParseSample()
    Dim jsonText As String
    Dim parsedData As Object

    ' 動作確認用に文字列を直接用意
    jsonText = "[{""name"":""Javeo"",""height"":180}]"

    Set parsedData = ParseJson(jsonText)

    Debug.Print parsedData(1)("name") ' → Javeo
    Debug.Print parsedData(1)("height") ' → 180
End Sub

VBAの中で「”」を書くときは「””」と2つ重ねる必要があるので、そこだけ少し読みづらいですが、やっていることは「文字列をパースして取り出す」だけです

パースしたJSONから値を取り出す(配列・オブジェクト・ネスト)

ここがVBA-JSONを使ううえで一番つまずきやすく、そして一番大事なところです

ポイントは、パース後のデータが「Dictionary」と「Collection」の2種類に化けているという点です

  • JSONの「{ }」(オブジェクト)→ Dictionary になる(キー名で取り出す)
  • JSONの「[ ]」(配列)→ Collection になる(番号で取り出す)

この区別さえ分かれば、あとは指定の仕方が決まります、サンプルの「JaveoとJavelinのデータ」を例に、ひとつずつ見ていきましょう

配列(Collection)は番号で取り出す

サンプルのJSONは全体が「[ ]」で囲まれた配列なので、パース直後の parsedData はCollectionになっています

Collectionは「何番目」という番号(インデックス)で要素を取り出します、VBAのCollectionは1番から始まるのがポイントで、0番からじゃないので注意です

' 1人目(Javeo)のデータを取り出す
Set firstPerson = parsedData(1)

' 2人目(Javelin)のデータを取り出す
Set secondPerson = parsedData(2)

オブジェクト(Dictionary)はキー名で取り出す

取り出した1人分のデータ(parsedData(1))は「{ }」のオブジェクトなので、こちらはDictionaryです

Dictionaryは番号ではなく、キー名(項目名)を指定して値を取り出します

' 1人目の名前と身長
Debug.Print parsedData(1)("name")   ' → Javeo
Debug.Print parsedData(1)("height") ' → 180

' 真偽値もそのまま取れる
Debug.Print parsedData(1)("glasses") ' → True

parsedData(1)("name") は「配列の1番目(Collection)→ その中のnameキー(Dictionary)」という読み方になります、カッコが連続するのは、この2段階を一気に書いているからなんですね

ネスト(入れ子)は同じ要領でつなげる

サンプルの birthdate は、中にさらに year / month / day を持つ「入れ子のオブジェクト」です、こういうネストも、考え方は同じでカッコをつなげるだけです

' 1人目の生年月日(birthdateの中のyear)
Debug.Print parsedData(1)("birthdate")("year")  ' → 2000
Debug.Print parsedData(1)("birthdate")("month") ' → 1

' 配列の中の値(favorite_foodsの1個目)
Debug.Print parsedData(1)("favorite_foods")(1) ' → Meat

コツは、「{ }が来たらキー名」「[ ]が来たら番号」をJSONの形に合わせて交互に書いていくだけ、整形したJSONを見ながら指でたどると間違えにくいです

ループでまとめて処理する

実際の業務では「全員分をシートに書き出す」みたいに、繰り返し処理(ループ)で回すことがほとんどです

配列(Collection)は For Each でぐるっと回せます

Sub WriteToSheet()
    Dim parsedData As Object
    Dim person As Object
    Dim i As Long

    Set parsedData = ParseJson(jsonText) ' jsonTextは取得済みとする

    i = 1
    ' 配列の要素(1人分のデータ)を1件ずつ取り出す
    For Each person In parsedData
        Cells(i, 1).Value = person("name")
        Cells(i, 2).Value = person("height")
        Cells(i, 3).Value = person("birthdate")("year")
        i = i + 1
    Next person
End Sub

キー名が分からないオブジェクトを総当たりで見たいときは、.Keys でキー一覧を回す手もあります

Dim key As Variant
' 1人目のオブジェクトのキーと値を全部出す
For Each key In parsedData(1).Keys
    Debug.Print key & " = " & parsedData(1)(key)
Next key

ここまでで「読み込む(パース)」側はバッチリです、配列は番号・オブジェクトはキー名、これさえ押さえれば、たいていのJSONは取り出せます

ConvertToJson でVBAのデータをJSONに変換(生成)

今度は逆方向、つまりVBAのDictionaryやCollectionからJSON文字列を作る(生成する)パターンです、こちらは ConvertToJson 関数を使います

「VBAで作ったデータをAPIに送りたい」「JSON形式でファイルに保存したい」みたいなときに出番があります

Sub CreateJsonString()
    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

ポイントは、JSONの「{ }」はDictionary、「[ ]」はCollectionで組み立てるという点です、パースのときと逆の対応関係になっているだけなので、慣れると自然に書けるようになります

この jsonString をWeb APIに送信(POSTなど)すれば、VBAで作ったデータをサーバーに送れます

改行付きで見やすく出力したいとき

デフォルトのままだと、生成されるJSONは改行なしの一行になります、人が読む用にきれいに整形したいときは、Whitespace オプションを付けます

' インデント2つ分で改行を入れて整形
jsonString = ConvertToJson(postData, Whitespace:=2)

ファイルに保存して中身を確認したいときなんかは、こちらのほうが見やすくておすすめです

VBA-JSONを使わずにJSONを扱う方法(JScript)

ここまでVBA-JSONをおすすめしてきましたが、「ライブラリを追加したくない」「配布先でインポートさせるのが面倒」というケースもありますよね

そういうときの代替案として、Windows標準のJScriptエンジンを使ってJSONをパースする方法もあるので紹介しておきます

JScriptはWindowsに最初から入っているスクリプト実行の仕組みで、これを ScriptControl という部品から呼び出すと、JavaScriptの JSON.parse をVBAから間接的に使えます

Sub ParseByJScript()
    Dim sc As Object
    Dim jsonText As String
    Dim parsed As Object

    jsonText = "{""name"":""Javeo"",""height"":180}"

    ' JScriptエンジンを用意
    Set sc = CreateObject("ScriptControl")
    sc.Language = "JScript"

    ' JavaScriptのJSON.parseで解析
    Set parsed = sc.Eval("(" & jsonText & ")")

    ' プロパティ名で値を取り出す
    Debug.Print parsed.name   ' → Javeo
    Debug.Print parsed.height ' → 180
End Sub

この方法のメリットは、外部ライブラリのインポートが要らないことです

ただ、いくつか弱点もあって、正直なところ常用にはVBA-JSONのほうが向いています

  • ScriptControl は32bit版のOfficeでしか動かない(64bit版では別の書き方が必要)
  • 取り出した値の扱い(配列やネスト)がVBA-JSONより少しクセがある
  • Macでは使えない

なので個人的には、基本はVBA-JSON、どうしてもライブラリを足せない事情があるときだけJScriptという使い分けがおすすめです

VBA-JSONのよくあるつまずき・FAQ

VBA-JSONでハマりやすいポイントを、質問形式でまとめておきます、エラーが出たらまずここを確認してみてください

「ユーザー定義型は定義されていません」と出る

これは 参照設定の漏れがほぼ原因です

VBA-JSONはDictionaryを使うので、WindowsのExcelなら「ツール → 参照設定」で Microsoft Scripting Runtime にチェックが入っているか確認してください、入っていなければチェックを入れて保存し、もう一度実行すれば直ります

MacのExcelの場合は、前述のVBA-Dictionary(Dictionary.cls)を取り込んでいるかを確認しましょう

「KeyNotFoundError」のようなエラーが出る

これは、JSONに存在しないキー名を指定して取り出そうとしたときに出るエラーです

キー名のタイプミス、大文字小文字の違い、そもそもそのキーが無いJSONだった、あたりが定番の原因ですね

このエラーはハマりやすいので、原因の切り分けと対処法を VBA-JSONでKeyNotFoundErrorが発生するときの対処をまとめた記事 で別途くわしく解説しています、同じエラーで止まっている方はそちらをどうぞ

日本語が文字化けする

Web APIから取得したJSONの日本語が文字化けする場合は、文字コードの取り違えが原因のことが多いです

多くのAPIはUTF-8で返してくるので、responseText をそのまま使うとShift_JIS環境で化けることがあります、その場合は responseBody(バイト列)を取得して、UTF-8として読み直すと直ります

Dim stream As Object
Set stream = CreateObject("ADODB.Stream")
stream.Open
stream.Type = 1               ' バイナリ
stream.Write http.responseBody
stream.Position = 0
stream.Type = 2               ' テキスト
stream.Charset = "UTF-8"       ' UTF-8として読み直す
jsonText = stream.ReadText
stream.Close

キーがあるか分からないとき、どう書けばいい?

キーが存在するか不安なときは、取り出す前に .Exists でチェックすると安全です(Dictionaryの機能です)

If parsedData(1).Exists("weight") Then
    Debug.Print parsedData(1)("weight")
Else
    Debug.Print "weightキーはありません"
End If

これを挟んでおくと、キーが無いJSONが来てもエラーで止まらずに処理を続けられます

VBA-JSONの活用例

導入と使い方が分かったところで、「で、実際どんなことに使えるの?」というイメージを少し具体的にしておきます

いちばん多いのは、やはり Web APIのレスポンス(JSON)をパースしてシートに展開するパターンです、為替レート・天気・在庫情報みたいな「外部の最新データ」をExcelに自動で取り込めると、手作業のコピペがまるごと無くなります

たとえばフリマやECのAPIを叩いて、出品データや売上をExcelに集計する、みたいな使い方ですね、APIへリクエストを送る具体的な書き方は eBay APIにVBAでリクエストを送る方法の記事 にまとめているので、JSONパースと組み合わせると一通りの流れがつかめます

逆に ConvertToJson 側だと、VBAで組み立てたデータをJSONにして、メール本文やAPIのリクエストボディに載せる、といった使い方ができます、VBAから自動でメールを送る仕組みは VBAでGmailを送信する方法の記事 で扱っているので、データ生成と通知を組み合わせたい方はあわせてどうぞ

そもそもVBA自体がはじめてで「Dim とか For Each の書き方からあやしい…」という方は、先に VBA入門の記事 で基礎をさらっておくと、この記事のコードもぐっと読みやすくなると思います

AIにVBA-JSONのコードを書いてもらうコツ

最近はClaudeやChatGPTにVBAコードを書いてもらう人も増えてきました、もちろんVBA-JSONを使ったコードも、頼めば書いてくれます

ただ、AIにそのまま「VBAでJSONをパースして」と頼むと、意図しない実装を返してくることがあるんですよね

  • VBA-JSONを使わず、自前のJSON解析関数をゼロから書こうとする
  • 参照設定の前提がズレていて、そのままだと動かないコードを返す
  • 標準機能だけで無理やり読もうとして、やたら長いコードになる

こうしたズレを避けるには、依頼するときに次のような前提を明示するのがおすすめです

VBAで○○のJSONデータをパースするコードを書いてほしい
前提:
- VBA-JSON(JsonConverter.bas)を導入済み
- ParseJson の戻り値を Dictionary / Collection として直接扱う
- 参照設定は Microsoft Scripting Runtime を入れている前提
- 配列は番号、オブジェクトはキー名でアクセスする形で

エラーが出たときも、コードとエラーメッセージをまとめて貼り付ければ、AIが原因と対処をだいたい提示してくれます、自分でハマる時間がかなり減らせるので、これは活用しない手はないです

ClaudeでVBAコードを書いてもらう基本的な流れは Claudeの使い方を初心者向けに解説した記事 にまとめているので、AIにコードを頼むのが初めての方は、そちらから読むとスムーズだと思います

まとめ

VBA-JSONを使えば、これまでVBAでは扱いにくかったJSONが、ぐっと身近になります

導入のポイントはこの2つだけです

  • JsonConverter.bas をVBEにインポートする
  • Microsoft Scripting Runtime に参照設定する(Macは VBA-Dictionary)

使い方も、覚える関数は2つだけです

  • JSONを読み込むなら ParseJson(配列は番号、オブジェクトはキー名で取り出す)
  • JSONを書き出すなら ConvertToJson(「{ }」はDictionary、「[ ]」はCollectionで組む)

この導入2ステップと関数2つさえ押さえれば、Web APIとの連携をはじめ、VBAでできることの幅がかなり広がります

まずは手元の短いJSONを ParseJson に通して、Debug.Print で1個取り出してみるところから始めると、感覚がつかみやすいと思います


最後に・・・

クラウドワークスココナラでお仕事受け付けています!

PythonとExcelを中心に仕事に役立つ業務ツールや自動化、スクレイピングツールの作成を受注していて、クラウドワークスでは気が付けば100件以上のお仕事を受注してきました!

会社員をやりながらの副業なので時間の捻出は相応ですが、クライアントの方々と近い立場でこちらからも提案しながら活動していますのでお悩みあれば是非ご相談ください

ココナラのプロフィールページへ

"ココナラ"に新規登録する際は1,000Pもらえる紹介コード使ってください

78E62K

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

VBAとPythonを中心にユーザー側でできるITを自己学習しているので備忘録半分、学習履歴を残して同じ道を辿る人の参考になればとブログを始めました

副業でスクレイピングツール作成を中心にできることを色々やっていますのでご相談いただけるとありがたいです!


クラウドワークスのページへ


ココナラのページへ

コメント

コメント一覧 (2件)

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

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

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

コメントする

目次