• ベストアンサー

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

お世話になります。 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