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のテキストファイルです。VBAUTF-8のテキストファイルを読み込むにはCOMオブジェクトのADODB.Streamを使います。読み込んでしまえば、後はさっきと同じ要領です。

JSONファイルの中身

{
	"familyname":"yamada",
	"personalname":"tarou"
}

当然、文字コードUTF-8です。Dドライブ直下にある事とします。

ソース

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上のプロパティやメソッドとして解釈されてエラーが発生するので、キー名称を変更しないと駄目なのがちょっと痛い。かぶってても動く方法を考えないといけないです。

とはいえ

VBAからでも、JSONデータのパースやアクセスが出来るのがわかっただけでも充分な収穫。そのうちアドインにして公開してみます。

*1:インテリセンスが働いて、小文字⇔大文字になったりするとアウチ。