過去にも同じ内容の記事を書いた時がありましたが、色々と詰め込み過ぎてしまったことろがあり分かりづからかったので、再度記事にしてみました。
実際は、自分が見直しても理解するのに時間がかかってしまったので改めてまとめてみたという感じになります。
VBAで指定したレコードを削除する
非連結テキストボックス「edit_value」というのがあるとします。
そこに入力した値によってテーブル(NOというフィールド値)とマッチしたレコードを消すことになります。
また、NOはユニークなキーとして重複はしてないものとします。
Private Sub record_del_Click()
Dim CN As ADODB.Connection
Dim RS As ADODB.Recordset
On Error GoTo ErrRtn
If MsgBox("登録削除しますか? yes/no", vbYesNo, "データ削除") = vbYes Then
            
           Set CN = CurrentProject.Connection
           Set RS = New ADODB.Recordset
           RS.CursorLocation = adUseClient
                
                RS.Open "orderdata", CN, adOpenKeyset, adLockOptimistic
                RS.Find "NO = " & edit_value
                   
                    ' トランザクションの開始
                    CN.BeginTrans
                        RS.Delete
'
                     ' トランザクションの保存
                    CN.CommitTrans
                
                RS.Close: Set RS = Nothing
                CN.Close: Set CN = Nothing
            
Else
            
                MsgBox ("削除しないで戻りました。")
                Exit Sub
End If
ExitErrRtn:
                MsgBox ("登録削除しました。")
        Exit Sub
ErrRtn:
    MsgBox "エラー: " & Err.description
    'BeginTransの時点まで戻り、変更をキャンセルする
    CN.RollbackTrans
    RS.Close: Set RS = Nothing
    CN.Close: Set CN = Nothing
End Sub
自分の場合、同じようなVBAでフィルターを掛けて検索表示するというVBAコードがあったので、そのコードの一部分を使いまわししたことで無駄な時間を費やすことになってしまいました。
RS.Find "NO = " & edit_value
ココに注意
このちょっとした関数に気づかずに苦労しました。rs.Filterじゃなく、RS.Findでした!
SQLでの同じような処理方法
実際に下記のVBAコードでも同じような処理ができるようです。
Private Sub record_del_Click()
Dim CN As ADODB.Connection
Dim CMD As New ADODB.Command
Dim SQL As String
On Error GoTo ErrRtn
If MsgBox("登録削除しますか? yes/no", vbYesNo, "データ削除") = vbYes Then
            Set cn = CurrentProject.Connection
            Set cmd = New ADODB.Command
            cmd.ActiveConnection = cn
                    ' トランザクションの開始
                    CN.BeginTrans
            SQL = "DELETE * FROM orderdata WHERE NO=" & edit_value
            CMD.CommandText = SQL
            CMD.Execute
                     ' トランザクションの保存
                    CN.CommitTrans
                
                CN.Close: Set CN = Nothing
            
Else
                MsgBox ("削除しないで戻りました。")
                Exit Sub
End If
ExitErrRtn:
                MsgBox ("登録削除しました。")
        Exit Sub
ErrRtn:
    MsgBox "エラー: " & Err.description
    'BeginTransの時点まで戻り、変更をキャンセルする
    CN.RollbackTrans
    CN.Close: Set CN = Nothing
End Sub
