エラー処理ルーチン

Close

Excel VBAあらかると

 エラーが発生したときに「トラップエラー」などと呼び、トラップとは「わな」 「エラーのわな」と言った意味。
プログラム中にエラー処理を施していないと致命的なエラーとなりプログラムの実行が停止します。
ロジック中に考えられるエラー処理を施すことは、非常に重要であり、かつそのプログラムを使う人への心配りにもなります。
例えば、ブックを読み込む場合に対象となるブックが存在しない場合、エラー処理を施さなければプログラムの実行途中で停止してしまい使う人は原因が分からず困惑してしまいます。
エラー処理を施せば、ユーザーにその原因を伝えることができ対応を促すことができます。
いろいろな局面でエラーが発生し全てを記載することはできませんがその真髄的な使い方をご紹介します。

 エラー処理ステートメント
On Error ステートメント
エラー処理ルーチンを有効にし、プロシージャ内でのエラー処理ルーチンの位置を指定します。エラー処理ルーチンを無効にするときに使うこともできます。
On Error ステートメントを使用していない場合に実行時エラーが発生すると、そのエラーは致命的エラーになり、
エラー メッセージが表示されてプログラムの実行が停止します。


ステートメント形式
On Error GoTo 行ラベル 指定した行ラベルから始まるエラー処理ルーチンを有効にします。
On Error Resume Next 実行時エラーが発生してもプログラムを中断せず、エラーが発生したステートメントの次のステートメントから実行を継続します。
On Error GoTo 0 現在のプロシージャに含まれる使用可能なエラー処理ルーチンを無効にします。
   


 エラー処理サンプル
その1 キーボードから入力したシート名により指定シートへ移動する。入力したシートが存在しない時のエラー処理です。サンプルブックのシート名は 「ido1」 と 「ido2」 です。
コードを参照して頂ければ分かりますがシート名をキッチリ入力しないとプログラムは終了しません。ご注意下さい。
マクロ名: sp1_シートの移動

  Sub sp1_シートの移動()

  On Error GoTo err_rtn

i_rtn:
  snam = InputBox("シート名を入力   <シート名 ido1 & ido2>")

' 指定したシートへの移動 (存在しない場合ここでエラートラップが発生する。)
  Sheets(snam).Select
  Exit Sub

' エラー処理ルーチン
err_rtn:
' エラー番号の評価
  Select Case Err.Number
'   シートが存在しない場合 <エラーコード:9 → インデックスが有効範囲にありません。>
    Case 9
      MsgBox ("入力シート名は存在しません。")
    Case Else
'    以外のエラー
      MsgBox Err.Number
      Exit Sub
  End Select

' シート名の入力から再開します。 i_rtn を指定しない場合はエラーの発生場所から再開します。
  Resume i_rtn

End Sub

その2 テキストファイルを開きそのファイルを削除した時に発生するエラー処理です。
マクロ名: sp2_ファイルの削除

Sub sp2_ファイルの削除()

  On Error GoTo err_rtn

' 出力ファイルを開きます。 オープン命令と同時にファイルがCREATEされます。
  Open "sample.txt" For Output As #1

' ファイルの削除を試みます。但し、オープンされているのでこの命令はエラーとなります。
  Kill "sample.txt"

  Exit Sub

' エラー処理ルーチン
err_rtn:
' エラー番号の評価
  Select Case Err.Number

'   この場合のエラーは 「コード:55 ファイルは既に開かれています。」 となります。
    Case 55
      MsgBox ("ファイルは既にOpenされています。Close後に削除を実行します。")

'   削除するため開いたファイルを閉じます。
      Close #1

    Case Else
'     以外のエラー エラーメッセージとその番号を表示しています。
      MsgBox ("システムが異常です。 エラーコード: " & Err.Number)

'     プログラムを終了させます。
      Exit Sub

  End Select

' エラーが発生した命令から処理を再開します。この場合は、KILL構文からとなります。
  Resume

End Sub
※実行は、Open "sample.txt" For Output As #1 をコメントにして確認してみて下さい。「システムが異常です」のメッセージとエラーコード:53 「ファイルが見つからない。」のエラーが返値となります。エラーコード表については こちら を参照ください。

その3 コマンドボタンとリンクするブックを開く処理。対象ブックが存在しない時のエラー処理です。
原因は、ユーザーが故意的にブックを削除した場合です。
※このルーチンは、Product'sで紹介している「Excelマスター道」でコーディングしている内容です。サンプルブックは用意していませんのでご了承ください。
Private Sub CommandButton1_Click()

' エラー処理
  On Error Resume Next

' ワークブックを開く
  Workbooks.Open FileName:=ThisWorkbook.Path & "\Exno001\" & "Exfmenu.xls"

' エラー全般を判断する。
  If Err <> 0 Then
    MsgBox ("[" & Err & "] 基本編のメニューがありません。" _
    & "再インストールが必要な可能性があります。")
    Exit Sub
  End If

  Windows("Exfmenu.xls").Activate
  ActiveWindow.WindowState = xlMaximized

  Workbooks("Exall.xls").Close False

End Sub
※このロジックは、閲覧する皆さんが応用してサンプルを作ってお試しください。  ^^/


 お試し版ダウンロード 
 試行のためのサンプルを用意しました。

○Download file: excv100.lhz

○圧縮ファイルの内容: 実行ブック  excv100.xls

○解凍後、フォルダー  任意です。

○実行方法:  マクロの実行を選択し「sp1_シートの移動」と「sp2_ファイルの削除」を実行し試行ください。