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

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

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 ―――以上――― これだと”このコレクションには項目がありません”というエラーが出ます。 アドバイスをよろしくお願いします。

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

  • ベストアンサー
  • 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

  • アクセスVBA 初心者 レコードの削除

    アクセス初心者 VBAに初挑戦です。 何度もこちらで助けていただき、あと一歩のところまできましたが、またつまづきました。 教えてください。 有給休暇の年次更新プログラムを作成中です。 一連の更新計算処理を行ったあと、サブフォームに入力すみの、消化履歴レコードをテーブルから削除する部分を作っています。 テーブルは、 社員コード、年月日、消化日数 で1レコードです。 下の記述で組んでおり、エラーも出ず、メッセージを確認する限りは、きちんと動いて、当該レコードの場合には”削除しました”のメッセージも出て、きれいに終わっているのですが、実際にはレコードが削除されていません。 チェックすべき点は、どこでしょうか? ご教示おねがいいたします。 '********************** '*** 消化履歴クリア *** '********************** '実行の確認ポーズ yn = MsgBox("有休の履歴をクリアしますか?", vbYesNo, "確認!") If yn <> vbYes Then Exit Sub End If '消化履歴(有給休暇:テーブル) 当該社員の全レコードを削除しクリアする Dim cnn As ADODB.Connection Dim rs As ADODB.Recordset Dim tbl As String Set cnn = CurrentProject.Connection Set rs = New ADODB.Recordset tbl = "有給休暇" Call rs.Open(tbl, cnn, adOpenForwardOnly, adLockBatchOptimistic) rs.MoveFirst Do While rs.EOF = False MsgBox "form社員コード= 【" & [Forms]![フォーム基本情報]![社員コード] & "】", , "確認" MsgBox "tbl社員コード= 【" & rs("社員コード").Value & "】", , "確認" If rs("社員コード").Value = [Forms]![フォーム基本情報]![社員コード] Then rs.Delete MsgBox "削除しました【" & rs("社員コード").Value & "】", , "確認" End If Call rs.MoveNext Loop Call rs.Close Set rs = Nothing Set cnn = Nothing

  • ACCESS どこがおかしいのか?

    ACCESSで。クエリからフォームを作成し、検索フォームを作成しようとしています。 AND条件とOR条件を作り検索(抽出)を行いたいのですが、何が間違っているのか、 検索をかけるとすべて「登録がありません」になってしまいます。 どこが間違っているのか、もしくは代替案を教えていただけますでしょうか。 以下は記述した、VBAコードです。 Private Sub 検索ボタン_Click() Dim db As DAO.Database Dim rs As DAO.Recordset Dim stFil As String Set db = CurrentDb() Set rs = db.OpenRecordset("Q_Autoweb", dbOpenDynaset) 'オプションボタンで条件を選択 If 検索条件 = 1 Then rs.Filter = "[タイトル]='" & タイトル検索 & "' and [本文]='" & テキスト15 & "'" Else rs.Filter = "[タイトル]='" & タイトル検索 & "' or [本文]='" & テキスト15 & "'" End If Set rs = rs.OpenRecordset Set Me.Recordset = rs If rs.EOF = True Then MsgBox "登録がありません" Else Me.ID = rs!ID Me.案件名 = rs!案件名 Me.タイトル = rs!タイトル Me.本文 = rs!本文 End If rs.Close Set rs = Nothing db.Close Set db = Nothing End Sub よろしくお願いします。

  • アクセスのインポートエラー 続き

    先ほど、質問しました続きです。以下のVBAを作成しましたが、うまくいきません。助言お願いします。 Option Compare Database Private Sub 実行_Click() Dim cat As ADOX.Catalog Dim tbl As ADOX.Table Dim strName As String Dim i As Long strName = "エラー" i = 0 Set cat = New ADOX.Catalog cat.ActiveConnection = CurrentProject.Connection For Each tbl In cat.Tables If tbl.Name = strName Then i = 1 If MsgBox(tbl.Name & "テーブルを削除しますか?", _ vbYesNo) = vbYes Then cat.Tables.Delete tbl.Name MsgBox tbl.Name & "テーブルの削除を完了しました。" End If Next tbl If i <> 1 Then MsgBox strName & "テーブルが存在しません。" Set cat = Nothing End Sub

  • アクセステーブルがあれば削除VBA

    win10 office365 access365におきまして テーブル この例ではTMPがあれば テーブルそのものを削除し (ですから削除クエリを使うこととは違うと思いましたが) はじめから存在しないときは次のコードに進む ということでほかの記事を参考に作ってみたのが Public Function tmpdelete() If funcTableExists("T_TMP") = True Then DoCmd.DeleteObject acTable, "T_TMP" End If End Function ----------------------- そもそもfuncTableExistsというのは 付属の関数ではないのかなと調べまして ----------------------- Private Function funcTableExists(ByVal strTableName As String) As Boolean Dim db As Database Dim tdf As TableDef Set db = CurrentDb For Each tdf In db.TableDefs If (T_TMP= strTableName) Then funcTableExist = True Exit Function End If Next tdf Set tdf = Nothing db.Close Set db = Nothing End Function --------------------- If (T_TMP= strTableName) Then ここに削除判定の対象のテーブル名を入れましたが 上記いずれも 作動しません マクロのプロシージャで組み入れたいので subでばく functionで書くようにとありましたので 上記のようにしました また すみません 宜しくお願い致します

  • Access VBA 添付型フィールド

    Access VBAで添付型フィールドからファイル名を取りだしたいのですが、どのようにすればいいでしょうか? Private Sub Sample() Dim DB As DAO.Database Dim RS As DAO.Recordset Dim SQL As String   Set DB = CurrentDb SQL_1 = "SELECT * FROM ボランティア情報 ORDER BY 分野 & 団体名読み;" Set RS = DB.OpenRecordset(SQL_1, dbOpenDynaset) With RS   Do While Not .EOF   MsgBox (!写真.FileName)  ←ここでエラーが出ます。 .   MoveNext   Loop End With RS.Close Set RS = Nothing Set MDB = Nothing End Sub

  • アクセスVBAです

    Sub test() Dim DB As Database Dim T As TableDef Dim myTable As String myTable = "Table1" Set DB = OpenDatabase(CurrentProject.FullName) For Each T In DB.TableDefs If T.Name = myTable Then DoCmd.DeleteObject acTable, myTable Exit For End If Next DB.Close Set DB = Nothing End Sub これを実行しようとすると Dim DB As Database の部分で コンパイルエラー プロジェクトではなく、ユーザ定義型を指定してください。 と言うエラーになります。 Dim DB As Objectにすればエラーにならずに進みますが 何が原因なのでしょうか?

  • 【Access2003】VBAで削除のSQL実行ができない

    初歩的な質問かもしれませんが・・・ ACCESS2003VBAでADOを用いて削除を実行しようとしているのですがエラー(エラーは「オーバーフローしました」です。)が出て実行できません。 ソースは以下の通りです。 Dim strSQL As String Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection strSQL = " DELETE FROM D_TB" rs.Open strSQL, cn, , adOpenStatic, adLockOptimistic       '←ここでエラー Do Until rs.EOF rs.Delete rs.MoveNext Loop rs.Close cn.Close どこがおかしいのでしょうか? 大変困っています。教えてください。よろしくお願いいたします。

  • EXCEL vbaからACCESSのクエリを開く

    EXCEL2010 WEBを参照してEXCEL VBAでACCESSのクエリを開くマクロを流用しました。 下記がマクロの内容です。 Private Sub Import() Dim db As ADODB.Connection Dim rs As ADODB.Recordset 'ACCDBファイルに接続します Set db = New ADODB.Connection db.Provider = "Microsoft.Ace.OLEDB.12.0" db.Open "C:\work\TEHAI.accdb" 'レコードセットを開きます Set rs = New ADODB.Recordset 'Accessのクエリを開く rs.Open Source:="TEHAI", ActiveConnection:=db If rs.EOF Then MsgBox "抽出した結果、レコードが見つかりません。" Else ' レコードをシートへ貼り付ける Range("A1").CopyFromRecordset rs End If rs.Close Set rs = Nothing Set db = Nothing End Sub これを実行すると、 抽出した結果、レコードが見つかりません。 が表示されます。 ACCESS単体でTEHAIクエリを実行したら、約3万件くらいヒットします。 EXCELマクロから実行したらACCESSからデータをもってこられません。 なぜレコードが見つかりません、 となるのでしょうか? マクロのどこがおかしいのか、教えていただきたく。 ちなみに、もともとの内容から変更したのは db.Open "C:\work\TEHAI.accdb" rs.Open Source:="TEHAI", の2ヶ所だけです。

  • フォームから削除をしたいです

    ACCESSで、VBAを使用し、レコードを削除しようとしています。 自分の書いたコードは以下の通りです。 --------------------------------------------------------------- Private Sub cmd削除_Click() If vbYes = MsgBox("現在表示中のレコードを削除してもよろしいですか?", _ vbYesNo + vbInformation + vbDefaultButton2) Then Set DB = CurrentDb  Set RS = DB.OpenRecordset("SELECT * FROM メール _ WHERE ID=ID") RS.Delete          Me.コード.SetFocus Call 画面クリア ボタン使用不可 Set RS = Nothing Set DB = Nothing End If End Sub -------------------------------------------------------------- コレを実行すると、開いたフォームのIDのレコードではなく、上から順番に消えてしまいます。どこが間違っているのでしょうか。 恐れ入りますが、ご教授願えますでしょうか。

  • Accessでメッセージを表示しきれない。

    Accessでメッセージボックスを表示しています。 クエリのリストが、多いとメッセージを表示仕切れません。 改善策を探しています。 Access2000を使用 モジュールの記述は下記の内容です。 Public Function koukiMessage() Call kouki End Function Sub kouki() Dim db As DAO.Database Dim rs As DAO.Recordset Set db = CurrentDb Set rs = db.OpenRecordset("受注管理 完了工期-Check") Do Until rs.EOF varRet = "No." & rs!業務番号 & Chr(9) & Format(rs!業務完了, "gggee\年mm\月dd\日") & Chr(9) & "残工期 " & rs!残工期 & "日" & " :" & rs!業務名 StrMsg = StrMsg & vbNewLine & varRet rs.MoveNext Loop If varRet <> "" Then MsgBox "業務の完了工期が1ヶ月以内になりました。" & vbNewLine & StrMsg, 48, "完了工期の確認です。" Else: Close End If rs.Close: Set rs = Nothing db.Close: Set db = Nothing End Sub

専門家に質問してみよう