目標
VBAのエラー処理の基本を理解して利用できる
Errオブジェクト・Numberプロパティを理解して利用できる
VBAにおけるエラーの概要
VBAにおけるエラーとは
VBAにおけるエラーとはプロシージャの実行中に発生する問題で処理の中断や強制終了の原因となります。
VBAにおけるエラー処理
エラーは全てが致命的な問題となる訳ではありません。また目的とする処理としては必要のないエラーも発生します。このようなエラーに対してはエラーの回避を行いシステムの稼働を止めない方法をとる必要があります。VBAでは、このことを「エラー処理」といい、その処理を行うプログラムのことを「エラートラップ」と呼びます。
目的の処理に必要のないエラーとは
一度作成したプロシージャはプログラムなので内容が変わることはありません。ですが、処理の対象となるオブジェクト(変数・配列・セル・シート)はエクセルファイルの状態やユーザーからの操作によって変化します。この変化によって、エラーが引き起こされることがあります。
例えば、入力ボックスに数字を入力してもらって動かすプロシージャがあったとすると、このプロシージャでは数字を格納できる変数を利用していたりします。この時、この変数はInteger型などの数字を扱うもので宣言されているはずですが、もしもユーザーが入力時に間違えて文字列を入力した場合はエラーが発生してしまいます。
こうした場合はエラーによってシステムが止まってしまうよりもユーザーに「正しい値を入力してください」などの注意を促してシステムを止めない方がシステムとして正しい動きと言えます。
このような時にエラー処理を行わせてシステムが停止するのを回避させ稼働を続けるようにします。
エラー処理を行わない場合の処理
エラー処理を行わない場合の処理
シートの準備
次のようなデータベースから社員番号を入力して社員名を検索するプログラムでエラーを発生させてみようと思います。
サンプルプロシージャ1
Sub exampleError()
Dim item As Long
Dim empColumns As Range
Dim hitEmp As Range
Set empColumns = Range(Cells(2, 1), Range("A1").End(xlDown))
item = InputBox("検索する社員の社員番号を入力してください。")
Set hitEmp = empColumns.Find(item, LookAt:=xlWhole)
MsgBox Cells(hitEmp.Row, hitEmp.Column + 1).Value
End Sub
実行結果
エラーが起こるとシステムが停止となります。この停止を回避するためにエラー処理が利用されます。
エラー処理の利用方法(基本1)
On Error Resume Nextステートメント
On Error Resume Nextステートメントとは
エラートラップを開始するステートメントです。これによって「エラー処理」が有効になります。このステートメントの後に書かれた処理はエラーが発生した場合は無視(回避)されます。
On Error Resume Nextステートメントの利用方法
On Error Resume Nextステートメントは「回避したいエラーが起こる処理の前」に記述します。
On Error Resume Nextステートメントの文法
プロシージャ内で「エラートラップ」を「有効」にしたい処理の前に記述します。下の構文では処理4と処理5がエラー発生時に無視されます
Sub プロシージャ()
処理1
処理2
処理3
On Error Resume Next
処理4
処理5
End Sub
サンプルプロシージャ2
サンプルプロシージャ1を少し改良したものです。
Sub exampleError()
Dim item As Long
Dim empColumns As Range
Dim hitEmp As Range
Set empColumns = Range(Cells(2, 1), Range("A1").End(xlDown))
On Error Resume Next
item = InputBox("検索する社員の社員番号を入力してください。")
Set hitEmp = empColumns.Find(item, LookAt:=xlWhole)
MsgBox Cells(hitEmp.Row, hitEmp.Column + 1).Value
End Sub
実行結果
「On Error Resume Next」を記述するとそれ以降のプログラムはエラートラップの有効範囲となります。上のキャプチャでは赤枠の部分です。エラーが発生した場合はこの部分は無視されます。その後、End Subによってエラートラップが終了となります。
エラー処理の利用方法(基本2)
ErrオブジェクトとNumberプロパティ
ErrオブジェクトとNumberプロパティ
エラー処理を実装しているかに関わらず、プロシージャ内でエラーが発生した場合、発生したエラーの情報やエラー番号は「Errオブジェクト」に格納されます。この情報は「Errオブジェクト」の「Numberプロパティ」を利用して取得することができ、プロシージャ内で利用することができます。
ErrオブジェクトとNumberプロパティの利用方法
「Err.Number」とするとエラー番号を取得することが出来ます。
エラー番号一覧(※よく利用されるものだけを載せています。)
エラー番号 | エラーの内容 |
5 | プロシージャの呼び出し、または引数が不正です。 |
6 | オーバーフローしました。 |
7 | メモリが不足しています。 |
9 | インデックスが有効範囲にありません。 |
13 | 型が一致しません。 |
35 | Sub または Function が定義されていません。 |
53 | ファイルが見つかりません。 |
55 | ファイルは既に開かれています。 |
76 | パスが見つかりません。 |
419 | オブジェクトを利用できません。 |
422 | プロパティが見つかりません。 |
423 | プロパティまたはメソッドが見つかりません。 |
424 | オブジェクトが必要です。 |
448 | 名前付き引数が見つかりません。 |
449 | 引数は省略できません。または不正なプロパティを指定しています。 |
1004 | アプリケーション定義またはオブジェクト定義のエラーです。 |
サンプルプロシージャ3
Sub exampleError()
Dim item As Long
Dim empColumns As Range
Dim hitEmp As Range
Set empColumns = Range(Cells(2, 1), Range("A1").End(xlDown))
On Error Resume Next
item = InputBox("検索する社員の社員番号を入力してください。")
If Err.Number = 13 Then
MsgBox "正しい値を入力してください"
End If
Set hitEmp = empColumns.Find(item, LookAt:=xlWhole)
MsgBox Cells(hitEmp.Row, hitEmp.Column + 1).Value
End Sub
実行結果
「On Error Resume Next」を記述するとそれ以降のプログラムはエラートラップの有効範囲となります。「On Error Resume Next」以降の部分でErr.Numberを利用すると該当するエラー番号で専用の処理を行わせることが出来ます。(スキップせずに別の処理を行わせます。キャプチャの青枠の部分です。)その後は、再度プログラムを無視して(ふたつ目の赤枠部分)End Subによってエラートラップが終了となります。
今回は以上となります。
ブックマークのすすめ
「ほわほわぶろぐ」を常に検索するのが面倒だという方はブックマークをお勧めします。ブックマークの設定は別記事にて掲載しています。