#569 削除されようとしているデータ内容を取得するには? フォーム、VBA

Accessのフォームからレコードを削除しようとすると、次のような順番でイベントが発生します。
  1. Delete/レコード削除時イベント
    Deleteキーなどの操作によって、レコードが削除されようとしたときに発生します。
    レコードが実際に削除される前に発生するもので、この時点ではまだ削除はされていません。

  2. BeforeDelConfirm/削除前確認イベント
    削除されようとしているレコードが画面上から消えたあとで、かつ削除確認のメッセージが表示される前に発生します。
    このイベントプロシージャの引数を利用することによって、削除確認のメッセージをスキップさせたり、オリジナルの確認メッセージを表示させたりすることができます。

  3. AfterDelConfirm/削除後確認イベント
    レコードが実際に削除された後、確認メッセージ等で削除がキャンセルされたときに発生します。
    このイベントプロシージャの引数を確認することによって、実際に削除されたかどうかの確認を行うことができます。

さて、このようなレコードの削除処理においては、Accessにすべてを任せて、既定の削除確認メッセージで削除するかどうかをユーザーに求めてもよいのですが、どのようなデータを削除しようとしているかもメッセージボックスに表示したい場合があります。たとえば「得意先名○○○○○のデータを削除します。よろしいですか?」といった表示をしたい場合です。

ところが、通常このようなオリジナルの確認メッセージは「BeforeDelConfirm/削除前確認」イベントプロシージャを利用しますが、その時点ではすでにそのレコードが画面から消えてバッファに格納された状態になっているため、そのレコードのフィールドのデータ内容を取得することができません。

そのようなときに使えるひとつの方法です。

次のサンプルコードでは、まず「Delete/レコード削除時」イベントプロシージャで、削除されようとしているレコードのフィールドの値を取得し、Publicな変数に代入しておきます。そして「BeforeDelConfirm/削除前確認」イベントプロシージャでは、その変数を参照することによってフィールドのデータ内容を含めた確認メッセージを表示しています。

なお、複数のレコードが範囲選択されている可能性もありますので、その場合も考慮したコードとなっています。複数レコードを削除しようとしたときには、Delete/レコード削除時イベントはそれらのレコード1つごとに複数回発生し、他の二つのイベントは1回だけ発生します。

Private pvarDelData As Variant

Private Sub Form_AfterDelConfirm(Status As Integer)
'フォームのレコード削除後確認

  '次の削除操作に備えてPublic変数を初期化
  pvarDelData = Null

End Sub

Private Sub Form_BeforeDelConfirm(Cancel As Integer, Response As Integer)
'フォームのレコード削除前確認

  '既定の削除確認メッセージを表示しない
  Response = acDataErrContinue

  'オリジナルの削除確認メッセージを表示する
  Beep
  If MsgBox(pvarDelData & "のデータを削除します。よろしいですか?", _
            vbYesNo + vbQuestion) = vbNo Then
    Cancel = True
  End If

End Sub

Private Sub Form_Delete(Cancel As Integer)
'フォームのレコード削除時

  '削除レコードの得意先名をPublic変数に保存
  pvarDelData = pvarDelData & Me!得意先名 & vbCrLf

End Sub



実行例:
■一つのレコードを削除する場合
一つのレコードを選択

削除確認メッセージ

■複数のレコードを削除する場合
複数レコードを範囲選択

削除確認メッセージ
| Index | Prev | Next |



T'sFactory
Accessで動く生産管理DB
Ureru Express
Webで使う販売顧客管理
Access開発&アドバイス
DB開発やテクニカルアドバイス
Copyright © T'sWare All rights reserved