エラーへの対処
・On Error Goto
・On Error Resume Next
・Errorオブジェクトほか
【ここでのポイント】
そこはベーシックの出題範囲なので、ここでは省略します。
もし、不安な部分があるようなら、デバッグの基礎 を復習しておいてください。
エラーへの対処は、極めて簡単です。
On Error Goto
On Error Resume Next
どちらかを使います。
そして、
エラー発生の理由は、Errオブジェクトのプロパティを調べるだけです。
にもかかわらず、大項目として試験範囲に列挙されているのには理由があります。
そもそもマクロは作業を自動化するものなのに、停止してしまってはどうしようもありません。
そこで、エラーへの対処が必要になります。
そしてVBAとしての対処は、上記のとおり難しいものではありません。
これには経験が必要です。
VBAのステートメントはそれほど難しくないのでしっかり覚えることは当然として、
いろいろなエラー発生パターンを実際のVBAコードで体験しておくことです。
On Error Goto
実行時エラーが発生した時に、制御を指定の行ラベルに移動させるものです。
Sub Sample
On Error GoTo Label01
・・・
'ここでエラー発生した場合、Label01に制御が移ります
・・・
Exit Sub
Label01:
エラー時の処理
End Sub
Label01:
これが、行ラベルです。
On Error Resume Next
Dim i As Long
On Error Resume Next
i = "ABC"
If Err.Number <>
0 Then
MsgBox Err.Description
Err.Clear
End If
この場合、メッセージボックスには、
「型が一致しません」と表示されます。
クリアしないと、エラー情報はそのまま残っています。
Errorオブジェクト
Err.Clear | すべてのプロパティの設定値をクリアするメソッド |
Err.Description | エラーに関する簡単な説明 |
Err.HelpContext | ヘルプ ファイルのトピックに対応するコンテキスト番号 |
Err.HelpFile | ヘルプ ファイルへの絶対バス |
Err.LastDllError | 最後にダイナミック リンク ライブラリ (DLL) を呼び出したときのエラー コード |
Err.Number | エラーを指定する数値。エラーではない場合は0 |
Err.Source | エラーの発生元のオブジェクトまたはアプリケーションの名前 |
Number プロパティの値でエラーの原因を判別します。
On Error Goto 0
On Error GoTo
または
On Error Resume Next
これらのエラー処理を無効にします。
On Error の有効範囲
と
On Error Resume Next
On Error GoTo 0が出てくるか、
そのプロシージャが終了するまでが有効範囲となります。
呼び出されたプロシージャ内でOn Error対応されていないエラーが発生した場合は、
呼び出されたプロシージャはその場で終了します。
呼び出し元のプロシージャに戻ってからは、On Errorの指定に従い動作します。
Sub test1()
On Error GoTo Err_Exit
Call test2 'この中でエラー発生しても、On Error Go Toは有効
MsgBox "正常終了"
Exit Sub
Err_Exit:
MsgBox "異常終了" & vbLf & Err.Description
End Sub
Sub test2()
Dim i As Long
On Error Resume Next
i = "A" 'このエラーは無視
On Error GoTo 0
i = 0
i = i / i 'ここでエラー発生→プロシージャを抜けます
i = 1 'これは実行されません
End Sub
上記の「test1」の実行結果は、

本来のエラー対応
そもそもエラーが発生しないようにすることが本来のエラー対応です。
Sub sample1()
Dim sBook As String
sBook = InputBox("ブック名を入力してください。")
Workbooks.Open ThisWorkbook.Path & "\" & sBook
End Sub
存在しないブックを開いたときはエラーとなります。

