VBAでJSONファイルをパースする
COMオブジェクトのScriptControlを使うと、VBA上でJScriptが実行出来ます。って事は、VBAでもJSONファイルのパースが出来るんじゃね?と前々から思ってたのを試してみたところ、拍子抜けするくらい簡単に出来ました。
ソース
Option Explicit Sub VBA_de_JSON() Const cnsJSONString As String = "{ ""familyname"":""yamada"", ""personalname"":""tarou"" }" Dim sc As Object Dim strFunc As String Dim objJSON As Object Set sc = CreateObject("ScriptControl") sc.Language = "JScript" 'jsonにパースする関数文字列 strFunc = "function jsonParse(s) { return eval('(' + s + ')'); }" '関数を追加 sc.AddCode strFunc '追加した関数を実行して、結果を変数に格納する Set objJSON = sc.CodeObject.jsonParse(cnsJSONString) 'こっちでもいける 'Set objJSON = sc.Run("jsonParse", cnsJSONString) MsgBox objJSON.familyname Set objJSON = Nothing Set sc = Nothing End Sub
動かしてみると
javascriptとかと同じ様にアクセス出来てます。やったお( ^ω^)
ADODB.Streamを使ってJSONファイルを読み込む
JSONファイルといっても、単に文字コードがUTF-8のテキストファイルです。VBAでUTF-8のテキストファイルを読み込むにはCOMオブジェクトのADODB.Streamを使います。読み込んでしまえば、後はさっきと同じ要領です。
ソース
Option Explicit Sub VBA_de_JSON2() Dim sc As Object Dim strFunc As String Dim objJSON As Object Set sc = CreateObject("ScriptControl") sc.Language = "JScript" 'jsonにパースする関数文字列 strFunc = "function jsonParse(s) { return eval('(' + s + ')'); }" '関数を追加 sc.AddCode strFunc '追加した関数を実行 Set objJSON = sc.CodeObject.jsonParse(ReadUTF8Text("D:\json.txt")) MsgBox objJSON.personalname Set objJSON = Nothing Set sc = Nothing End Sub Function ReadUTF8Text(argPath As String) As String Dim buf As String With CreateObject("ADODB.Stream") .Charset = "UTF-8" .Type = 2 'adTypeText .LineSeparator = -1 'adCrLf .Open .LoadFromFile argPath buf = .ReadText(-1) 'adReadAll .Close End With ReadUTF8Text = buf End Function
問題点
JSONのキー名称が、VBA上のプロパティ名やメソッド名とかぶってる*1と、VBA上のプロパティやメソッドとして解釈されてエラーが発生するので、キー名称を変更しないと駄目なのがちょっと痛い。かぶってても動く方法を考えないといけないです。
*1:インテリセンスが働いて、小文字⇔大文字になったりするとアウチ。