パソコン情報

【Access】非連結テキストボックスの値より検索したレコードだけを削除するVBA

https://pctips.jp/pc-soft/access-serach-vba-howto201907/

 

過去にも同じ内容の記事を書いた時がありましたが、色々と詰め込み過ぎてしまったことろがあり分かりづからかったので、再度記事にしてみました。

実際は、自分が見直しても理解するのに時間がかかってしまったので改めてまとめてみたという感じになります。

 

 

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