ACCESS VBA エラー処理の方法
ACCESS VBAでシステムを開発していると、どうしても開発時に予期できないエラーは避けられないものです。
こうしたときに備えてエラー処理ルーチンを作成しておくと、万一の場合でもユーザーの操作性を損なわずに運用することが可能です。
システムエラーが出るたびに、開発者が呼び出されるのは避けたいですよね。
今回は、ACCESS VBAでのエラー処理方法についてご紹介します。
こんにちは。
はこにわガジェット (@hakoniwagadget) です。
ACCESSを使った売上管理、顧客管理などのデータベース開発を行っています。
ACCESSは基本機能だけでも十分便利ですが、VBAを使うことで格段に使いやすいデータベースを作成可能です。
この記事ではACCESSでのVBAの使い方をご紹介していきます。
目次
エラーの種類
システムを開発しているとエラーはつきものです。
まず最初に、ACCESS VBAで発生するエラーの種類を説明しましょう。
コンパイルエラー | プログラムの文法が間違っているときに発生するエラー。 例)IF節に対して、End Ifを書き忘れた場合。 |
実行時エラー | プログラムとしては間違っていないが、実行不可能な処理が指示されているエラー。 例)数値型変数にテキストを代入しようとした場合。 |
論理エラー | プログラムの文法に誤りがなく、処理も実行可能だが、結果が作成者の意図と異なるエラー。 例)計算式の途中で作成者の意図しない値(Null等)が入ったために計算結果が異なる場合。 |
このうち、コンパイルエラーや実行時エラーは比較的発見が容易です。
明示的にエラーが出てくれるからです。
コンパイルエラーの例:End Ifの書き忘れ
非常によくあるコンパイルエラーがEnd Ifの書き忘れです。
If文で条件分岐をしているのに最後にEnd Ifを書き忘れるとエラーが出ます。
実行時エラーの例:数値型変数にテキストを入力
実行時エラーの例は変数などへの入力値のデータ型の相違です。
数値型のフィールドにテキストを入力するなどの誤りは、実行時エラーで発見することができます。
しかし、論理エラーはACCESS内では正しく処理されるため発見が困難です。
意図した結果が出ているかを確認するためにも、テストシナリオを準備して、複数のパターンをテストしていくことが重要です。
エラー処理の必要性
今回紹介するエラー処理は、主に実行時エラーを回避するためのものです。
なぜなら、コンパイルエラーが発生しているようではプログラムそのものが完成しているとは言えませんし、論理エラーはACCESS側ではエラーを検知できないからです。
実行時エラーは主に、開発者の意図しない利用状況が発生することにより起こります。
できればあらゆるケースを想定して動作するように作成することが望ましいのですが、利用者の変化や利用環境の変化、もしくは業務の変化によってどうしても想定外は発生します。
こうした場合に先ほどのようなACCESSのエラー画面が利用者に出てしまうと、利用者はどうすることもできません。
これを避けるために準備しておくのがエラー処理です。
エラー処理の方法
では実際のエラー処理方法を見ていきましょう。
ACCESS VBAでのエラー処理には On Error ステートメントを使用します。
On Error ステートメントには以下の種類があります。
On Error Go To | エラーが発生したときに指定した行ラベルの位置に移動して処理を継続する |
On Error Resume Next | エラーが発生しても無視して処理を続行する |
On Error Go To 0 | エラー処理を無効にする |
それぞれの利用方法を見ていきましょう。
On Error Go To ステートメント
以下のコードでは On Error Go To ステートメントを利用してエラー処理をしています。
Public Sub 表示_ボタン_Click()
On Error GoTo Error_1
Dim syori_count As Long
syori_count = "誤り"
If syori_count > 10 Then
MsgBox "処理が完了しました。" & vbCrLf & "処理件数は" & syori_count & "件です。", vbOKOnly + vbInformation, "処理完了"
End If
Error_1:
MsgBox "エラーが発生したため処理を中断します。", vbCritical + vbOKOnly, "エラー発生"
End Sub
On Error GoTo Error_1 でエラーが発生した際には「Error_1」Ravelへ移動することを指示しています。
そして「Error_1:」以降にエラー処理を記述しています。
実際に動作させると以下のエラーメッセージが表示されます。
エラー処理ルーチンを作っていない場合のエラーは下記ですから、かなりの違いがあることがお分かりいただけると思います。
On Error Resume Next
次は On Error Resume Next です。
こちらはエラーが発生しても単純に無視して処理を進めるという命令です。
Public Sub 表示_ボタン_Click()
On Error Resume Next
Dim syori_count As Long
syori_count = "誤り"
If syori_count > 10 Then
MsgBox "処理が完了しました。" & vbCrLf & "処理件数は" & syori_count & "件です。", vbOKOnly + vbInformation, "処理完了"
End If
End Sub
上記のように記載するとエラーが発生せず、処理が進みます。
ただ、On Error Resume Next を使用する際は注意が必要です。
一見、エラーが出ないので問題がなさそうに見えますが、必要な処理が中途半端な形で実行され、想定していた結果にならないケースが発生します。
しかもエラーがでないので、その異常にユーザーが気づくことができません。
On Error Resume Next を使用する際は、その後の処理が万一スキップされても問題がない箇所を選別して利用しましょう。
On Error Go To 0
On Error Go To 0 は以降のコードではエラー処理を行わない、という命令です。
On Error Go to や、On Error Resume Next を使用した後にこの命令を記述することで、途中からエラー処理を停止させることが可能です。
以上、エラー処理の方法をご紹介しました。
ACCESSを使いこなせば、業務の効率化や自動化が実現できます。
しかし、自分でACCESSを学ぶには時間がない、難しそうで不安、という方も多いでしょう。
そんな時は、ACCESS開発歴20年以上、過去に100以上のACCESSデータベースを開発してきた私(@hakoniwagadget)にお任せください。
ACCESSの新規開発、既存のACCESSの修正、ACCESSの操作レッスンなど様々なサービスをご提供しています。
ご興味のある方は下記のサービス一覧をご覧ください。
最後までお読みいただき、ありがとうございました。