LoginSignup
4
8

More than 3 years have passed since last update.

ExcelVBAでHTTPアクセスしてXMLデータを取得する

Last updated at Posted at 2019-05-22

はじめに

令和元年5月からお世話になっている、私の新しい職場は、Excel が大好きな集団でした。何年かぶりに、私も ExcelVBA を使うことになりました。復習したことを少しづつ Qiita に投稿していこうと思っています。

今回は、ExcelVBAで、Web APIにアクセスして、XMLデータを取得し、それをシートに反映させたいと思います。ウィキペディアの「直近で更新された記事のタイトル」を取得してきています。

vba03.gif

実際のXMLコードを見たい場合 => ここをクリック

準備作業

私のPC環境は以下の通りです。

  • Windows 10 Pro バージョン1809
  • Excel 2016 バージョン1904

スキップすること(今回は割愛すること)

以下のことは、読者は出来る or 理解しているものとします。

  • リボン(Excelのメニュー)に「開発」がある
  • あらかじめExcelファイルを、Excelマクロ有効ブック (*.xlsm)で保存する
  • シート上にボタンを置き、マクロを割り当てる

必ずやること

開発リボンの中にある Visual Basic アイコンをクリックして、Visual Basic for Applicationsを起動します。ツールメニューにあるツールの参照設定をクリックします。

vba01.png

登場した参照設定ダイアログで、Microsoft XML, v6.0を探しだし、チェックを入れます。

vba02.png

実際の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でつくっていこうと思います。

4
8
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
8