プログラム

VBAからjsonデータを扱うにはどうするの?

jsonはVBAからでも利用できる?

VBAからjsonデータを取り込もう

ここ数年?サーバ間などの通信にjsonを利用するケースが大変多くなっています。ひと2000年ごろはjsonはほとんど利用されていませんでしたが、その後、マイクロソフトのドットネットが登場したころからでしょうか、急速に普及しました。

それまでのプログラム言語でjsonを利用するにはどうしたらいい?
ここではVBAでの利用方法を説明します。それ以外の古い言語を使っている方などにも参考になると思いますので是非ご覧ください。

以下は、VBAのCallByName関数を使ってJSONデータを扱うサンプルです。VBAでは、Microsoft Scripting RuntimeやJSONパーサライブラリを使うことで、JSONデータの読み取り・解析できます。CallByNameを利用することで、JSONオブジェクトのプロパティを動的に参照することができます。

以下、サンプルのjsonデータです。


{
    "product": {
        "name": "Laptop",
        "price": 1200,
        "availability": true
    }
}

次にCallByNameを使ってJSONのプロパティに動的にアクセスするVBAコードです。


Sub ParseJsonUsingCallByName()
    ' JSON文字列を準備
    Dim jsonString As String
    jsonString = "{""product"": {""name"": ""Laptop"", ""price"": 1200, ""availability"": true}}"

    ' JSONを解析するための辞書オブジェクトを準備
    Dim jsonDict As Object
    Set jsonDict = JsonConverter.ParseJson(jsonString)

    ' productオブジェクトを取得
    Dim product As Object
    Set product = jsonDict("product")

    ' CallByNameを使って各プロパティにアクセス
    Dim propertyName As String
    Dim propertyValue As Variant
    
    ' 動的にプロパティを取得する
    propertyName = "name"
    propertyValue = CallByName(product, propertyName, VbGet)
    Debug.Print "Product Name: " & propertyValue
    
    propertyName = "price"
    propertyValue = CallByName(product, propertyName, VbGet)
    Debug.Print "Product Price: " & propertyValue
    
    propertyName = "availability"
    propertyValue = CallByName(product, propertyName, VbGet)
    Debug.Print "Availability: " & propertyValue
End Sub


いかがでしょうか。
かなり簡単にjsonデータを取得できます。
それでは、少しコードの説明です。

(1)JSON文字列を準備

jsonStringにJSON形式の文字列を格納しています。この文字列にはproductというキーとその詳細情報(名前、価格、在庫の有無)を含むオブジェクトが入っています。

(2)JSONを解析して辞書オブジェクトに変換

JsonConverter.ParseJson(jsonString)を使って、JSON文字列をDictionaryオブジェクトに変換しています。これにより、JSONデータをキーを使ってアクセス可能になります。

(3)プロダクト情報の取得

Set product = jsonDict("product")で、JSON内のproductオブジェクトを取得し、辞書オブジェクトとして操作します。
CallByNameを使ってプロパティに動的にアクセス:

CallByName関数を使って、オブジェクトのプロパティ(name, price, availability)に動的にアクセスします。
CallByName(product, propertyName, VbGet)の形式で、指定したプロパティ名をpropertyName変数で指定し、そのプロパティの値を取得します。
このように動的にプロパティを指定することで、プロパティ名が事前に固定されていない場合でもアクセスが可能です。

(4)デバッグ出力

Debug.Printを使って、取得したプロパティの値を出力しています。これにより、VBAの「即時ウィンドウ」にProduct Name, Product Price, Availabilityが表示されます。

まとめ

CallByName関数でjsonデータを操作する場合は、上記のサンプルを使うことでほぼ思ったことができるかと思います。
ぜひ利用したことがない方はお試しください。

-プログラム
-