過去にも同じ内容の記事を書いた時がありましたが、色々と詰め込み過ぎてしまったことろがあり分かりづからかったので、再度記事にしてみました。
実際は、自分が見直しても理解するのに時間がかかってしまったので改めてまとめてみたという感じになります。
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