Excel VBA でブラウザを介さず Web データを取得する方法

ブラウザを起動せずに 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&param2=value2" を送信します。
SSL 証明書の検証を回避開発環境でのみ MSXML2.ServerXMLHTTP60 を使用し、.setOption 2, 13056 を指定すると自己署名証明書でも通信が可能です。

注意事項

  • 同期通信 (False) では応答が返るまで処理が止まるため、大容量データや応答の遅いサーバーと通信する場合は非同期通信 (True) を検討してください。
  • サイト側がスクレイピングを禁止している場合や、大量アクセスを行う場合は利用規約を確認し、リクエスト間隔を空けるなど配慮が必要です。

まとめ

MSXML2.XMLHTTP を用いることで、Excel VBA からブラウザを介さずに Web データを直接取得できます。HTML の取得だけでなく、API サーバーへの問い合わせやファイルダウンロードなどにも応用できますので、業務自動化にぜひご活用ください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次