見出し画像

【Excel VBA】ループ内のエラー処理で「過去のエラー」を検知してしまう問題と、その解決法

Forループの中で、1行ずつエラーが発生するかどうかをチェックする処理を書いたとします。2行目でエラーが発生し、正しく検知できたのに、なぜか、エラーが起きなかったはずの3行目や4行目の処理でも、「エラーが発生した」と判定されてしまう…。そんな、奇妙な現象に遭遇したことはありませんか?

この、一度発生したエラー情報が、その後のループにまで影響を及ぼしてしまう問題の原因を理解し、ループの各回で、エラー状態を、きちんとリセットするための、正しい方法を学びたい。

今回は、VBAのErrオブジェクトの性質と、それをリセットするためのErr.Clearメソッドの、非常に重要な使い方について解説します。

  • キーとなる考え方:Errオブジェクトは、自動ではリセットされない: On Error Resume Nextを使っているときにエラーが発生すると、VBAは、そのエラー情報をErrという、特別な「エラー記録係」オブジェクトに書き込みます。 このErrオブジェクトは、一度エラーが記録されると、次に別のエラーが起きるか、あるいは、プログラムから明示的に「リセットしなさい」と命令されるまで、そのエラー情報を保持し続ける、という性質を持っています。 これが、「過去のエラー」を、次のループで、再び検知してしまう問題の根本的な原因です。

  • 解決策:手動でリセットする (Err.Clear):

    • 考え方: この問題を解決するのが、Err.Clearという、Errオブジェクトを、手動で「エラーなし」の状態にリセットするための、専用の命令です。

    • 正しい処理の流れ: Forループの中で、エラーが発生する可能性のある処理を実行した後、If文などでエラーの有無をチェックします。そして、そのエラーチェックと、それに対応する処理が終わったら、ループの次の回に進む直前に、Err.Clearを実行します。 これにより、次のループは、常にErrオブジェクトがクリーンな状態からスタートすることが保証され、各回の`エラー判定が、他の回の影響を受けなくなります。

私の運営サイトでは、このErr.Clearを使って、ループ内の各処理が終わるたびにエラー状態をリセットする、という、安全なエラーハンドリングの具体的なVBAコードを、Err.Clearがない場合の間違った動作と比較しながら、分かりやすく解説しています。

▼詳しい解説とサンプルコードはこちら
【VBA】Err.Clear の使い方 | ループ内のエラー処理で必須のテクニック

On Error Resume Nextをループの中で使う場合は、エラー処理の最後にErr.Clearでエラー情報をリセットする。これは、VBAで、より精密で、信頼性の高いエラーハンドリングを実装するための、重要な基本テクニックです。

いいなと思ったら応援しよう!