JSONデータの解析(プロパティの利用)

まず、解析部分をVBAのユーザ定義関数にします。以前のWikipediaの処理を書き換えたものなので、詳細はそちらも参照してください。

図4.jsonデータの解析

[リスト9]jsonデータの解析

'(1)JSONデータを解析し、オブジェクト変数に格納
Dim objJson As Object
Set objJson = js.CodeObject.eval("(" + resText + ")")

'(2)解析済みのJSONデータの件数を取得
Dim objRowCount As Integer
objRowCount = CallByName(objJson, "length", VbGet)

'(3)結果をワークシートへ転記
For idx = 0 To objRowCount - 1 'データの件数だけ繰り返す
    '(4)JSONデータ1件分を取り出し、オブジェクト変数に格納
    Dim objRow As Object
    Set objRow = CallByName(objJson, idx, VbGet)
    '(5)JSONデータ1件分の該当項目を取り出し、セルに転記
    'リンク付きのタイトルを設定する
    ActiveSheet.Hyperlinks.Add _
        anchor:=Range("word_title").Offset(idx + 1), _
        Address:=CallByName(objRow, "url", VbGet), _
        TextToDisplay:=CallByName(objRow, "title", VbGet)
    'HTMLの改行記号を、VBAの改行記号に置換して設定する
    Range("meaning_title").Offset(idx + 1) _
        = Replace(CallByName(objRow, "body", VbGet), "<br/>", vbCrLf)
    '更新日時をExcelで認識できる形式に変換して設定する
    Range("date_title").Offset(idx + 1) _
        = timeConv(CallByName(objRow, "datetime", VbGet))
    Set objRow = Nothing
Next

Set objJson = Nothing

(1)のeval関数はjsonデータを解析します。文字列resTextにeval関数を施し、解析したデータをobjJson変数に格納します。
(2)では、解析済みjsonデータobjJsonは配列になっているはずなので、そのサイズを取り出します。lengthはVBAの予約語であるため、CallByName関数を用います。
(3)では、データ件数だけ繰り返し、JSONオブジェクトから値を取り出します。
(4)では、objRowオブジェクトに1件分のデータを取り出します。objJson配列のidx番目の要素を、CallByName関数を用いて取り出します。
(5)では、1件分のオブジェクトobjRowから、CallByName関数を用いてurl、title、body、datetimeの各項目の値を取り出し、セルに転記する処理を行っています。

日付形式の変換(ユーザ定義関数の利用)

もっと複雑な処理を行わせる場合は、JScriptのコードでユーザ定義関数を記述した文字列(以下のリストでは、変数cd)を、ScriptControl(変数js)に追加して呼び出します。ユーザ定義関数の呼び出し方は、先述の「関数の利用」と同様です。

「Tue, 07 Jun 2011 13:40:00 +0900」といった日付形式は、JScriptでは標準ですが、Excelでは単なる文字列と解釈されるので、ワークシート上でソートするためには「YYYY/MM/DD hh:mm:ss」形式への変換が必要です。

図5.日付変換の利用

[リスト10]日付変換

Dim cd As String
cd = ""
cd = cd & "function timeConv(s){"
cd = cd & "  var dt = new Date(s);"
cd = cd & "  var dtf = dt.getFullYear();"
cd = cd & "  dtf += '/' + (dt.getMonth()+1);"
cd = cd & "  dtf += '/' + dt.getDate();"
cd = cd & "  dtf += ' ' + dt.getHours();"
cd = cd & "  dtf += ':' + dt.getMinutes();"
cd = cd & "  dtf += ':' + dt.getSeconds();"
cd = cd & "  return(dtf);"
cd = cd & "}"
js.Addcode cd

MsgBox js.CodeObject.timeConv(Range("b3"))

日付文字列を引数sに受け取る関数timeConvを定義します。dtは日付オブジェクトで、new Date(s)と記述することにより、引数sに対応するオブジェクトが生成されます。 後はdtの各メソッドを使って、年月日時分秒を取り出し、dtf変数に繋げていくだけです。

表3.Dateオブジェクトのメソッド

メソッド名 説明
getFullYear 年を取得
getMonth 月を取得(0始まりなので、1加える必要あり)
getDate 日を取得
getHours 時を取得
getMinutes 分を取得
getSeconds 秒を取得

出来上がった文字列dtfをreturn命令で返せば、JScriptのコードは終了です。後は、このコードを記述した文字列cdを、Addcodeメソッドでjsオブジェクトに加えて呼び出します。

以上で完成です。(完全なコードは、ここからダウンロードしてください)。

まとめ

JScriptの機能の利用の仕方はいかがでしたか。VBAだけではなにかと表現しにくい処理も、JScriptと連携することで、シンプルに表現できることがあります。興味を持った方は、是非自分のアプリケーションでも活用してください。 JScriptについてもっと詳しく知りたい人は、以下のURLを参考にしてみてください。

http://msdn.microsoft.com/ja-jp/library/cc391850.aspx
WINGSプロジェクト 遠藤 存著/山田祥寛監修
WINGS プロジェクトについて
テクニカル執筆プロジェクト(代表山田祥寛)。海外記事の翻訳から、主にWeb開発分野の書籍・雑誌/Web記事の執筆、講演等を幅広く手がける。2011年5月時点での登録メンバは35名で、現在も一緒に執筆をできる有志を募集中。