SSブログ

VBA イベントのキャンセル [VBA]

 ACCESSは、ユーザーの操作やACCESSの処理によって起きるイベントによって、処理が実行されています。
 様々なイベントがありますが、一部のイベントは、VBAによってイベントの処理を取り消すことができます。

 具体的にどんなことなのかは、以下の通り。
 フォームが閉じるときの処理を、キャンセルする例です。

 画面にコマンドボタンを配置し、クリックイベントに以下のコードを記述します。

Private Sub cmdClose_Click()
    
On Error Resume Next
    DoCmd.Close acForm, Me.Name
On Error GoTo 0
    
End Sub

 次に、フォームの「読み込み解除時」イベントに、以下のコードを記述します。

Private Sub Form_Unload(Cancel As Integer)

    If MsgBox("フォームを閉じますか?", vbYesNo) = vbNo Then
        Cancel = True
        Exit Sub
    End If

End Sub

 閉じるボタンをクリックすると、下図のメッセージボックスが表示されます。

 「いいえ」をクリックすると、DoCmd.Closeでフォームを閉じる処理が実行されたのですが、Cancel = Trueが設定されたことにより、フォームを閉じる処理が取り消されます。
 また、配置したコマンドボタンをクリックした時以外でも、Unloadイベントが発生した場合、このメッセージが表示されます。例えば、フォーム右上の「×」ボタンでフォームを閉じる時などです。

 フォームが閉じられる際に起こる、「読み込み解除時」イベントで、イベントをキャンセルすることで、フォームが閉じられないようにすることができます。
 これが、イベントのキャンセルです。

 取り消し可能なイベントは、イベントプロシージャの引数に「Cancel As Integer」が記述されています。

 ちなみに、DoCmd.Closeの前に、On Error Resume Nextを指定しているのは、イベントがキャンセルされた場合、DoCmd.Closeがエラーになってしまうからです。
 エラー処理をしていないと、メッセージボックスの「いいえ」をクリックした後、

 と言うエラーメッセージが表示され、止まってしまいます。

・DoCmd.CancelEventについて

 DoCmd.CancelEventでも、同様にイベントのキャンセルが行えます。
 上記の例を、DoCmd.CancelEventで記述すると、以下のようになります。

Private Sub Form_Unload(Cancel As Integer)

    If MsgBox("フォームを閉じますか?", vbYesNo) = vbNo Then
        DoCmd.CancelEvent
        Exit Sub
    End If

End Sub

 DoCmd.CancelEventはACCESSの仕組み、Cancel = TrueによるイベントのキャンセルはVBの仕組みです。
 記述量はたいして差がありませんが、処理面では、DoCmdのメソッドを呼ぶより、Cancel = Trueを設定する方が、シンプルです。
 イベントのキャンセルでは、Cancel = Trueを記述するのが一般的だと思います。


nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。
※URL(リンク)は記述できません。

トラックバック 0

トラックバックの受付は締め切りました

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。