Sub sample2()
Dim sBook As String
On Error GoTo Err01
sBook = InputBox("ブック名を入力してください。")
Workbooks.Open ThisWorkbook.Path & "\" & sBook
MsgBox sBook & "を開きました。"
Exit Sub
Err01:
MsgBox sBook & "は存在しません。"
End Sub
Sub sample3()
Dim sBook As String
On Error Resume Next
sBook = InputBox("ブック名を入力してください。")
Workbooks.Open ThisWorkbook.Path & "\" & sBook
If Err.Number = 0 Then
MsgBox sBook & "を開きました。"
Else
MsgBox sBook & "は存在しません。"
End If
End Sub
上記の2つのVBAは、どちらも同じことをしています。
On Error GoToとOn Error Resume Nextの違いだけです。
ブックOpenの前に、そのファイルが存在するかどうかのチェックをするべきです。
Sub sample4()
Dim sBook As String
On Error Resume Next
sBook = InputBox("ブック名を入力してください。")
If Dir(ThisWorkbook.Path & "\" & sBook) = "" Then
MsgBox sBook & "は存在しません。"
Else
Workbooks.Open ThisWorkbook.Path & "\" & sBook
MsgBox sBook & "を開きました。"
End If
End Sub
Dir関数で、ファイルが存在するか確認し、
存在する場合のみブックOpenしています。
シートの存在確認
Sub sample5()
Dim sSheet As String
sSheet = InputBox("シート名を入力してください。")
Worksheets(sSheet).Select
End Sub
存在しないシートを選択したときはエラーとなります。

Sub sample6()
Dim sSheet As String
On Error GoTo Err01
sSheet = InputBox("シート名を入力してください。")
Worksheets(sSheet).Select
MsgBox sSheet & "を選択しました"
Exit Sub
Err01:
MsgBox sSheet & "は存在しません。"
End Sub
Sub sample7()
Dim sSheet As String
On Error Resume Next
sSheet = InputBox("シート名を入力してください。")
Worksheets(sSheet).Select
If Err.Number = 0 Then
MsgBox sSheet & "を選択しました"
Else
MsgBox sSheet & "は存在しません"
End If
End Sub
上記の2つのVBAは、どちらも同じことをしています。
On Error GoToとOn Error Resume Nextの違いだけです。
シート選択の前に、そのシートが存在するかどうかのチェックをするべきです。
Sub sample8()
Dim sSheet As String
Dim sht As Worksheet
Dim flg As Boolean
On Error Resume Next
sSheet = InputBox("シート名を入力してください。")
flg = False
For Each sht In Worksheets
If LCase(sht.Name) = LCase(sSheet) Then
flg = True
Exit For
End If
Next
If flg = True Then
Worksheets(sSheet).Select
MsgBox sSheet & "を選択しました"
Else
MsgBox sSheet & "は存在しません"
End If
End Sub
For Eachで、ワークシート コレクションを処理しています。
指定のシート名があれば、flgにTrueを入れています。
flgはBoolean変数で、TrueかFalseだけが入るデター型です。
判定時にLCaseで小文字に統一してから判定しています。
演算エラー対応の演習
Sub sample11()
Dim i
Dim j As Integer
i = InputBox("データを入力してください")
j = i + 100
MsgBox j
j = 10000 / i
MsgBox j
End Sub
このマクロを実行した時、
入力した値によっては、以下のエラーが発生します。
数値のデータ型変数に文字列を入れた時はエラーとなります。



On Errorでエラー対応してみましょう。
そして、
On Errorを使わずに、エラー発生しないように対応してみしょう。
数値かどうかの判定は、IsNumeric関数を使います。
もし、これが書けないようであれば、もう一度最初から学び直してください。
【業務改善の実務】
エラー対応を考えて書かれているかどうかは直ぐに分かります。
そして、
どのように対応しているかを見れば、その人のVBAスキルがはかれます。
まさに、VBA上級者としては腕の見せ所でもあります。
むやみやたらにエラー対応すれば良いというものではありません。
例えば、
シートを扱う時に、毎回シートの存在チェックをする必要があるかという事です。
シートを削除したらマクロが動かなくなることは、誰でもわかることです。
もし、それさえ分からない人が使うブックなら、ブックを保護しておくべきなのです。
従って、本来あるべきシートが存在しているかのチェックをすることの是非は考えるべきです。
決まりを守って使う事を前提として、マクロ作成することがトータルコストの削減になります。
【本サイト内の関連ページ】
実行時にトラップ可能なエラー番号一覧と対処
VBAエキスパート公式テキスト
こちらは必須として購入した方が良いでしょう。
ちょっと高いなーとは思いますが、
書籍を購入することで、学習用データが提供されています。
・サンプルブック
・VBAエキスパート模擬問題
これらが使えるようになります。
このシリーズでは、テキストを読みながら学習していることを前提とします。
同じテーマ「VBAエキスパート対策」の記事
プロシージャ
イベント
ステートメント(スタンダード)
関数
エラーへの対処
APIとOLEオートメーション
変数と配列
レジストリの操作
ファイルの操作
ユーザーフォームとメニューの操作
VBAスタンダード試験対策まとめ
新着記事NEW ・・・新着記事一覧を見る
VBA100本ノック 100本目:WEBから100本ノックのリストを取得|VBA練習問題(3月3日)
VBA100本ノック 99本目:自動席替え(行列と前後左右が全て違うように)|VBA練習問題(3月2日)
VBA100本ノック 98本目:席替えルールが守られているか確認|VBA練習問題(3月1日)
VBA100本ノック 97本目:Accessデータを取得(グループ集計)|VBA練習問題(2月27日)
VBA100本ノック 96本目:Accessデータを取得(マスタ結合&抽出)|VBA練習問題(2月26日)
VBA100本ノック 95本目:図形のテキストを検索するフォーム作成|VBA練習問題(2月24日)
VBA100本ノック 94本目:表範囲からHTMLのtableタグを作成|VBA練習問題(2月23日)
VBA100本ノック 93本目:複数ブックを連結して再分割|VBA練習問題(2月22日)
VBA100本ノック 92本目:セルの色を16進で返す関数|VBA練習問題(2月20日)
VBA100本ノック 91本目:時間計算(残業時間の月間合計)|VBA練習問題(2月19日)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.マクロって何?VBAって何?|VBA入門
5.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
6.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
7.繰り返し処理(For Next)|VBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.マクロはどこに書くの(VBEの起動)|VBA入門
10.とにかく書いてみよう(Sub,End Sub)|VBA入門
- ホーム
- マクロVBA入門編
- VBAエキスパート対策
- エラーへの対処
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。