概要:自動化の最大の敵、404エラーに立ち向かう
Excel VBAを用いたWebスクレイピングやAPI連携は、業務効率化の強力な武器です。しかし、多くの開発者が直面するのが「お探しのページがみつかりませんでした(HTTP 404 Not Found)」という壁です。URLの変更、動的なコンテンツの読み込み遅延、あるいはサーバー側の仕様変更など、原因は多岐にわたります。
本記事では、単にエラーを回避するだけでなく、VBAを使って「存在しないページ」をスマートに検知し、ログとして記録し、次のアクションへと繋げるためのプロフェッショナルな実装手法を解説します。安定した自動化システムを構築するために不可欠な、堅牢な例外処理の技術を習得しましょう。
詳細解説:HTTPステータスコードを正しく読み解く
VBAでWebサイトにアクセスする際、一般的に「MSXML2.XMLHTTP」や「WinHttp.WinHttpRequest」ライブラリを使用します。これらはサーバーから返されるHTTPステータスコードをプロパティとして保持しています。
初心者が陥りやすい罠は、ページが存在しないにもかかわらず、その後の処理(DOM操作やデータ抽出)を強行しようとすることです。これにより、「オブジェクト変数またはWithブロック変数が設定されていません」といった実行時エラーが発生し、プログラムが強制終了してしまいます。
重要なのは、`Status`プロパティを必ずチェックする習慣です。HTTP 200(成功)以外のレスポンスが返ってきた場合、即座に処理を中断するか、リトライ処理へ移行するロジックを組み込む必要があります。特に動的ページの場合、JavaScriptの読み込み待ちが不十分で、サーバー側が「ページなし」と判断するケースもあります。この場合は「待機処理(Sleep)」を適切に組み合わせることで解決可能です。
サンプルコード:堅牢なエラーハンドリングの実装
以下は、WinHttpRequestを使用してページ存在を確認し、404エラーを検知した際にログを出力する実務的なコードサンプルです。
Option Explicit
' 参照設定: Microsoft WinHTTP Services, version 5.1
Sub CheckWebPageStatus()
Dim http As WinHttpRequest
Dim targetURL As String
Set http = New WinHttpRequest
targetURL = "https://example.com/target-page"
On Error Resume Next ' ネットワークエラー対策
http.Open "GET", targetURL, False
http.Send
' HTTPステータスコードの判定
If http.Status = 200 Then
Debug.Print "アクセス成功: " & targetURL
' ここにデータ抽出処理を記述
ElseIf http.Status = 404 Then
Call WriteLog("エラー: 404 お探しのページがみつかりませんでした - " & targetURL)
Else
Call WriteLog("エラー: ステータスコード " & http.Status & " が返されました")
End If
On Error GoTo 0
Set http = Nothing
End Sub
' ログ出力用サブプロシージャ
Sub WriteLog(msg As String)
Dim logPath As String
logPath = ThisWorkbook.Path & "\error_log.txt"
Open logPath For Append As #1
Print #1, Now & " : " & msg
Close #1
MsgBox "エラーが発生しました。ログを確認してください。", vbExclamation
End Sub
実務アドバイス:なぜそのエラーは起きるのか
実務現場において「お探しのページがみつかりませんでした」というエラーが頻発する場合、以下の3点を疑ってください。
1. URLの動的構築ミス:
VBA内で文字列結合を行ってURLを生成している場合、不要なスペースやエスケープ漏れがないか確認してください。URLエンコードが必要な日本語パラメータが含まれている場合は、`ScriptControl`などを利用して適切に処理する必要があります。
2. セッション情報の欠落:
ログインが必要なサイトでは、Cookieやヘッダー情報が正しく送信されていないと、サーバー側が「未認証」として404や403を返すことがあります。F12キーの開発者ツールを使用して、ブラウザがどのようなリクエストを送っているのかを分析することが第一歩です。
3. サーバーの保護機能(WAF/Bot検知):
短時間に大量のアクセスを行うと、サーバー側で「機械的なアクセス」とみなされ、意図的に404や403を返されるケースがあります。この場合は、アクセス間隔を空ける(Sleepを入れる)、あるいはUser-Agentをブラウザのものに偽装するなどの対策が求められます。
特に、Webサイトの構造変更(リニューアル)は予告なく行われます。「昨日は動いていたのに今日は動かない」という現象は、多くの場合、対象サイトのHTML構造が変化したことによるものです。エラーが起きた際、VBAのコードを疑う前に、まずはブラウザでそのURLを開き、本当にページが存在するかを確認する癖をつけましょう。
まとめ:保守性の高いVBAコードを目指して
「お探しのページがみつかりませんでした」というエラーは、単なるプログラムの不具合ではなく、外部環境との対話において避けて通れない事象です。プロフェッショナルなVBA開発者は、このエラーを「発生させない」ことよりも、「発生した時にどう振る舞うか」を重視します。
ログファイルへの記録、ユーザーへの適切なメッセージ表示、そして処理の自動復帰。これらを実装することで、あなたの作成したツールは「壊れやすいスクリプト」から「現場で信頼される業務システム」へと進化します。
Webスクレイピングの自動化は、常に変化するWebの世界との戦いです。今回紹介したエラーハンドリングの手法をベースに、各サイトの特性に合わせた柔軟な設計を取り入れてください。VBAの可能性は、あなたが例外をどう制御するかによって、さらに大きく広がります。継続的な学習と、エラーログからの深い分析が、さらなるスキルアップへの鍵となるはずです。
