JSONデータの解析(プロパティの利用)
まず、解析部分をVBAのユーザ定義関数にします。以前のWikipediaの処理を書き換えたものなので、詳細はそちらも参照してください。
[リスト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」形式への変換が必要です。
[リスト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名で、現在も一緒に執筆をできる有志を募集中。