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

解決済みの質問

エクセル ADO Filterでは一気に削除はできないのですか?

カテ違いならすいません。

Tメインテーブルの番号フィールド(主キーではない為重複がある)に該当の番号があればそのレコードを削除するアクセスVBAを考えているのですが行き詰っています。

Public ADOrs As ADODB.Recordset
Public cn As ADODB.Connection
****************************************************
Sub 削除1()
Set cn = New ADODB.Connection
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & CurrentProject.Name
番号 = Forms("フォーム1").Controls("番号").Value


Set ADOrs = New ADODB.Recordset
ADOrs.Open "SELECT * FROM Tメイン", cn, adOpenKeyset, adLockOptimistic

ADOrs.Filter = "番号 = '" & 番号 & "'"

ADOrs.Delete
ADOrs.Update

ADOrs.Close: Set ADOrs = Nothing
cn.Close: Set cn = Nothing
End Sub
****************************************************
↑これで
もし、Tメインの番号フィールドに該当の番号が3レコート゛あれば全部一気にDelete出来るわけではないのですか?
一気にフィルタにかかっているレコードを削除できると思ってたのですが1レコート゛ずつのようです。

しかし
****************************************************
Sub 削除2()
Set cn = New ADODB.Connection
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & CurrentProject.Name
番号 = Forms("フォーム1").Controls("番号").Value

Set ADOrs = New ADODB.Recordset
ADOrs.Open "SELECT * FROM Tメイン", cn, adOpenKeyset, adLockOptimistic
ADOrs.Filter = "番号 = '" & 番号 & "'"

Do While ADOrs.RecordCount <> 0
'あるなら
ADOrs.Delete
ADOrs.Update '保存
Loop

ADOrs.Close: Set ADOrs = Nothing
cn.Close: Set cn = Nothing
End Sub
****************************************************
としたら

実行時エラー '-2147217887 (80040e21)':
複数ステップの OLE DB の操作でエラーが発生しました。各 OLE DB の状態の値を確認してください。作業は終了しませんでした。

のエラーになりました。

なので、
****************************************************
Sub 削除3()
Set cn = New ADODB.Connection
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & CurrentProject.Name
番号 = Forms("フォーム1").Controls("番号").Value

Set ADOrs = New ADODB.Recordset
ADOrs.Open "SELECT * FROM Tメイン", cn, adOpenKeyset, adLockOptimistic
ADOrs.Filter = "番号 = '" & 番号 & "'"
Do While ADOrs.RecordCount <> 0
'あるなら
ADOrs.Delete
ADOrs.Update '保存
ADOrs.Close: Set ADOrs = Nothing

Set ADOrs = New ADODB.Recordset
ADOrs.Open "SELECT * FROM Tメイン", cn, adOpenKeyset, adLockOptimistic
ADOrs.Filter = "番号 = '" & 番号 & "'"
Loop

ADOrs.Close: Set ADOrs = Nothing
cn.Close: Set cn = Nothing
End Sub
****************************************************
と言うように1レコートずつまわしていくしかないのでしょうか?

削除3はプログラムとして少し変かな?と思うのですが
どうでしょう?
よろしくお願いします。

投稿日時 - 2009-04-27 21:50:20

QNo.4914145

暇なときに回答ください

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

Deleteメソッドはレコード単位での削除ですね

Sub 削除1()
  Set cn = New ADODB.Connection
  cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & CurrentProject.Name
  番号 = Forms("フォーム1").Controls("番号").Value
  
  Set ADOrs = New ADODB.Recordset
  ADOrs.Open "SELECT * FROM Tメイン", cn, adOpenKeyset, adLockOptimistic

  ADOrs.Filter = "番号 = '" & 番号 & "'"

  on error resume Next
  ' 最初の要素へ移動
  ADOrs.MoveFirst
  On Error Goto 0

  ' 要素がある間ループする
  do until ADOrs.EOF
    ADOrs.Delete
    ' カレントレコードを変更する
    ADOrs.MoveFirst
  Loop
  ADOrs.Close: Set ADOrs = Nothing
  cn.Close: Set cn = Nothing
End Sub
といった具合でしょう

番号で特定した行を削除するなら
cn.Execute "DELETE FROM Tメイン WHERE 番号='" & 番号 & "'"
といった具合にすれば 一度に削除できます

投稿日時 - 2009-04-27 22:13:25

お礼

ありがとうございます!!!
「cn.Execute "DELETE FROM Tメイン WHERE 番号='" & 番号 & "'"」
これを使うことにしました!
質問してよかったです!
大変参考になりました。

投稿日時 - 2009-04-28 21:10:47

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

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

回答(1)

あなたにオススメの質問