こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Access VBA 削除

またお世話になります。
Access2003を使用しています。

不要になったアカウントを削除できるようなものを作成したいのですがうまくいきません。

リストボックスに表示されたアカウントを選択し、
ボタンを押すとテーブルから削除できるというものを考えています。

テーブル名: tbl_ユーザー
フィールド名: ユーザー名 パスワード アカウント

フォーム名: frm_Account_Delete
 リストボックス: UserList
 コマンドボタン: Del

いろいろ調べて自分なりに作ってみたのですがエラーが出てしまいました。

―――以下VBAコード―――
Dim db As Database
Dim rs As DAO.Recordset

Set db = CurrentDb()
Set rs = db.OpenRecordset("tbl_ユーザー")

If IsNull(UserList) Then
MsgBox "削除するアカウントを選択してください"
Else
If MsgBox(UserList & "を削除しますか?", vbYesNo) = vbYes Then
db.TableDefs.delete UserList    
MsgBox "UserListを削除しました。"
End If
End If

rs.Close
db.Close
Set db = Nothing
―――以上―――

これだと”このコレクションには項目がありません”というエラーが出ます。

アドバイスをよろしくお願いします。

投稿日時 - 2009-11-17 13:41:13

QNo.5454938

困ってます

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

> これだと”このコレクションには項目がありません”というエラーが出ます。

現状のコードを見ると、このエラーが出たのは、ある意味、幸いだったかも
しれません(汗)
というのは、提示された「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


・・・以上です。

投稿日時 - 2009-11-17 22:01:05

お礼

ご回答ありがとうございます。無事にできました。

>というのは、提示された「db.TableDefs.Delete UserList」というコードは、
>「UserListリストボックスで指定したテーブルそのものを削除」する内容に
>なっているからです。

危ないところでした。まさかそんなコードになっていたとは(汗

If MsgBox(UserList & "を削除しますか?", vbYesNo) = vbYes Then
      rs.Delete        'レコードを削除
      UserList = Null    'UserListの値を初期化
      UserList.Requery   'UserListに削除を反映(RowSourceがtbl_ユーザーの場合)
      MsgBox UserList & "を削除しました。"

これだと削除した際に、「を削除しました。」というメッセージになってしまいましたが、
値を初期化する位置を変更したらうまく表示されました。

とても参考になりました。ありがとうございました。

投稿日時 - 2009-11-18 13:18:48

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問