エラーへの対処
・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 ・・・新着記事一覧を見る
TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.セルのクリア(Clear,ClearContents)|VBA入門
8.メッセージボックス(MsgBox関数)|VBA入門
9.条件分岐(Select Case)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門
- ホーム
- マクロVBA入門編
- VBAエキスパート対策
- エラーへの対処
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。