【VBAリファレンス】Excel VBAで「お探しのページがみつかりませんでした」エラーを徹底攻略!Webスクレイピングの安定性を高める極意

スポンサーリンク

こんにちは、Excel VBA講師です。皆さんは日々の業務で、VBAを使ったWebスクレイピングを行っていますか?
「ブラウザを自動操作してデータを取得する」「Web APIを叩いて最新情報をExcelに取り込む」――これらはVBAの非常に強力な機能ですが、同時に「エラー」との戦いでもあります。

中でも、多くの開発者が一度は直面し、頭を抱えるのが『404 Not Found』、つまり「お探しのページがみつかりませんでした」というエラーです。今日は、このエラーが発生する根本的な原因を解明し、プロの現場で使える「止まらないVBA」を作るための実装術を徹底解説します。

なぜ「お探しのページ」は見つからないのか?

VBAでWebブラウザ(Internet ExplorerやSelenium WebDriverなど)を操作しているとき、このエラーは突然やってきます。主な原因は、大きく分けて以下の3つです。

1. **URLの動的な変化**: 取得しようとしているページが、ログインセッション切れやリダイレクトによって別のURLに遷移している。
2. **ネットワークの瞬断**: サーバーとの通信が一時的に途切れたり、レスポンスが遅延してタイムアウトが発生している。
3. **要素の読み込み待ち不足**: ページ自体は存在するが、JavaScriptによる動的描画が完了する前に、VBAが次の処理(要素のクリックや値の取得)に進んでしまっている。

特に、現代のWebサイトはJavaScriptを多用するため、HTMLが完全に読み込まれる前にVBAが「ページがない」「要素がない」と判断してしまうケースが非常に多いのです。

エラーを回避する「待機処理」のベストプラクティス

「お探しのページがみつかりませんでした」を防ぐ最も効果的な方法は、力任せのコードを書くのではなく、「賢い待機処理」を実装することです。初心者がやりがちな`Application.Wait`(固定時間の待機)は、推奨されません。通信環境によって最適な待機時間は変わるからです。

代わりに、プロは「条件式を用いたループ待機」を使用します。

‘ プロフェッショナルな待機処理の例
Sub WaitUntilElementLoaded(objDriver As Object, cssSelector As String, timeoutSeconds As Integer)
Dim startTime As Double
startTime = Timer

Do
On Error Resume Next
‘ 要素が存在するか確認
If Not objDriver.FindElementByCss(cssSelector) Is Nothing Then
On Error GoTo 0
Exit Sub
End If
On Error GoTo 0

‘ タイムアウトチェック
If Timer – startTime > timeoutSeconds Then
Err.Raise vbObjectError + 1, , “タイムアウト: ページまたは要素が見つかりませんでした。”
End If

DoEvents ‘ UIをフリーズさせない
Loop
End Sub

このように、`DoEvents`を挟みながら、指定した時間まで「要素が現れるのを待つ」というロジックを組むことで、ネットワークの遅延に左右されない堅牢なコードが完成します。

HTTPステータスコードを事前チェックする

Web APIを利用している場合や、`WinHttp.WinHttpRequest`オブジェクトを使用してデータ取得を行う場合は、ページの内容を読み込む前に「ステータスコード」をチェックするのが鉄則です。

Dim http As Object
Set http = CreateObject(“WinHttp.WinHttpRequest.5.1”)

http.Open “GET”, “https://example.com/target-page”, False
http.Send

‘ 200番以外はエラーとして処理を分岐する
If http.Status <> 200 Then
Debug.Print “エラー発生: ” & http.Status & ” – ” & http.StatusText
Exit Sub
End If

このコードを挟むだけで、「ページが存在しない」という事態を事前に検知し、ログを残して安全にプログラムを終了(あるいはリトライ)させることが可能になります。

リトライ処理の実装:あきらめないVBA

Web通信において、1回のエラーでプログラムを止めてしまうのは非常にもったいないことです。多くのエラーは「もう一度アクセスすれば成功する」一過性のものです。

そこで導入したいのが「リトライ(再試行)ロジック」です。

Dim retryCount As Integer
Dim maxRetry As Integer: maxRetry = 3

For retryCount = 1 To maxRetry
On Error Resume Next
‘ ここにWebアクセスのメイン処理を記述
If Err.Number = 0 Then
On Error GoTo 0
Exit For ‘ 成功したらループを抜ける
Else
Debug.Print “再試行中… (” & retryCount & “回目)”
Application.Wait Now + TimeValue(“00:00:05”) ‘ 少し休んでから再開
End If
Next retryCount

このリトライ処理を加えることで、一時的なサーバーの過負荷やネットワークの瞬断による「お探しのページがみつかりませんでした」を、ユーザーが気づかないうちに解決できるようになります。

まとめ:エラーと付き合う技術こそがプロの証

「お探しのページがみつかりませんでした」というエラーは、決してあなたのコードが悪いわけではありません。Webの世界は不確実性に満ちており、その不確実性をどれだけ予測し、吸収できるかがVBAエンジニアの腕の見せ所です。

1. **静的な待機(固定時間)をやめる**
2. **ステータスコードを常に監視する**
3. **失敗したときのための「リトライ処理」を用意する**

この3つの原則を守るだけで、あなたの作成するVBAツールは、驚くほど安定したものへと進化するはずです。エラーは怖くありません。エラーを「想定内」のイベントとして処理できるようになったとき、あなたはまた一つ、VBAのプロフェッショナルに近づいたと言えるでしょう。

次回の更新では、Seleniumを使った高度なWebスクレイピング環境の構築方法について解説します。ぜひ、ご期待ください!

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