前回は、登録したレコードを削除するための機能追加に向けた準備をしてきました。本来であれば要件定義の中で必要な機能を設けますが、今回は追加要件が発生した場合の改修方法も踏まえて紹介をしていますのであしからずご了承ください。
さて、レコードを削除する手順は次のように行うこととします。
サブフォームから対象レコードを選択し、コマンドボタンをクリックすることで削除をします。この際に、「T_入庫テーブル」または「T_出庫テーブル」と「T_在庫テーブル」を削除する必要がありますので、一つずつ処理プロセスを紹介します。
コマンドボタンの設定
図1に示すように、「F_メイン」フォームに消したいレコードを削除するためのコマンドボタンを配置します。入庫データと出庫データそれぞれを削除するためにコマンドボタンを用意し、「cmd_入庫データ削除」と「cmd_出庫データ削除」とします。
メインフォームから見たサブフォームのオブジェクト
レコードを削除するにあたりコレクションの考え方を改めて紹介します。先に配置したコマンドボタンは「F_メイン」フォーム上に存在しますが、レコードを表示するフォームは「F_入庫サブ」または「F_出庫サブ」フォームになります。このため、ソースコードによる処理をする際、メインフォームからサブフォームへフォーカスを当てる形となり次のように表記します。
Forms![メインフォーム名]![サブフォーム名].Form.[オブジェクト名]
メインフォーム内のオブジェクトにフォーカスを当てる場合は「Me」を用いれば良いのですが、サブフォームになると急に複雑な記載方法になりますので、ここで書き方を覚えていただければ思います。
VBAによるエラーチェック・削除制限解除
レコードの登録に際して、エラーチェックをします。ユーザーが誤って新規レコード(データが登録されていないレコード)を削除しようとした場合に、アラートを出すようにします。
If Forms!F_メイン!F_入庫サブ.Form.NewRecord = True Then MsgBox "新規レコードは削除できません" Exit Sub End If
「F_入庫サブ」フォーム(原則、「F_出庫サブ」フォームも同様の処理ルーチンとなります。「入庫」と記載された内容は「出庫」と読み替えてください。)で新しいレコード(NewRecord)を選択して「cmd_入庫データ削除」コマンドボタンをクリックすると、上記If文がTrueとなりメッセージを発出して、VBAによる処理を強制終了(Exit Sub)します。
新規レコードでない場合は、If文を抜けて削除処理を開始しますが、削除するつもりがなくてもユーザーが誤ってコマンドボタンをクリックすることも考えられますので、メッセージボックスにより対話型の確認をします。
'削除の確認 lans = MsgBox("削除してもよろしいですか?", vbYesNo + vbInformation, "確認") If lans = vbNo Then Exit Sub End If
メッセージボックスの用途はユーザーとの対話型処理で非常に使用頻度が高く、またその活用方法は多岐にわたります。
上の例ではユーザーに「はい」「いいえ」で選択(vbYesNo)をしてもらい、If文の条件に合致(上の場合は「いいえ」を選択)した場合に、次の処理をすることとしています。
続いて制御系の処理をします。
レコードを削除する際にデフォルトではAccessからのアラートが表示されますが、毎回表示されると作業性が悪くなりますので、「SetWarnings」を用いてアラート表示をしない設定とします。
'削除時のアラートを非表示にする DoCmd.SetWarnings False
次に、サブフォームはユーザーがマニュアルでレコードを削除できないように設定しています。そこで、「AllowDeletions」を用いて一時的にレコード処理権限を「削除可」に切り替えるためのコードを追加します。
'フォームの削除不可を一時的に削除可に切り替える Forms!F_メイン!F_入庫サブ.Form.AllowDeletions = True
これにより、VBAによる操作時にレコードを削除することができるようになります。
レコード削除処理
続いて、サブフォームにフォーカスを切り替え、かつユーザーが選択したレコードの「入庫ID」を取得します。(T_在庫テーブルに同様のフィールドを用意しており、この値がそれぞれのテーブル内レコードを紐づけています。レコード削除時には、このID情報をキーとして処理をします。)
'サブフォームにフォーカスを切り替える Forms!F_メイン!F_入庫サブ.SetFocus '入庫IDの値を取得する(T_在庫テーブルからレコードを削除するために必要) Dim id As Integer id = Forms!F_メイン!F_入庫サブ.Form.t_入庫ID
入庫ID情報を取得したら、「T_入庫テーブル」から選択しているレコードを削除します。
'アクティブなレコードをT_入庫テーブルから削除する DoCmd.RunCommand acCmdDeleteRecord
さらに、「T_在庫テーブル」から当該レコードを削除します。今回は、SQL文による処理として「Docmd.RunSQL」を利用します。(レコードの削除はADOを用いて実行することも可能です。)
削除に係るSQL文は以下の記事をご参照ください。
'T_在庫テーブルから入庫IDに該当するレコードを削除する。 Dim mySQL As String mySQL = "DELETE * FROM T_在庫テーブル WHERE 入庫ID = " & id & ";" DoCmd.RunSQL mySQL
以上で、テーブルからのレコード削除が完了しました。
VBA処理に対する終了手続き
本ソースコード処理をするにあたり、アラート機能をOFFとしていましたが、それ以外の場合には、アラート機能をONにした方がヒューマンエラー防止になります。したがって、「SetWarning」を用いて、アラートが発出されるように再設定します。
また、サブフォームからのレコード削除等は禁止としていますので、一時的に削除可としていた部分を再度削除不可に切り替えます。
'アラートを表示するように設定 DoCmd.SetWarnings True 'フォームからの削除を不可にする Forms!F_メイン!F_入庫サブ.Form.AllowDeletions = False
以上のVBAソースコードをまとめると次のようになります。
Private Sub cmd_入庫データ削除_Click() Dim lans As Long '新規レコードに対しては削除不可 If Forms!F_メイン!F_入庫サブ.Form.NewRecord = True Then MsgBox "新規レコードは削除できません" Exit Sub End If '削除の確認 lans = MsgBox("削除してもよろしいですか?", vbYesNo + vbInformation, "確認") If lans = vbNo Then Exit Sub End If 'エラーが生じたら「ErrExit」までジャンプする On Error GoTo ErrExit '削除時のアラートを非表示にする DoCmd.SetWarnings False 'フォームの削除不可を一時的に削除可に切り替える Forms!F_メイン!F_入庫サブ.Form.AllowDeletions = True 'サブフォームにフォーカスを切り替える Forms!F_メイン!F_入庫サブ.SetFocus '入庫IDの値を取得する(T_在庫テーブルからレコードを削除するために必要) Dim id As Integer id = Forms!F_メイン!F_入庫サブ.Form.t_入庫ID 'アクティブなレコードをT_入庫テーブルから削除する DoCmd.RunCommand acCmdDeleteRecord 'T_在庫テーブルから入庫IDに該当するレコードを削除する。 Dim mySQL As String mySQL = "DELETE * FROM T_在庫テーブル WHERE 入庫ID = " & id & ";" DoCmd.RunSQL mySQL 'アラートを表示するように設定 DoCmd.SetWarnings True 'フォームからの削除を不可にする Forms!F_メイン!F_入庫サブ.Form.AllowDeletions = False Exit Sub ErrExit: MsgBox "エラーが発生した為、削除できませんでした。" & vbCrLf & "エラー内容: " & Err.Description Exit Sub End Sub
なお、出庫処理に対するVBAによる削除処理をする場合は、上記コードの内、「入庫」としている箇所を「出庫」としてください。
まとめ
今回はVBAソースコードによるレコード削除プロセスを紹介しました。考えられるエラーに対して、事前にチェック機能を設けることで効率に加えて品質を維持・向上しながら業務を推進することができます。2回にわたって仕組みづくりと運用方法について紹介をしてきましたが、操作に慣れれば非常に有効活用できるものだと思います。
スポンサーリンク
コメント