【VBAリファレンス】Excel VBAでWebスクレイピングを極める!「お探しのページがみつかりませんでした」を攻略するエラーハンドリング術

スポンサーリンク

概要

Excel VBAを活用した業務自動化において、Webスクレイピングは非常に強力な武器となります。しかし、インターネット上のコンテンツは常に変化しており、リンク切れやURLの変更によって「お探しのページがみつかりませんでした(404 Not Found)」という事態に遭遇することは避けられません。多くの初心者は、このエラーが発生した瞬間にマクロが停止し、デバッグ画面で頭を抱えることになります。本記事では、VBAを用いたWeb操作において、この「404エラー」をスマートに検出し、システムを停止させることなく安全に処理を継続するためのプロフェッショナルな手法を徹底解説します。

詳細解説:Webリクエストの仕組みとエラーの正体

VBAでWebページを取得する際、一般的には「MSXML2.XMLHTTP」や「WinHttp.WinHttpRequest.5.1」といったオブジェクトを使用します。これらはサーバーに対してHTTPリクエストを送り、サーバーからの応答(レスポンス)を待つ仕組みです。

通常、ページが正しく存在する場合は「200 OK」というステータスコードが返されます。しかし、ページが削除されていたり、URLが間違っている場合には「404 Not Found」というステータスコードが返されます。VBAの標準的なメソッドでは、このステータスコードを確認せずにHTMLの取得を試みると、空のデータや予期せぬ実行時エラーが発生し、プログラムの強制終了を招きます。

プロのエンジニアは、単にHTMLを取得するのではなく、必ず「ステータスコードの検証」をプロセスに組み込みます。これにより、プログラムは「ページがない」という事実を、エラーではなく「制御可能な状態」として受け取ることができるようになります。

サンプルコード:堅牢なHTTPリクエストの実装

以下に、WinHttpRequestオブジェクトを使用して、対象URLが存在するかどうかを判定し、404エラーを適切にハンドリングする実用的なコードを示します。


Public Function GetWebPageContent(ByVal targetURL As String) As String
    Dim http As Object
    Set http = CreateObject("WinHttp.WinHttpRequest.5.1")
    
    On Error Resume Next ' 通信エラー対策
    http.Open "GET", targetURL, False
    http.Send
    
    ' ステータスコードの判定
    If http.Status = 200 Then
        GetWebPageContent = http.ResponseText
    ElseIf http.Status = 404 Then
        Debug.Print "エラー: ページが見つかりませんでした。URL: " & targetURL
        GetWebPageContent = "404_ERROR"
    Else
        Debug.Print "エラー: HTTPステータスコード " & http.Status & " が返されました。"
        GetWebPageContent = "OTHER_ERROR"
    End If
    On Error GoTo 0
    
    Set http = Nothing
End Function

Sub ExecuteScraping()
    Dim result As String
    Dim url As String
    url = "https://example.com/not-found-page"
    
    result = GetWebPageContent(url)
    
    If result = "404_ERROR" Then
        MsgBox "対象のページが存在しません。処理をスキップします。", vbExclamation
    ElseIf result = "OTHER_ERROR" Then
        MsgBox "予期せぬ通信エラーが発生しました。", vbCritical
    Else
        ' 正常時の処理をここに記述
        Debug.Print "データ取得成功"
    End If
End Sub

実務アドバイス:安定稼働のための戦略

実務レベルでスクレイピングを行う場合、単にエラーを回避するだけでは不十分です。以下の3つの視点を持つことが重要です。

1. リトライ処理の導入
一時的なネットワークの瞬断によって404やタイムアウトが発生することもあります。一度失敗したからといってすぐに諦めるのではなく、数秒のウェイトを置いてから「3回まで再試行する」といったループ構造を組み込むことで、マクロの成功率が飛躍的に向上します。

2. ログ出力の重要性
「お探しのページがみつかりませんでした」という結果を、単に画面に表示するだけでなく、ログファイル(テキストファイルや別のExcelシート)に記録するようにしましょう。どのURLがいつ404になったのかを蓄積しておくことで、後からサイト構造の変化を分析し、メンテナンスの優先順位を付けることが可能になります。

3. ユーザーエージェントの設定
一部のサイトでは、VBAからのデフォルトのアクセスをブロックし、403 Forbiddenや404エラーに近い挙動を示す場合があります。WinHttpRequestの「SetRequestHeader」メソッドを使用して、ブラウザからのアクセスであることを示す「User-Agent」を設定することで、より安定したアクセスが可能になるケースが多いです。

まとめ

「お探しのページがみつかりませんでした」というエラーは、Webスクレイピングにおける「避けては通れない壁」です。しかし、このエラーを「プログラムを止める原因」と捉えるのではなく、「制御すべきステータスの一つ」として捉え直すことが、VBAエンジニアとしての成長への第一歩です。

今回紹介したステータスコードの検証、リトライ処理、そしてログの活用というアプローチを徹底することで、あなたのマクロは驚くほど堅牢で、メンテナンス性の高いものへと進化します。エラーが発生したときこそ、プログラムの品質を高めるチャンスです。ぜひ、今日からあなたのコードにこのロジックを組み込み、止まらない自動化ツールを実現してください。Excel VBAの世界は、あなたが思うよりもずっと広大で、論理的な思考さえあればどのような課題も克服できるのです。

タイトルとURLをコピーしました