HTTP通信を行うVBAを記述する
[Alt]+[F11]キーでVBエディタを開き、「Microsoft XML, v3.0」の参照設定を追加しておいてください。
リスト1 HTTP通信を行う
Private Sub cbSearch_Click()
'(1-1)キーワードの入力チェック
(中略)
'(1-2)HTTP通信によるリクエスト送信
(中略)
URL = "http://wikipedia.simpleapi.net/api" 'リクエスト送信先
URL = URL & "?output=json" 'JSON形式で受け取る引数を追加
URL = URL & "&keyword=" & UrlEncode(Range("keyword")) 'キーワード指定引数を追加
xmlhttp.Open "GET", URL, False 'GETメソッド、非同期通信で接続
xmlhttp.send 'HTTPリクエストを実送信
(中略)
If resText = "null" Then
MsgBox ("用語が見つかりませんでした。")
Exit Sub
End If
Set xmlhttp = Nothing 'HTTP通信用オブジェクトを解放
'(1-3)前回の検索結果をクリア
Dim resRow1 As Integer
Dim resRow2 As Integer
Range("word_title").Offset(1).Activate
resRow1 = ActiveCell.Row
resRow2 = ActiveCell.SpecialCells(xlCellTypeLastCell).Row
If resRow1 <= resRow2 Then Rows(resRow1 & ":" & resRow2).Delete
(リスト2へ続く)
(1-2)HTTP通信によるリクエスト送信の部分は、ほぼ第4回の動画検索と同様ですので、そちらを参照してください。異なる部分は以下の通りです。
・JSON形式でレスポンスを取得するため引数「output=json」を追加していること ・URLエンコード部分を関数化(UrlEncode)していること
なお、検索結果がない場合は、レスポンスに"null"が返ってきます。
(1-3)検索結果をセルに転記する前に、前回の結果をクリアするため、結果の開始行をresRow1に、終了行をresRow2に取得します。開始行は(存在すれば)タイトル行の1つ下のはずです。終了行は、データがある最も右下のセルを取得するメソッドSpecialCells(xlCellTypeLastCell)を利用します。前回の結果が残っていれば、開始行≦終了行の条件を満たすので、この範囲の行を削除します。
JSONデータをセルに転記するVBAを記述する
リスト1に続いて、以下のVBAを記述します。
リスト2 JSONデータをセルに転記する
(リスト1から続く)
'(2)JSONデータの解析
Dim nData As Integer
nData = getLength(resText)
For idx = 1 To nData 'データの件数だけ繰り返す
'リンク付きのタイトルを設定する
ActiveSheet.Hyperlinks.Add _
anchor:=Range("word_title").Offset(idx), _
Address:=getValue(idx, "url", resText), _
TextToDisplay:=getValue(idx, "title", resText)
'HTMLの改行記号を、VBAの改行記号に置換して設定する
Range("meaning_title").Offset(idx) = Replace(getValue(idx, "body", resText), "<br/>", vbCrLf)
'更新日時をExcelで認識できる形式に変換して設定する
Range("date_title").Offset(idx) = timeConv(getValue(idx, "datetime", resText))
Next
End Sub
JSONデータの解析は、JScriptの力を借りて、外部関数化しています。
表4.JSONデータを解析するユーザ定義関数
名前 | 第1引数 | 第2引数 | 第3引数 | 戻り値 |
---|---|---|---|---|
getLength | JSONデータ | - | - | 存在するデータ件数(整数) |
getValue | 何件目か | キー | JSONデータ | 該当するデータ(文字列) |
JScriptの部分の説明は省略しますが、JSONデータにeval関数を施すことにより、そのデータ件数や、インデックスとキーを指定してのデータの取り出しが可能になります。
後は以下の点に注意しながら、タイトル行からidxの行だけ下のセルに、取得データを転記していきます。
・タイトルは、URLのリンクを付けて、ハイパーリンクとして設定する
・本文は、HTMLでの改行記号<br/>をVBAの改行に変換する
・更新日時は、外部ユーザ関数timeConvで変換する(4回目YouTube APIで動画を検索しようと同様)
以上で完成です。VBエディタを閉じ、検索条件を入力し、「検索する」ボタンをクリックして、検索データが表示されれば成功です。
以下説明するリストはsample.lzhの中に収録しています。サンプルとしてご活用ください。
まとめ
Wikipediaの利用はいかがでしたか。SimpleAPIでは、最寄り駅Webサービスなども提供されています。下記のURLを参考にして、チャレンジしてみるのもいいでしょう。
http://img.simpleapi.net
WINGSプロジェクト 遠藤 存著/山田祥寛監修
WINGS プロジェクトについて
テクニカル執筆プロジェクト(代表山田祥寛)。海外記事の翻訳から、主にWeb開発分野の書籍・雑誌/Web記事の執筆、講演等を幅広く手がける。2011年5月時点での登録メンバは35名で、現在も一緒に執筆をできる有志を募集中。