• ベストアンサー

リストボックスで選択したレコードを削除

お世話になります。 Access2000を使用しております。 削除ボタン(cmd削除)を用いてリストボックス(lst一覧)で選択したレコードをテーブルから削除したいのですが、以下の●→の個所でエラーがでて困っております。 サンプルコードをコピーして使用しております故、原因・理由が解りません。 何方かご教授の程よろしくお願いいたします。 --- Private Sub cmd削除_Click() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim var条件 As Variant Dim var行 As Variant Dim mySQL As String Dim i As Long For Each var行 In Me.lst一覧.ItemsSelected var条件 = var条件 & IIf(Not var条件 = "", ",", "") & _ Me.lst一覧.Column(0, var行) Next If Not var条件 = "" Then Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset mySQL = "SELECT * FROM T_自社情報 WHERE ID IN (" & var条件 & ")" ●→ rs.Open mySQL, cn, adOpenKeyset, adLockOptimistic Do Until rs.EOF rs.Delete rs.MoveNext Loop For i = 0 To Me.lst一覧.ListCount - 1 Me.lst一覧.Selected(i) = False Next Me.lst一覧.Requery rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End If End Sub --- 実行時エラー -2147217904 (1つ以上の必要なパラメータの値が設定されていません。) T_自社情報の各フィールド 自社No.  (オートナンバー) 会社名 郵便番号 住所 TEL FAX 備考

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

  • ベストアンサー
noname#22222
noname#22222
回答No.4

s_husky です。 複数選択可能な設定で複数レコードを削除したい。 しかも、リストは複数の列であるということですね。 よく読まなかったもので済みません。 Private Sub コマンド0_Click()   Dim I As Integer   Dim N As Integer      N = Me.リスト_削除対象.ListCount - 1   For I = 0 To N     If Me.リスト_削除対象.Selected(I) Then       CnnExecute "DELETE FROM Table1 WHERE ID=" & _             Me.リスト_削除対象.Column(0, I)     End If   Next I End Sub

Tks1234
質問者

お礼

ありがとうございます。とても助かります。 上記の指示頂いたコードで早速試してみたところ、CnnExecuteの箇所でエラーが出てしまいます。 何度も申し訳ありませんが、再度ご教授お願いできないでしょうか。 よろしくお願いします。

その他の回答 (7)

noname#22222
noname#22222
回答No.8

s_husky です。 主キー列名は、[ID]ではなく[自社No.]ではありませんか? 主キー列名を、[ID]ではなく間違って[IDD]と書いたら同じエラーを取得したとの回答。 「この辺りのチェックを!」ということです。

Tks1234
質問者

お礼

おはようございます。 >主キー列名は、[ID]ではなく[自社No.]ではありませんか? 仰る通りです。 ほんとどうもすみませんでした。 おかげさまで質問タイトル通りの結果を得る事が出来ました! 本当にありがとうございました!

noname#22222
noname#22222
回答No.7

s_husky です。 同じエラーを返すことに成功しました。 ? CnnExecute( "DELETE FROM TEST WHERE IDD=3") False つまり、Access.adp ではなく Access.mdb でテストしました。 単なるテーブル名か列名のミスです。 Access.adp と Access.mdb とではエラー内容が違っていました。 重ね重ねのミスお詫びします。

Tks1234
質問者

お礼

ありがとうございます。 >単なるテーブル名か列名のミスです。 との事ですが、表記のミスでしょうか。 それとも何か使用してはいけない文字を使用しており それによるミスなのでしょうか。

noname#22222
noname#22222
回答No.6

s_husky です。 CnnExecute 関数が感知したエラーを表示しています。 ですから、何らかの理由でSQL文の実行時にエラーが発生しています。 Private Sub コマンド0_Click()   CnnExecute "Delete FROM T_自社情報 WHERE ID=3" End Sub ところで、これを実行すると、列[ID]=3のレコードが削除されます。 エラーは確認されません。 ということは、SQL文そのものには誤りはないと考えられます。 また、SQL文のエラーは、それはそれとして返ってくる筈です。 もしかしたら、[T_自社情報]自体をオープンできますか? それ自体がクエリか何かでパラメータに問題があるとか・・・。 判りません。 ※ウーン!これは、経験豊かなプロの出番かも・・・。 ※力不足ですみません。

