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