- ベストアンサー
Access VBAでアカウントを削除する方法
- Access VBAを使用して、不要なアカウントをテーブルから削除する方法について教えてください。
- 具体的な手順として、リストボックスに表示されたアカウントを選択し、ボタンを押すことで削除することができるようにしたいです。
- しかし、作成したVBAコードにエラーが出てしまい、「このコレクションには項目がありません」というエラーメッセージが表示されます。どのように修正すれば良いでしょうか?
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
> これだと”このコレクションには項目がありません”というエラーが出ます。 現状のコードを見ると、このエラーが出たのは、ある意味、幸いだったかも しれません(汗) というのは、提示された「db.TableDefs.Delete UserList」というコードは、 「UserListリストボックスで指定したテーブルそのものを削除」する内容に なっているからです。 (もしもアカウントと同名のテーブルがあったら、削除されているところでした: 「コレクションに項目がない」とは、「指定したテーブルが、(TableDefsの) コレクションにない」(=だから削除できませんでした)、ということ) 今回の場合は、レコードの削除が必要なので、TableDefsに対してではなく、 Recordset(提示した変数ではrs)に対して、Deleteを行います(→rs.Delete)。 ・・・ということで、DAO.RecordsetのDeleteメソッドを使用した一例を、以下に 提示します: Private Sub Del_Click() 'エラーが発生した場合は「エラー処理:」の行に飛ばします。 On Error GoTo エラー処理 Dim db As DAO.Database, rs As DAO.Recordset Dim strRS As String 'アカウントが選択されていない場合は処理を切り上げ If IsNull(UserList) Then MsgBox "削除するアカウントを選択してください。" GoTo 終了処理 End If 'レコードセットとして開くSQL文の準備 '(OpenRecordsetではテーブル・クエリの他にSQL文も指定可能です) strRS = "Select * From tbl_ユーザー" & vbCrLf _ & "Where アカウント = '" & UserList & "'" 'UserListで得られる値が「ユーザー名」の方だった場合は以下に差し替え: 'strRS = "Select * From tbl_ユーザー" & vbCrLf _ & "Where ユーザー名 = '" & UserList & "'" '削除するレコード1件を、レコードセットとして開く Set db = CurrentDb Set rs = db.OpenRecordset(strRS) '該当レコードの確認 If rs.EOF Then '該当レコードがなかった場合 MsgBox "該当するレコードがありませんでした。" Else '該当レコードがあった場合 If MsgBox(UserList & "を削除しますか?", vbYesNo) = vbYes Then rs.Delete 'レコードを削除 UserList = Null 'UserListの値を初期化 UserList.Requery 'UserListに削除を反映(RowSourceがtbl_ユーザーの場合) MsgBox UserList & "を削除しました。" Else MsgBox "削除を中止しました。" End If End If 終了処理: 'レコードセットを開いていた場合は閉じる '(CurrentDbは使用を継続するので、db.Closeは不要かと思います) If Not (rs Is Nothing) Then rs.Close 'メモリを解放して処理を終了(こちらはdbも対象にします) Set rs = Nothing Set db = Nothing Exit Sub 'これがないと下の処理でエラーが発生して無限ループ(汗) エラー処理: 'エラー時はメッセージを表示した上で、処理を中止 MsgBox Err.Number & ":" & Err.Description, , Me.Name & " Del" Resume 終了処理 End Sub ・・・以上です。
お礼
ご回答ありがとうございます。無事にできました。 >というのは、提示された「db.TableDefs.Delete UserList」というコードは、 >「UserListリストボックスで指定したテーブルそのものを削除」する内容に >なっているからです。 危ないところでした。まさかそんなコードになっていたとは(汗 If MsgBox(UserList & "を削除しますか?", vbYesNo) = vbYes Then rs.Delete 'レコードを削除 UserList = Null 'UserListの値を初期化 UserList.Requery 'UserListに削除を反映(RowSourceがtbl_ユーザーの場合) MsgBox UserList & "を削除しました。" これだと削除した際に、「を削除しました。」というメッセージになってしまいましたが、 値を初期化する位置を変更したらうまく表示されました。 とても参考になりました。ありがとうございました。