はじめに
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 から始まるのも忘れかけていました……