Excel VBA エラー処理

スポンサーリンク
スポンサーリンク

エラー処理

マクロの実行中に何らかの原因でエラーが発生したとき
そのままでは、マクロがデバックモードで停止してしまいます。

エラーが起きてもデバックモードで停止しないようにするためには
エラーが発生したときの動作を組み込んでおかなければいけません。

エラー処理の方法は大きくわけて、2種類あります。

  1. エラーが発生してもそのまま続行する方法
  2. エラーが発生したらジャンプして処理を終了する方法

エラー処理をする場合は、エラーが発生するコードの前に
On Error(オンエラー)ステートメントを実行します。

1.のエラーは発生してもそのまま続行する方法

On Error Resume Next(オンエラーリズームネクスト)をエラーが発生するコードの前に記述します。
エラーが発生したら、
エラーが発生したコードの次の行のコードに処理が移動して処理を継続させます。
エラーを無視しても問題が無い場合に使用します。

On Error Resume Next ステートメント使用コード例

Sub 集計シート作成()
Application.ScreenUpdating = False
Dim シート数 As Long
Dim i As Long
Dim maxcol As Long
Dim maxrow As Long
 シート数 = Sheets.Count
 Sheets.Add after:=Sheets(Sheets.Count)
 ActiveSheet.Name = "集計シート"
 Sheets(1).Activate
 Sheets(1).Range("A1").CurrentRegion.Select
 Selection.Resize(Selection.Rows.Count - 1).Copy
 Sheets("集計シート").Activate
 Sheets("集計シート").Range("A1").PasteSpecial
 On Error Resume Next
For i = 2 To シート数
 Sheets(i).Activate
 Sheets(i).Range("A1").CurrentRegion.Select
 Selection.Offset(1).Resize(Selection.Rows.Count - 2).Copy
 Sheets("集計シート").Activate
 Sheets("集計シート").Cells(Rows.Count, 1).End(xlUp).Offset(1).PasteSpecial
Next i
 maxcol = Cells(1, Columns.Count).End(xlToLeft).Column
 maxrow = Cells(Rows.Count, 1).End(xlUp).Row
With Cells(maxrow, 2).Offset(1)
 .Resize(, maxcol - 1).Formula = "=SUM(" & Range("B2", Range("B" & maxrow)).Address(False, False) & ")"
End With
 Cells(maxrow, 1).Offset(1) = "総合計"
 Columns.AutoFit
 Range("A1").CurrentRegion.Select
 Selection.Borders.LineStyle = True
 Range(Cells(maxrow + 1, 1), Cells(maxrow + 1, maxcol)).Interior.Color = RGB(192, 192, 192)
Application.ScreenUpdating = true
End Sub

このコードは複数シートのデータを集計シートにまとめるの記事で解説しているコードです。
16行目から繰り返し処理で各シートのデータをコピーして
集計シートのデータ最終行に貼付ける処理をしていますが、

コピーするシート内にデータが存在しない場合
18行目の Sheets(i).Range(“A1”).CurrentRegion.SelectのCurrentRejion.selectでデータをセレクト出来ないためエラーが発生し、マクロがデバックモードで、停止してしまします。

そのために、16行目の繰り返し処理の前に
15行目で、On Error Resume Nextステートメントを宣言しています。

こうすることで、万が一、データが無いシートが存在して
18行目でエラーになっても、エラーにならずに19行目に処理が移動して続行されます。


2.のエラーが発生したらジャンプして処理を終了する方法

On Error GoTo(オンエラーゴトウ)ステートメントを使用します。

On Error GoTo は 後ろにラベル名を指定して
エラーが発生すると処理がラベルの行に間のコードを飛び越えて移動します。

ラベル行の後に、エラーに対する処理を記述します。

On Error GoTo ステートメントの使用コード例

Sub エラー()
Dim シート名 As String
On Error GoTo エラー処理
シート名 = InputBox("シート名を入力してください。")
 Worksheets.Add
 ActiveSheet.Name = シート名
Exit Sub
エラー処理:
 Application.DisplayAlerts = False
 ActiveSheet.Delete
 Application.DisplayAlerts = True
 MsgBox "シート名が取得できませんでした。"_ 
& vbCrLf & "または、同じシート名が存在します。"
End Sub

このコードはワークシートを追加するコードで
InputBoxを使ってシート名を入力してもらいます。

シート名を入力しないでInputBoxのOKボタンを押した場合や
すでにあるシート名を入力した場合にエラーになります。

3行目にOn Error GoToステートメントを宣言して ラベルを「エラー処理」にしています。
エラーが発生したら、
8行目の「エラー処理:」まで処理が飛び9行目からの処理が実行されます。

9行目は、10行目で新しく作成された名前が入力されていない
シートを削除しているので、「本当に削除していいですか?」とアラートがでるので、
DisplayAlerts = Falseでアラートがでないようにしています。

11行目は、DisplayAlerts = Trueでアラートを元に戻しています。

12行目は、MsgBox関数でエラーを知らせています。

実行結果 エラーにならない場合



実行結果 エラーの場合


スポンサーリンク
スポンサーリンク

フォローする

スポンサーリンク
スポンサーリンク