はじめに
令和元年5月からお世話になっている、私の新しい職場は、Excel が大好きな集団でした。何年かぶりに、私も ExcelVBA を使うことになりました。復習したことを少しづつ Qiita に投稿していこうと思っています。
今回は、ExcelVBAで、Web APIにアクセスして、XMLデータを取得し、それをシートに反映させたいと思います。ウィキペディアの「直近で更新された記事のタイトル」を取得してきています。
実際のXMLコードを見たい場合 => ここをクリック
準備作業
私のPC環境は以下の通りです。
- Windows 10 Pro バージョン1809
- Excel 2016 バージョン1904
スキップすること(今回は割愛すること)
以下のことは、読者は出来る or 理解しているものとします。
- リボン(Excelのメニュー)に「開発」がある
- あらかじめExcelファイルを、Excelマクロ有効ブック (*.xlsm)で保存する
- シート上にボタンを置き、マクロを割り当てる
必ずやること
開発リボンの中にある Visual Basic アイコンをクリックして、Visual Basic for Applicationsを起動します。ツールメニューにあるツールの参照設定をクリックします。
登場した参照設定ダイアログで、Microsoft XML, v6.0
を探しだし、チェックを入れます。
実際のVBAコード
Option Explicit
Sub Main()
'変数の宣言
Dim http As XMLHTTP60
Dim doc As DOMDocument60
Dim node As IXMLDOMNode
Dim url As String
Dim i As Integer
'HTTPアクセスを設定して発射
Set http = New XMLHTTP60
url = "https://ja.wikipedia.org/w/api.php?action=query&list=recentchanges&rcnamespace=0&format=xml"
http.Open "GET", url, False
http.send
'HTTPアクセスに失敗があったら中止
If http.statusText <> "OK" Then
MsgBox "サーバーへの接続に失敗しました", vbCritical
Exit Sub
End If
'XMLデータを取り込む
Set doc = New DOMDocument60
doc.LoadXML (http.responseText)
'XPathを使ってノード(要素)を取り込む
i = 1
For Each node In doc.SelectNodes("//rc")
'各ノードのtitle属性を取得して、シートに貼り付ける
ActiveSheet.Range("A" & i + 2).Value = i & ": " & node.Attributes.getNamedItem("title").Text
i = i + 1
Next
'後片付け
Set http = Nothing
Set doc = Nothing
Set node = Nothing
End Sub
最後に
残念ながら ExcelVBA では、データフォーマットは XML がデフォルトです。JSON は、トゥーヤングみたいです。コードが複雑になるのを避けるため、サーバーサイドも、XMLでつくっていこうと思います。