9
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ExcelでJSONを扱う場合のつまずきポイント

Last updated at Posted at 2017-09-27

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

直観的なアクセスとなっていないのが残念だけれど、なんとかエラーなく実行できるようになった。

9
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?