- ベストアンサー
リストボックスで選択したレコードを削除
お世話になります。 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 備考
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
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
その他の回答 (7)
s_husky です。 主キー列名は、[ID]ではなく[自社No.]ではありませんか? 主キー列名を、[ID]ではなく間違って[IDD]と書いたら同じエラーを取得したとの回答。 「この辺りのチェックを!」ということです。
お礼
おはようございます。 >主キー列名は、[ID]ではなく[自社No.]ではありませんか? 仰る通りです。 ほんとどうもすみませんでした。 おかげさまで質問タイトル通りの結果を得る事が出来ました! 本当にありがとうございました!
s_husky です。 同じエラーを返すことに成功しました。 ? CnnExecute( "DELETE FROM TEST WHERE IDD=3") False つまり、Access.adp ではなく Access.mdb でテストしました。 単なるテーブル名か列名のミスです。 Access.adp と Access.mdb とではエラー内容が違っていました。 重ね重ねのミスお詫びします。
お礼
ありがとうございます。 >単なるテーブル名か列名のミスです。 との事ですが、表記のミスでしょうか。 それとも何か使用してはいけない文字を使用しており それによるミスなのでしょうか。
s_husky です。 CnnExecute 関数が感知したエラーを表示しています。 ですから、何らかの理由でSQL文の実行時にエラーが発生しています。 Private Sub コマンド0_Click() CnnExecute "Delete FROM T_自社情報 WHERE ID=3" End Sub ところで、これを実行すると、列[ID]=3のレコードが削除されます。 エラーは確認されません。 ということは、SQL文そのものには誤りはないと考えられます。 また、SQL文のエラーは、それはそれとして返ってくる筈です。 もしかしたら、[T_自社情報]自体をオープンできますか? それ自体がクエリか何かでパラメータに問題があるとか・・・。 判りません。 ※ウーン!これは、経験豊かなプロの出番かも・・・。 ※力不足ですみません。
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
お礼
本当にありがとうございます。 早速上記のコードを示唆通りコピペしたところ、以下のメッセージが表示されます。 また、何度も申し訳ありませんがご教授の程よろしくお願い致します。 m(__)m ADO関数エラー Err.Discription =1つ以上の必要なパラメータの値が設定されていません。 Err.Number = -2147217904 SQL State = SQL Text=Delete FROM T_自社情報 WHERE ID=3
s_husky です。 もしかして、選択したリストだけを削除するのであれば次のようです。 Private Sub コマンド0_Click() CnnExecute "DELETE FROM Table1 WHERE ID=" & _ Me.リスト_削除対象.ItemData(Me.リスト_削除対象.ListIndex) End Sub
少し、ルーチンが複雑かなと思いました。 次のように書くことも可能かと思います。 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)
検証したわけではありませんが気になったのは 『var条件 = ""』で十分なのか。 Debug.Print で何が格納されているか。,,,,,,,,,, レコードセットを回さずとも mySQL = "SELECT * FROM ・・・をmySQL = "Delete * FROM・・・ にして cn.Execute mySQL ・・・ にした方が速いのではないか。 ボケレス御免
お礼
ありがとうございます。とても助かります。 上記の指示頂いたコードで早速試してみたところ、CnnExecuteの箇所でエラーが出てしまいます。 何度も申し訳ありませんが、再度ご教授お願いできないでしょうか。 よろしくお願いします。