• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Access VBA 削除)

Access VBAでアカウントを削除する方法

このQ&Aのポイント
  • Access VBAを使用して、不要なアカウントをテーブルから削除する方法について教えてください。
  • 具体的な手順として、リストボックスに表示されたアカウントを選択し、ボタンを押すことで削除することができるようにしたいです。
  • しかし、作成したVBAコードにエラーが出てしまい、「このコレクションには項目がありません」というエラーメッセージが表示されます。どのように修正すれば良いでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.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 ・・・以上です。

hirai7
質問者

お礼

ご回答ありがとうございます。無事にできました。 >というのは、提示された「db.TableDefs.Delete UserList」というコードは、 >「UserListリストボックスで指定したテーブルそのものを削除」する内容に >なっているからです。 危ないところでした。まさかそんなコードになっていたとは(汗 If MsgBox(UserList & "を削除しますか?", vbYesNo) = vbYes Then       rs.Delete        'レコードを削除       UserList = Null    'UserListの値を初期化       UserList.Requery   'UserListに削除を反映(RowSourceがtbl_ユーザーの場合)       MsgBox UserList & "を削除しました。" これだと削除した際に、「を削除しました。」というメッセージになってしまいましたが、 値を初期化する位置を変更したらうまく表示されました。 とても参考になりました。ありがとうございました。

関連するQ&A