プログラムにエラーはつきものです。エラーをなくすよう努力することも大切ですが、もし予期せぬエラー(あるいはあらかじめその可能性が分かっているエラー)が発生してもプログラムの流れが止まってしまわないよう、その逃げ道もプログラムの中に織り込んでおくことが大切です。VBAは、そのようなエラー発生時の流れを制御する命令も持っています。
■エラーの種類
“エラー”と呼ばれるものは、大きく分けて、次の3種類があります。
- コンパイルエラー
ソースコード(プログラマが記述したコードのこと)をコンピュータが実行可能なコードへ内部的に変換することを「コンパイル」といいます。この時点で発生するエラーが「コンパイルエラー」です。主に文法的なエラーが検出されます。このエラーはプログラムの実行前にチェックされますので、このエラーが解決されない限り、テストも含めてプログラムを動かすことはできません。
VBEのコンパイルを実行するには、メニューの[デバッグ]-[○○○のコンパイル]か、ツールバーのボタンをクリックします。
また、VBEのオプションで[自動構文チェック]を有効にしておくと、コードを1行記述するたびに文法チェックが行なわれます。しかし、しばしばメッセージが表示されて面倒ですので、通常は無効にしておき、適宜コンパイルを実行して確認する方がよいでしょう。
- 実行時エラー
プログラムを動かしてはじめて発生するエラーです。たとえば、255までの数値しか代入できないバイト型の変数にそれより大きい値を代入したような場合に発生します。実際に大きな値が代入されるかどうか、あるいは条件分岐によってその行が実際に実行されるかどうかは、事前には分かりませんので、動作テストの中でエラーを解決していきます。
- 論理エラー
開発者の設計ミスや計算式の間違いによるエラーです。たとえば、10倍すべきところで“* 100”のようにコーディングしてしまったような場合です。このエラーは、VBEではエラーであることを認識することも解決することもできません。デバッグ作業の中で開発者が細かく確認していきます。
■エラー発生時の流れ制御
実行時エラーに関しては、「On Error」ステートメントを使うことで、プログラムを止めずに流れをコントロールすることができます。
「On Error」ステートメントには次の3種類の流れの制御方法があります。
- On Error GoTo ラベル
- 『この宣言以降のいずれかの行』でエラーが発生したとき、ラベルの部分で示された行へジャンプします。
- On Error Resume Next
- この宣言以降で発生したエラーをすべて無視します。エラーでプログラムが止まることはなく、引き続き次の行が実行されます。
- 基本的には、何らかのエラーが発生することを予期しており、かつ意図的に無視してもよいという場合に使います。単にエラーを表示させないために使うものではありません。
- On Error GoTo 0
- 上記2つのエラー処理を無効にします。On Errorステートメントが1度も使われていないのと同じ状態に戻り、エラーが発生した時点でプログラムが停止します。
一方、「On Error GoTo ラベル」のジャンプ先には、エラーを処理するプログラムを記述します。その一連のプログラムを「エラー処理ルーチン」といいます。ここでは、次のいずれかのコードを記述し、エラー発生後のプログラムの流れをどのようにするかを指示します。
- Resume ラベル ステートメント
- ラベルの部分で示された行から処理を継続します。
- Resumeステートメント
- エラーの発生した行から再実行します。
- そのまま再実行したのでは、同じエラーが発生して無限ループとなってしまいますので、エラーが起こらないような処理をエラー処理ルーチン内で施してから再実行するようにしなければなりません。
- Resume Nextステートメント
- エラーの発生した行は無視して、その次の行から処理を継続します。
プログラム例:
- エラー処理を行なわないプログラム
- はじめからエラーを無視するプログラム
変数bytDataへの代入は正常に行なわれていないため、結果的にbytDataの値はゼロとなります。しかし、エラーメッセージは表示されず、プログラムはそのまま続行されます。
- エラー処理ルーチンで流れを変えるプログラム(その1)
- エラー処理ルーチンで流れを変えるプログラム(その2)
- エラー処理ルーチンで流れを変えるプログラム(その3)
■エラー内容に応じた処理
「Err」オブジェクトを使うと、エラー内容の取得や、エラー番号に応じたエラー処理を行なうことができます。
- Err.Number
エラー番号が格納されています
- Err.Description
エラー内容を示す文章が格納されています
Dim bytData As Byte
Dim lngData As Long
On Error GoTo Err_Handler
lngData = 300
bytData = lngData
bytData = "文字列を代入"
Debug.Print bytData / 0
Exit_Here:
Exit Sub
Err_Handler:
Select Case Err.Number
Case 6 'オーバーフローエラー
'この場合はメッセージを表示してプロシージャを終了
MsgBox "オーバーフローエラーが発生しました!", vbOKOnly + vbCritical
Resume Exit_Here
Case 11 'ゼロで除算エラー
'この場合はエラーを無視して次の行から続行
Resume Next
Case Else
'その他のエラーはその内容を表示してプロシージャを終了
MsgBox "予期せぬエラーが発生しました!" & _
vbCrLf & vbCrLf & _
"エラー内容は「" & Err.Description & "」", vbOKOnly + vbCritical
Resume Exit_Here
End Select
「Case Else」のときのメッセージ例:
|