「スクレイピング」と聞くと、PythonやJavaScriptを使った難しそうな技術を想像するかもしれません。ですが、実はExcelのVBAでも簡単なスクレイピングが可能です。
業務でよく使うサイトから定期的に情報を取得したいときや、データ収集を自動化したいときに、VBAでのスクレイピングはとても便利な手段です。
この記事では、VBAでのスクレイピングの基本から、実際のコード例まで、初心者にもわかりやすく丁寧に解説します。
VBAでスクレイピングを行うには、以下のような準備が必要です。
XMLHttpRequest
オブジェクトを使います。以下に、VBAでWebページのデータを取得し、特定の情報を取り出す基本コードを紹介します。
Sub WebScrapingSample()
Dim http As Object
Dim html As Object
Dim url As String
Dim result As String
url = "https://example.com" ' ここに対象のURLを指定
Set http = CreateObject("MSXML2.XMLHTTP")
http.Open "GET", url, False
http.Send
If http.Status = 200 Then
Set html = CreateObject("HTMLFile")
html.body.innerHTML = http.responseText
' 例: タイトルタグの内容を取得
result = html.getElementsByTagName("title")(0).innerText
MsgBox "ページのタイトル: " & result
Else
MsgBox "ページの取得に失敗しました。"
End If
End Sub
このコードでは、WebページのHTMLを取得し、タイトル要素(<title>
タグ)の内容を抽出しています。
スクレイピングでは、目的の情報を取得するためにHTMLの構造を把握する必要があります。
たとえば、特定のclass
を持つ<div>
から情報を取りたい場合、以下のように記述できます。
Dim elements As Object
Set elements = html.getElementsByTagName("div")
For Each element In elements
If element.className = "news-title" Then
Debug.Print element.innerText
End If
Next
このようにclassName
やid
で条件を指定し、ループで目的の情報を抽出します。
たとえば、Yahoo!ニュースの見出しを取得してみましょう(対象ページの構造は変わる可能性があります)。
Sub GetYahooNews()
Dim http As Object
Dim html As Object
Dim elements As Object
Dim element As Object
Dim url As String
Dim i As Integer
url = "https://news.yahoo.co.jp"
Set http = CreateObject("MSXML2.XMLHTTP")
http.Open "GET", url, False
http.Send
If http.Status = 200 Then
Set html = CreateObject("HTMLFile")
html.body.innerHTML = http.responseText
Set elements = html.getElementsByTagName("a")
i = 1
For Each element In elements
If InStr(element.className, "sc-h") > 0 Then
Cells(i, 1).Value = element.innerText
i = i + 1
End If
Next
Else
MsgBox "取得に失敗しました。"
End If
End Sub
このコードでは、見出しに使われているリンク要素を抽出し、Excelのセルに書き出しています。className
の確認には、ブラウザの検証ツールを使います。
VBAによるスクレイピングを行う際には、以下の点に注意してください。
VBAはエンジニアでなくても触れることができる便利なツールです。業務で毎回ブラウザから手作業でコピペしているような作業があれば、今回紹介したようなスクレイピングで自動化できる可能性があります。
まずは簡単なページから、VBAでのスクレイピングを試してみてください。データ収集の効率が格段にアップするはずです。