EXCEL VBAを少し研究してみることにしてみました。
で、手始め?に「エラー処理」のやり方を考えてみることに。
まず、グローバル変数で下記の2つをを宣言して、
どこのプロシージャーでも利用できるようにしておきます。
Public ErrorRaised As Boolean
Public ErrorMessage As String
この変数の使い方はエラーが発生したプロシージャーで出力したい内容を設定できるようにするために、そのプロシージャーでメッセージ(ErrorMessage)を設定して、以降はメッセージを設定しないために、フラグ(ErrorRaised)をたてておくことにします
A2セルに1~3を設定して、サブプロシージャーのどこでエラーを発生させるかをきめます。ボタンを押して、エラーが返ってくることを確認しています。
エラー処理はもっと複雑で考えなくてはいけないことも多いでしょうが、まず、エラーが発生した箇所と原因を呼び出し元のプロシージャーに戻してメッセージ出力するにはこれでも大丈夫でしょうか。何かもっといい方法がありますでしょうか。
Option Explicit
Private Sub CommandButton1_Click()
On Error GoTo ErrorHandle
ErrorRaised = False
ErrorMessage = ""
Call a1(Range("A2").Value)
On Error GoTo 0
Exit Sub
ErrorHandle:
MsgBox "エラーが発生しました" & vbNewLine & _
Err.Number & ":" & Err.Description & vbNewLine & _
ErrorMessage
End Sub
Sub a1(num As Long)
On Error GoTo ErrorHandle
If num = 1 Then
Err.Raise 11
End If
Call a2(num)
On Error GoTo 0
Exit Sub
ErrorHandle:
If Not ErrorRaised Then
ErrorRaised = True
ErrorMessage = "a1/num=" & CStr(num)
End If
Err.Raise Err.Number, , Err.Description
End Sub
Sub a2(num As Long)
On Error GoTo ErrorHandle
If num = 2 Then
Err.Raise 12
End If
On Error GoTo 0
Call a3(num)
Exit Sub
ErrorHandle:
If Not ErrorRaised Then
ErrorRaised = True
ErrorMessage = "a2/num=" & CStr(num)
End If
Err.Raise Err.Number, , Err.Description
End Sub
Sub a3(num As Long)
On Error GoTo ErrorHandle
If num = 3 Then
Err.Raise 1001, , "ここでエラーが発生"
End If
On Error GoTo 0
Exit Sub
ErrorHandle:
If Not ErrorRaised Then
ErrorRaised = True
ErrorMessage = "a3/num=" & CStr(num)
End If
Err.Raise Err.Number, , Err.Description
End Sub
最近のコメント