Word VBAでVBA-JSONを使う


はじめに

VBAでサーバーと通信しようとすると、JSON文字列をパースしたいことが多々あると思います。
そこで「VBA-JSON」を使おうと思い立ちましたが、
Wordならではのトラップがありました……

インポート~使ってみる

まずはReadmeのインストールの項目を見てみます。

Download the latest release
Import JsonConverter.bas into your project (Open VBA Editor, Alt + F11; File > Import File)
Add Dictionary reference/class
For Windows-only, include a reference to "Microsoft Scripting Runtime"
For Windows and Mac, include VBA-Dictionary

VBAはパッケージ管理等がないので、直接インポートですね。
”Microsoft Scripting Runtime”を参照設定に加え、いざ実行してみます。

Sub json_conv_test()

    Dim jsonStr As String
    jsonStr = "{" & _
            Chr(34) & "abc" & Chr(34) & ":" & Chr(34) & "ABC" & Chr(34) & "," & _
            Chr(34) & "def" & Chr(34) & ":" & Chr(34) & "DEF" & Chr(34) & _
            "}"
    '{"abc":"ABC","def":"DEF"}
    JsonConverter.ParseJson (jsonStr)

End Sub

ところが……

「Newキーワードの使用法が不正です」と、コンパイルエラーが出ました。

Dictionaryの検証

Word VBAは情報が非常に少ないです。宿命ですね。

まずは落ち着いて "Dictionary" のドキュメントを読みに行きます。
エディタでDictionaryを選択して F1 を押すと

なんと、WordからもDictionaryオブジェクトがはえていました。

WordにもDictionaryオブジェクトがあるのですね(カスタム辞書機能)。
それでScripting.Dictionaryを呼び出したいのに、Word.Dictionaryが呼び出されていたことがエラーの原因でした。

解決

そこで、ソースの一部を修正します。

Private Function json_ParseObject(json_String As String, ByRef json_Index As Long) As Scripting.Dictionary
    Dim json_Key As String
    Dim json_NextChar As String

    Set json_ParseObject = New Scripting.Dictionary
   '(以下省略)

上記のように"Dictionary"を"Scripting.Dictionary"に変更したところ、
無事、エラーなくパースすることができました。

もう一つのつまづき

あと、この方法でJSONをパースしたら配列はArrayではなくCollectionになるようです。
なので要素数の取得には UBoud ではなく .Countを使う必要がありました。
また、要素は 1 から始まるのも忘れかけていました……