« 2008年11月 | トップページ | 2009年4月 »

2009年2月

VBA vol.1 ~ エラー処理の考察1

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

| | コメント (1) | トラックバック (0)

« 2008年11月 | トップページ | 2009年4月 »