noname#22222
noname#22222
回答No.5

s_husky です。 以下の関数を適当なモジュールにコピペして下さい。 一応、トランザクションのロールバック機能もあります。 一応、CnnErrors も表示します。 Public Sub ErrMessage(ByVal CnnErrors As ADODB.Error, ByVal strSQL As String)    MsgBox "ADOエラーが発生しましたので処理をキャンセルします。" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & CnnErrors.Description & Chr$(13) & _       "・Err.Number=" & CnnErrors.Number & Chr$(13) & _       "・SQL State=" & CnnErrors.SQLState & Chr$(13) & _       "・SQL Text=" & strSQL, _       vbExclamation, " ADO関数エラーメッセージ" End Sub Public Function CnnExecute(ByVal strSQL As String) As Boolean On Error GoTo Err_CnnExecute    Dim isOK As Boolean    Dim cnn As ADODB.Connection       isOK = True    Set cnn = CurrentProject.Connection    With cnn      .Errors.Clear      .BeginTrans      .Execute strSQL      .CommitTrans    End With Exit_CnnExecute: On Error Resume Next    cnn.Close    Set cnn = Nothing    CnnExecute = isOK    Exit Function Err_CnnExecute:    isOK = False    If cnn.Errors.Count > 0 Then      ErrMessage cnn.Errors(0), strSQL      cnn.RollbackTrans    Else      MsgBox "プログラムエラーが発生しました。システム管理者に報告して下さい。(CnnExecute)", _         vbExclamation, " 関数エラーメッセージ"    End If    Resume Exit_CnnExecute End Function

Tks1234
質問者

お礼

本当にありがとうございます。 早速上記のコードを示唆通りコピペしたところ、以下のメッセージが表示されます。 また、何度も申し訳ありませんがご教授の程よろしくお願い致します。 m(__)m ADO関数エラー Err.Discription =1つ以上の必要なパラメータの値が設定されていません。 Err.Number = -2147217904 SQL State = SQL Text=Delete FROM T_自社情報 WHERE ID=3

noname#22222
noname#22222
回答No.3

s_husky です。 もしかして、選択したリストだけを削除するのであれば次のようです。 Private Sub コマンド0_Click()   CnnExecute "DELETE FROM Table1 WHERE ID=" & _         Me.リスト_削除対象.ItemData(Me.リスト_削除対象.ListIndex) End Sub

noname#22222
noname#22222
回答No.2

少し、ルーチンが複雑かなと思いました。 次のように書くことも可能かと思います。 Private Sub コマンド0_Click()   Dim I  As Integer   Dim N  As Integer      N = Me.リスト_削除対象.ListCount - 1   For I = 0 To N     CnnExecute "DELETE FROM Table1 WHERE ID=" & Me.リスト_削除対象.ItemData(I)   Next I End Sub 長く、なりますので CnnExecute 関数は後ほど補足します。

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.1

検証したわけではありませんが気になったのは 『var条件 = ""』で十分なのか。 Debug.Print で何が格納されているか。,,,,,,,,,, レコードセットを回さずとも mySQL = "SELECT * FROM ・・・をmySQL = "Delete * FROM・・・ にして cn.Execute mySQL ・・・ にした方が速いのではないか。 ボケレス御免

