ExcelでJSONを扱う場合のよく使われる手法は、
ScriptControlのオブジェクトでJSONパースの関数を作るというもの。
インターネットで調べるとこれが一般的なようである。
以下に簡単なサンプルを書く。
Sub ボタン1_Click()
Dim obj As Object
Dim json As Object
Set obj = CreateObject("ScriptControl")
obj.Language = "JScript"
obj.AddCode "function jsonParse(s) { return eval('(' + s + ')'); }"
Set json = obj.CodeObject.jsonParse("{id:5,name:'山田',age:20}")
MsgBox json.age
End Sub
これは正常にjson.ageが出力される。
しかしjson.idやjson.nameとするとエラーとなってしまう。
しかもコードをageからidやnameに書き換えると、自動で1文字目が大文字に変わってしまう。
これはVBAの予約語だからのようである。
なのでJSONオブジェクトのキーが変わり、エラーとなっている模様。。。
インターネットで調べると、これにも解決策がある。
それはCallByNameを使うこと。
ちょっと一手間かかるけれど、以下のように書く。
Sub ボタン1_Click()
Dim obj As Object
Dim json As Object
Set obj = CreateObject("ScriptControl")
obj.Language = "JScript"
obj.AddCode "function jsonParse(s) { return eval('(' + s + ')'); }"
Set json = obj.CodeObject.jsonParse("{id:5,name:'山田',age:20}")
MsgBox CallByName(json, "name", VbGet)
End Sub
直観的なアクセスとなっていないのが残念だけれど、なんとかエラーなく実行できるようになった。