Microsoft Access Club >VBA物語 >このページ >次頁 < 前項  サイト内検索


エラー処理_Endの使い方:VBA物語07



Exit Sub と End Sub の記述は、同じく最後にSubを用いていますが、全然意味合いが異なります。まず、下記プロシージャをご覧下さい。

Private Sub cmd_コマンドボタン_Click()

On Error GoTo エラーの時はここへ
    
    'データ型は整数型です。
    Dim a As Integer
    Const b = 12345
    Const C = 10
    
    'オーバーフローが発生します。整数型は、-32,768 〜 32,767 の範囲の値です。
    a = b * C
        
    Exit Sub ' --- A
            
エラーの時はここへ:

    MsgBox "予期せぬエラーが発生しました。管理者へ連絡して下さい。"
    Exit Sub ' --- B
    
End Sub
Exit Subの働き

Exit Sub とは、ステートメントのある Sub プロシージャを直ちに抜け、 Sub プロシージャを呼び出したステートメントの次のステートメントに移ります。上記プロシージャでは、AのExit Subは通常処理の終了、BのExit Subはエラー処理の終了を定義しています。

VBAプログラミングは上から順番に命令が実行されますが、意図的に必要な命令文を記述している行へ移動させる こともできます。

例えば、5行目から10行目までの命令文を実行させないようなプログラミングを記述し、ある条件を充たした場合のみ、5行目から10行目を実行させるといった組み方 ができます。このように複雑に命令文を組み合わせることを「階層を組む」といいます。

If a <> 1 Then
     MsgBox "もう一丁"
     If b <> 2 Then
        MsgBox "再度、もう一丁"
         If c <> 3 Then
             MsgBox "パーフェクト"
        End If
     End If
End If

上記のプロシージャは、aが1でない場合は「もう一丁」のメッセージを表示し、bが2でない場合は引き続き 「再度、もう一丁」のメッセージを表示させます。続いて、Cが3でないなら「パーフェクト」を表示させてこのIfステートメントを終了 させます。

サンプルプロシージャ

下記のサンプルプロシージャは、IFステートメントを用いた制御文です。

Private Sub cmd_コマンドボタン_Click()

    If a = 1 Then
        MsgBox "OK"      '……@
    End If
         …       '……A
End Sub
解説

a=1ならば、「OK」のメッセージを表示(@)し、IFステートメントを抜け出て、End If 以下の次のプロセス(A)に進みます。つまり、プロシージャ自体の進行は続きます。この点が重要ですよ。
※End If とは、「IFステートメントの終了」を行うために必ず記述します。

では、上記プロシージャを修正し Exit Sub を追加します。

Private Sub cmd_コマンドボタン_Click()

    If a = 1 Then
        MsgBox "OK"
        Exit Sub        '……@
    End If
         …      '……A
End Sub
解説

a=1ならば、「OK」のメッセージを表示(@)し、Exit Subによりプロシージャの進行は停止します。つまり、プロシージャ はこの時点で終了しA以下の命令文は実行されません。

End Subの働き

プロシージャは、End Sub の手前で終了します。逆に云いますと、End Sub が記述されていると、その前でこのイベントプロシージャは終了することになります。英語ではEndのことを最後と言います。VBAも同じ感覚で結構です。

EndとExit Subの違い

End を単独で用いると、その段階でプロシージャが終了します。Endステートメントは、プロシージャやブロック (一連のステートメントの集まり) を終了させるフロー制御のステートメントです。

先のサンプルプロシージャを下記のように書き換えます。これが意味するところは、「aが1であれば、このプロシージャ全体を終了させなさい」というステートメントとなります。

Exit Subを用いたサンプルプロシージャ

では、EndとExit Subの違いをサンプルプロシージャで確認しましょう。

Sub TestPro()

    Dim strmsg As String
    strmsg = "Exit Sub の場合は、これが表示されます。"
    
    Call testMsg ' SubプロシージャtestMsgを呼び出します。
    MsgBox strmsg
    
End Sub
Sub testMsg()

    Dim strmsg As String
    strmsg = "Exit Sub  とEnd Sub の違いのテストを行います。"
    
    If MsgBox(strmsg, vbCritical + vbOKCancel) = vbCancel Then
        Exit Sub ' --- 注目
    End If

End Sub
動作確認
  1. イミディエイト画面上でTestProを実行します。
  2. 以下のメッセージが表示されます。

  1. [キャンセル]ボタンをクリックします。

  1. [OK]ボタンをクリックすると終了します。
Endを用いたサンプルプロシージャ

では、EndとExit Subの違いをサンプルプロシージャで確認しましょう。

Sub TestPro()

    Dim strmsg As String
    strmsg = "Exit Sub の場合は、これが表示されます。"
    
    Call testMsg ' SubプロシージャtestMsgを呼び出します。
    MsgBox strmsg
    
End Sub
Sub testMsg()

    Dim strmsg As String
    strmsg = "Exit Sub  とEnd Sub の違いのテストを行います。"
    
    If MsgBox(strmsg, vbCritical + vbOKCancel) = vbCancel Then
        End ' --- 注目
    End If

End Sub
動作確認
  1. イミディエイト画面上でTestProを実行します。
  2. 以下のメッセージが表示されます。

  1. [キャンセル]ボタンをクリックします。
  2. 終了します。
解説

このようにプロシージャ内で用いる Exit Sub とEnd では大きな違いがあります。 複数のプロシージャにまたがって実行されている場合であっても、Endを記述するとその時点で全体のプロシージャが終了します。

関連ページ

このエラー処理については、次回も詳しくお知らせする予定です。では…。

2001/09/27

ページの先頭へ 前ページへ戻る


エラー処理_Endの使い方:VBA物語07


 

-Microsoft Access Club-