ブラウザを起動せずに Web サイトの HTML や JSON を取得したい場合は、MSXML2.XMLHTTP
などの HTTP 通信用オブジェクトを利用できます。ここでは https://morinokabu.com/ を例に、GET リクエストを送信してレスポンス本文を取得し、メッセージボックスで確認する手順をご紹介いたします。
目次
サンプルコード
Sub FetchWebData()
Dim httpReq As Object ' HTTP リクエスト用オブジェクト
Dim respBody As String ' 受信したレスポンス本文
Set httpReq = CreateObject("MSXML2.XMLHTTP")
With httpReq
.Open "GET", "https://morinokabu.com/", False ' 同期通信
.Send ' リクエスト送信
' ステータスコードが 200(OK)の場合のみ処理
If .Status = 200 Then
respBody = .ResponseText
MsgBox respBody, vbInformation, "取得した HTML"
Else
MsgBox "HTTP ステータスコード:" & .Status, vbExclamation, "エラー"
End If
End With
Set httpReq = Nothing
End Sub
ポイント
項目 | 説明 |
---|---|
MSXML2.XMLHTTP | 軽量な HTTP クライアントで、GET や POST の実行が可能です。 |
Open 第 3 引数 | False を指定すると同期通信となり、レスポンス受信までコードの実行が停止します。非同期にしたい場合は True に変更してください。 |
Status プロパティ | HTTP ステータスコードを取得できます。200 であれば正常にレスポンスが返されています。 |
応用アイデア
目的 | 実装例 |
---|---|
JSON API の取得 | レスポンスが JSON の場合、VBA-JSON ライブラリを併用してパースし、Dictionary へ格納するなどの処理が可能です。 |
POST リクエスト | .Open "POST", url, False とし、.setRequestHeader "Content-Type", "application/x-www-form-urlencoded" の後に .Send "param1=value1¶m2=value2" を送信します。 |
SSL 証明書の検証を回避 | 開発環境でのみ MSXML2.ServerXMLHTTP60 を使用し、.setOption 2, 13056 を指定すると自己署名証明書でも通信が可能です。 |
注意事項
- 同期通信 (
False
) では応答が返るまで処理が止まるため、大容量データや応答の遅いサーバーと通信する場合は非同期通信 (True
) を検討してください。 - サイト側がスクレイピングを禁止している場合や、大量アクセスを行う場合は利用規約を確認し、リクエスト間隔を空けるなど配慮が必要です。
まとめ
MSXML2.XMLHTTP
を用いることで、Excel VBA からブラウザを介さずに Web データを直接取得できます。HTML の取得だけでなく、API サーバーへの問い合わせやファイルダウンロードなどにも応用できますので、業務自動化にぜひご活用ください。