関連するQ&A

  • サブフォームのレコード削除

    サブフォーム(帳票)のレコード削除をしたいのですが、レコードセクレタをクリックして選んだレコードではなく、テーブルの最初のレコードから順番に削除されてしまいます。 Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim ret As Integer '接続 Set cn = CurrentProject.Connection 'レコードセットを取得 Set rs = New ADODB.Recordset rs.Open "T支店", cn, adOpenKeyset, adLockOptimistic '削除 ret = MsgBox("表示中のレコードを削除しますか?", vbYesNo + vbQuestion, "削除") Select Case ret Case vbYes rs.Delete Me!sub支店.Form.Requery Case vbNo Exit Sub End Select '終了 rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing WINDOWS98、ACCESS2000をしようしています。よろしくお願いします。

  • ADOでRecordsetオブジェクトをレコードソースに設定したい

    Access2000を使っています。リンクテーブルを使わずに、ODBCで繋いだDBのテーブルをフォームのレコードソースにセットしたいのですが、可能でしょうか。 宜しくお願いします。 Private Sub FormNoKansu() Dim cn as New ADODB.Connection Dim rs as New ADODB.Recordset Dim strSql as String 'ODBCでサーバーに接続 cn.ConnectionString = "ODBCでMySQLに..." ... strSql = "SELECT * FROM ..." rs.Open strSql, cn 'ここに[rs]を入れられたらと思っています Me.Recordset = "" End Sub

  • レコードは2行あるのに「-1」が返ってくる

    accessです。 テーブル1にレコードは2行あるのに、下記のコードを実行すると「-1」が返ってきます。 なぜでしょうか? ------------------------------------------------------------ Sub test() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = Application.CurrentProject.Connection Set rs = cn.Execute("SELECT * FROM テーブル1") MsgBox rs.RecordCount rs.Close cn.Close Set rs = Nothing Set cn = Nothing End Sub ------------------------------------------------------------ ご教示よろしくお願い致します。

  • ADO 「Set」は使ったほうがいいのでしょうか?

    Sub test1() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection Set rs = New ADODB.Recordse End Sub Sub test2() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset End Sub この二つは同じ意味ですか? 「Set」は使ったほうがいいのでしょうか? よろしくお願いします。

  • 1つのフォームから複数のテーブルにレコード追加をやってみました。

    1つのフォームから複数のテーブルにレコード追加をやってみました。 そこで疑問があるのですが、Connectionは1つでRecordsetは追加するテーブルの数だけOpenが必要なのですか? 一応下記のコードで2つのテーブルにレコードを追加出来たのですが、素人の推測でやってみたので間違っている所がないか見て頂きたいです。 返答よろしくお願いします。 Dim cn As ADODB.Connection Dim rs1 As New ADODB.Recordset Dim rs2 As New ADODB.Recordset Set cn = CurrentProject.Connection Set rs1 = New ADODB.Recordset Set rs2 = New ADODB.Recordset Beep If MsgBox(Format(txt車両コード, "000000") & " " & txt登録番号 & Chr(13) & "を登録しますか?", 33, "確認! 登録") = vbOK Then rs1.Open "T車検証", cn, adOpenKeyset, adLockPessimistic rs2.Open "T所有者", cn, adOpenKeyset, adLockPessimistic rs1.AddNew rs1!車両コード = Me.txt車両コード rs1!登録番号 = Me.txt登録番号 rs1!交付年月日 = Me.txt交付年月日 rs1!初度年月 = Me.txt初度年月 rs1.Update rs2.AddNew rs2!車両コード = Me.txt車両コード rs2!所有者 = Me.txt所有者 rs2.Update rs1.Close: Set rs1 = Nothing rs2.Close: Set rs2 = Nothing cn.Close: Set cn = Nothing MsgBox Format(txt車両コード, "000000") & " " & txt登録番号 & Chr(13) & "を登録しました。", 64, "確認! 登録" End If End Sub

  • Access ADOについて質問です。

    Access ADOについて質問です。 以下コードでレコードセットを返す関数を使用しています。 動作的には問題ないのですが、標準モジュール内のレコードセットをClose及びNothingしていないのが気になります。 Private Sub Form_Open(Cancel As Integer) Dim rs2 As ADODB.Recordset Set rs2 = New ADODB.Recordset Set rs2 = CreateRecordSet("SELECT * FROM T_Standard;") Set Me.Recordset = rs2 rs2.Close: Set rs2 = Nothing end sub '標準モジュール Public Function CreateRecordSet(strSQL As String) As ADODB.Recordset Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection cn.ConnectionString = "provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=O:\標準DB\StandardBackEnd.mdb" cn.Open Set rs = New ADODB.Recordset rs.Open strSQL, cn, adOpenStatic, adLockReadOnly Set CreateRecordSet = rs ' rs.Close: Set rs = Nothing   ←この部分 ' cn.Close: Set cn = Nothing   ←この部分 End Function 標準モジュール内ではCloseやNothingしなくてもメモリの開放は行われているのでしょうか? アドバイスよろしくお願いいたします。

  • ADOでレコードを閉じるタイミング。。Access2000/VB6/Win2K

    レコードセットを返すFuncitonプロシージャーを作ってみたのですが。。。 下のGet_Recordsの方のレコードセットをCloseすると上の方のDisp_Dataでオブ ジェクトが閉じているといって怒られます。しかし、閉じないと下の方では開きっ ぱなしになると思うのですが。。。どのように処理すればいいのでしょうか? Public P_CN As ADODB.Connection Private Sub Disp_Date()   Dim RS As ADODB.Recordset   Dim SQL AS String    Set RS = Get_Records(SQL)     With RS      If .RecordCount > 0 Then       .MoveLast: .MoveFirst       .Debug.Print !顧客_ID        End If      End With      RS.Close     Set RS = Nothing End Sub Public Function Get_Records(pSQL As String) As ADODB.Recordset   Dim RS As ADODB.Recordset     Set RS = New ADODB.Recordset      RS.Open pSQL, P_CN, adOpenKeyset, adLockOptimistic     Set Get_Records = RS '''    RS.Close '''   Set RS = Nothing End Function

  • フォームの従業員番号と日付から該当レコードを

    フォームの従業員番号と日付から該当レコードを検索したいのですができません。 おそらくFilterの文法が間違えているのではと思いましたが、色々試した結果 自力ではダメでした。何卒よろしくお願いします Private Sub テスト() Dim CN As ADODB.Connection: Set CN = CurrentProject.Connection Dim RS As ADODB.Recordset: Set RS = New ADODB.Recordset RS.Open "勤怠表", CN, adOpenKeyset, adLockOptimistic RS.Filter = "従業員番号 = " & Me.TB_StaffID & " and 日付 = #" & Format(Me.TB_Date, "yyyy/mm/dd") & "#" If RS.RecordCount = 0 Then Debug.Print "ありません" Else Do Until RS.EOF Debug.Print RS!勤怠番号 RS.MoveNext Loop End If RS.Close: Set RS = Nothing CN.Close: Set CN = Nothing End Sub

  • レコードの削除

    VB6.0 ACCESSで開発しています。 t_nyukoテーブルのデータを全て削除するのは下記のように 出来たのですが dataGridに表示されているものを1つ選択し 選択されたものだけ削除したいのですがどうすればいいのでしょうか? よろしくお願いします。 Private Sub Command1_Click() Dim cn As New ADODB.Connection Dim cmd As ADODB.Command Dim cat As New ADODB.Command Dim strSQL As String   Set cn = New ADODB.Connection cn.ConnectionString = _ "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=C:\temp\db2.mdb" cn.Open cat.ActiveConnection = cn strSQL = "DELETE FROM t_nyuko " Set cmd = New ADODB.Command cmd.ActiveConnection = cn cmd.CommandText = strSQL cmd.Execute cn.Close Set cmd = Nothing Set cn = Nothing Set cat = Nothing End Sub

  • オープンしているレコードセットの中の最大値

    VB6でAccess2000です Dim RS As ADODB.Recordset Dim SQL,CN As String RS.Open SQL, CN, adOpenStatic という形で一度オープンしてしまったレコードセットにIDフィールドがあり、その最大値を取得したい場合、どのような方法を用いればいいのでしょうか?