エラーへの対処
・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

本来のエラー対応
そもそもエラーが発生しないようにすることが本来のエラー対応です。
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
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
存在する場合のみブック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
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
指定のシート名があれば、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 ・・・新着記事一覧を見る
トランザクション処理|SQL入門(12月11日)
インデックスを作成して高速化(CREATE INDEX)|SQL入門(12月9日)
他のテーブルのデータで追加/更新/削除|SQL入門(12月8日)
データの削除(DELETE)|SQL入門(12月7日)
データの更新(UPDATE)|SQL入門(12月6日)
複数のSELECT結果を統合(UNION,UNION ALL)|SQL入門(12月5日)
テーブルを結合して取得(INNER JOIN,OUTER JOIN)|SQL入門(12月4日)
データベースの正規化とマスタの作成|SQL入門(12月3日)
データベースにおけるNULLの扱い方|SQL入門(12月2日)
オブジェクト変数とは何か|VBA技術解説(12月2日)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|VBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.変数宣言のDimとデータ型|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.マクロって何?VBAって何?|VBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)|VBA技術解説
10.ひらがな⇔カタカナの変換|エクセル基本操作
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。