Excel VBAでJSONを自動生成

vba

はじめに

  • シートに定義したフィールド名・型や値に基づいてJSONを生成するExcel VBAマクロを紹介します。
  • 動作確認した環境は次の通りです。
    OSWindows 10(64ビット)
    OfficeMicrosoft Office Professional Plus 2019
    (Microsoft® Excel® 2019 MSO (16.0.14228.20216) 32 ビット )
  • マクロを含むExcelファイルをGitHubで公開しています。
    こちらから直接ダウンロードすることもできます。
  • その他のJSONを生成するExcel VBAサンプルです。
    • フィールド定義が1階層前提の単純なサンプル
    • “field1:field1-1:field1-1-1″等のようなフラットなフィールド定義からJSONを生成するサンプル

サンプルExcelシートの説明

  • Excelシート上に記載したフィールドや値をJSONに出力できます。
    「配列」(I列)、「型」(J列)を変更することで、JSONへの値の出力仕様を変更できます。JSONにコメントを出力したい場合、「コメント」(L列)欄を指定します。「説明」(H列)、「備考」(M列)は、管理用に設けられた項目で処理に影響しません。
  • JSON出力の例は次の通りです。
  • 詳細仕様
    • フィールドの型として文字列(“string”)、数値(“number”)、真偽(“boolean”)、null(“null”)型を想定しています。
    • 配列の指定がある場合、値をカンマで分割したものを値(指定された型を考慮)として使用します。
      例えば、配列・文字列型の値「123,456」は、「[“123”, “456”]」としてJSONに出力します。配列・数値型だった場合、「[123, 456]」としてJSONに出力します。
    • 文字列や数値型の配列出力は可能ですが、JSONオブジェクトの配列出力は対応していません。
    • フィールドの種類に応じてJSONへのコメント仕様が異なります。
      当該フィールドが親フィールド(子となるフィールドを含む)の場合、当該フィールドの前の行にコメント(ブロックコメント)を出力します。当該フィールドが通常フィールドの場合、当該フィールドの後ろにコメント(ラインコメント)を出力します。

実現方式の説明

Excelのシートに定義されたフィールドの階層構造の解析(「フィールド定義の解析」)と、解析結果に基づいてJSONデータを作成する処理(「解析結果に基づいたJSONの生成」)に分割して実現しています。ここでは、実現方法の難易度が高めの「フィールド定義の解析」について説明します。

フィールド定義の解析方法

再帰関数を定義して階層構造を解析します。

  • 引数で指定された階層(N)にあるフィールドとその値等(フィールド定義)を抽出し、それらをリスト(フィールドリスト)として返却する再帰関数を定義します。
  • 下位階層(N+1)を持つフィールドが現れた場合、下位階層(N+1)を指定して同関数を実行します。返却されたフィールドリストを値として、当該フィールドをフィールドリストに追加します。
  • フィールドが下位階層を持つかどうかは、次の行にあるフィールドの階層(列位置)で判定できます。

データモデル

  • フィールド定義(フィールド名、型、値等)は、独自に定義したFieldDef型(クラス)に格納します。これらを格納するフィールドリストとしてCollection型を使用します。
  • 前節の階層構造に対応するデータモデルの例(主要プロパティのみ記載)を次に示します。
    フィールドの値が数値や文字列の場合、Valueプロパティにその値を設定します。下位階層があるフィールドの場合、Valueプロパティに下位階層のフィールドリスト、子のフィールドリストがあることを示すためのプロパティIsParentにtrue、を設定しています。

ソースコードの説明

メイン処理、フィールド定義の解析、JSONの生成処理について説明します。
完全なソースコードは、Excelファイルをダウンロードしてご確認ください。

参照設定

  • JSONをUTF-8形式でファイルに保存するために、”Microsoft ActiveX Data Objects 6.1 Library”を使用しています。[ツール] – [参照設定]で当該ライブラリを追加してください。

メイン処理

  • 後述の「フィールド定義の解析」「解析結果に基づいたJSONの生成」を実行します。
  • フィールド定義の解析結果はフィールドリスト(FieldDefs型を要素とするCollectionクラス)に格納しています。

フィールド定義の解析

  • フィールド定義の階層を再帰的に解析する関数を用意し、フィールドリストを生成します。
  • ここでは便宜上、文字列/数値/配列型の値を持つフィールドを「通常フィールド」、子のフィールド(オブジェクト)を持つフィールドを「親フィールド」と表記しています。
  • 解析の中核となる再帰関数ParseChildFields()では、処理中の次のフィールドの階層(列)に基づいて、次のように処理を分岐します。
    • フィールドの値の取得条件
      • 次のフィールドの階層(nextDepth ) ≦ 処理中の階層(depth) … 通常フィールドのため、「値」(K列)を値とする。
      • 処理中の階層(depth) ≦ 次のフィールドの階層(nextDepth ) … 親フィールドのため、再帰関数で取得したフィールドリストを値とする。
    • 関数の終了条件
      • 次のフィールドの階層(nextDepth ) < 処理中の階層(depth) … 処理中の階層(depth)の最終フィールドなので現在の関数実行を終了し、生成したフィールドリストを呼出元に返却する。(このフィールドリストが呼出元の親フィールドの値になる。)
  • 再帰関数間での各種パラメータの引き渡しを簡略化するために、いくつかの変数はグローバル変数として宣言しています。

解析結果に基づいたJSONの生成

  • フィールドリストを再帰的に辿って、フィールド・値をJSON形式で出力します。
  • JSON生成の中核となるのは再帰関数CreateChildJsonData()です。フィールド定義(FieldDef型)にある配列や型に基づいて、フィールドに対応する値を生成します。
  • このサンプルでは”//”形式のコメントを使用していますが、実行環境によってはエラーになる場合があります。
  • JSONファイルの先頭に追加するコメント(ヘッダコメント)をEditHeaderComment()関数で生成しています。
    生成したJSONファイルをバージョン管理する場合、生成元となったExcelファイルとの対応が分かるよう、ヘッダコメントにExcelファイルのバージョンを識別できるような情報(Excel上の改定履歴版やバージョン管理システムのリビジョン情報等)の埋め込みをお薦めします。
  • コメントの出力内容や条件を変更したい場合、EditHeaderComment(), EditFieldComment()の内容を変更してください。