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関数を施すことにより、そのデータ件数や、インデックスとキーを指定してのデータの取り出しが可能になります。

図4.JSONデータの解析と取り出し

後は以下の点に注意しながら、タイトル行から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名で、現在も一緒に執筆をできる有志を募集中。