【ADO】「Filter」を使うか「WHERE」を使うか

このQ&Aのポイント
  • アクセス2003で、ADOの「Filter」を使うか「WHERE」を使うか悩んでいます。
  • どちらもTテーブルのフィールド1にりんごの文字が入力されているレコードを抽出する動作をするプログラムです。
  • どちらがより効率的で、他人が見てもわかりやすいコードになるでしょうか?
回答を見る
  • ベストアンサー

【ADO】「Filter」を使うか「WHERE」を使うか

こんばんは。 アクセス2003です。 「Filter」を使うか「WHERE」を使うかべきかわからないので教えてください。 Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Sub test1() cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & アクセスファイル名 rs.Open "SELECT * FROM Tテーブル WHERE 'フィールド1'='りんご", cn, adOpenKeyset, adLockOptimistic rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub Sub test2() cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & アクセスファイル名 rs.Open "SELECT * FROM Tテーブル", cn, adOpenKeyset, adLockOptimistic rs.Filter = "フィールド1 = " & "'" & "りんご" & "'" rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub 以上のふたつのステートメントは Tテーブルのフィールド1にりんごの文字が入力されているレコート゛を抽出します。 いくつかこのような動作をするプログラムを書くのですが どちらのほうがコート゛として適していますか? WHEREを使うtest1の方がコート゛が短くなるからいいのでしょうか? というのもいつかこのファイルを引き継ぐので他人が見てもわかりやすくしたいです。 よろしくお願い致します。

  • qwfgjo
  • お礼率100% (282/282)

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

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.1

どちらでも結果は同じではないですか。 一端SELECTしたレコードをそれを対象にFilterをかけるのでしょうか。 処理時間を気にしてるのですか。それは私では判りませんが。 ーー 後者Filterに関して、私がテストしてみました。いま社員2.mdbを開いていて、社員3テーブルを対象にFilterしました。 >rs.Open "SELECT * FROM Tテーブル", cn, adOpenKeyset, の部分adLockOptimisticの"SELECT * FROM Tテーブル", は不要ではないですか。 私のテスト例 Sub test09() Dim moji As String Dim URL As String Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset rs.Open "社員3", cn, adOpenStatic, adLockPessimistic rs.Filter = "国語点数 <= 20" '--------- If rs.RecordCount = 0 Then MsgBox "該当するレコードは存在しません" Else Do MsgBox rs.Fields("国語点数") & "ーー" & rs.Fields("氏名") rs.MoveNext Loop Until rs.EOF End If rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub

qwfgjo
質問者

お礼

わざわざテストありがとうございます。 どちらもかわらないのですね。 参考になりました。

関連するQ&A

  • ADO 英語を含むレコードを抽出したい

    テーブルに保存されてるフィールド1の英語が含まれているレコード(ABC株式会社 など)を抽出したいのですが 方法がわかりません。 *[a-z]* を使うんだなと思いますが、フィルタのかけかたがわかりません。 Sub test() Dim CN As New ADODB.Connection Dim RS As New ADODB.Recordset CN.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ファイル名 RS.Open "テーブル1", CN, adOpenStatic, adLockOptimistic RS.Filter = "フィールド1 = " '←ここをどうすればいいでしょうか? RS.Close: Set RS = Nothing CN.Close: Set CN = Nothing End Sub サンプルを作ってみたのですが ご教示頂けないでしょうか? よろしくお願い致します。

  • ADOでアポストロフィー入りの値をフィルタしたい

    例えばレコードの値が「あああ'ああ」だった場合、 ----------------------------------------------------- Sub test() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim MyFileName As String MyFileName = CurrentProject.FullName cn.Open "Provider = Microsoft.ACE.OLEDB.12.0;" & "Data Source= " & MyFileName rs.Open "テーブル1", cn, adOpenKeyset, adLockOptimistic rs.Filter = "フィールド1 = " & "'あああ'ああ'" MsgBox rs.RecordCount rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub ----------------------------------------------------- とすると 実行時エラー3001「引数が間違った型、許容範囲外、または競合しています。」 になってしまいます。 ADOでアポストロフィー入りの値をフィルタする方法を教えてください。

  • 参照設定にチェックを入れないでADOを使いたい

    アクセス2003です。 テーブル1にテキスト型のフィールド1を作り、数レコードをサンプルで入れました。 そしてVBE画面で Sub test() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source= " & CurrentProject.FullName rs.Open "テーブル1", cn, adOpenKeyset, adLockOptimistic MsgBox rs.RecordCount rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub としたらレコード件数が取得できました。 質問は ツール→参照設定の Microsoft ActiveX Data Objects 2.8 Library にチェックをいれなくても VBAコードだけで参照設定できたような気がするので そのコードを教えてくいただけませんか? アドバイスよろしくお願いします。

  • closeとメモリの開放について

    Sub test() Set cn = New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ファイル名 Set rs = New ADODB.Recordset rs.Open "テーブル1", cn, adOpenKeyset, adLockOptimistic Set rs = Nothing Set cn = Nothing End Sub この場合は rs.close cn.close はなくても問題ないですか? 調べてみると 「メモリの開放」という言葉を目にするのですが これがなんのことだかわかりません。 タスクマネージャーで確認するのでしょうか? よろしくお願いします。

  • エクセル 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はプログラムとして少し変かな?と思うのですが どうでしょう? よろしくお願いします。

  • access Ado フィルタ 含むができない

    バージョン2007です テーブル名:テーブル1 フィールド名:ファイル名 レコードには色々なファイル名が入っていて、テキストファイルだけを抽出したいのですが Sub test() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset cn.Open "Provider = Microsoft.ACE.OLEDB.12.0;" & "Data Source= " & CurrentProject.FullName rs.Open "テーブル1", cn, adOpenKeyset, adLockOptimistic rs.Filter = "ファイル名 like '%.txt'" MsgBox rs.RecordCount rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub これをすると 実行時エラー 3001  引数が間違った型、許容範囲外、又は競合しています。なります。 しかもなぜかヘルプファイルが開けません。(画像をご参照ください) rs.Filter = "ファイル名 like '*.txt'" これに変えてもおなじです。 「含む」と言う条件で抽出したい場合はどうすればいいでしょうか? ご教授よろしくお願いします。

  • ADOでアクセスのレコードに複数のフィルタをかけるには?

    Sub ADO() Set cn = New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & アクセスファイル名 Set rs = New ADODB.Recordset rs.Open "テーブル1", cn, adOpenKeyset, adLockOptimistic rs.Filter = ("フィールド1 = " & "'" & 変数1 & "'") rs.Filter = ("フィールド2 = " & "'" & 変数2 & "'") Debug.Print rs.RecordCount Set rs = Nothing Set cn = Nothing End Sub だと最終的にはフィールド2のフィルタ後の個数しか取得できません。 rs.Filter = ("案件CD = " & "'" & 案件CD & "'" And "プロセス = " & "'" & プロセス & "'") だと「型が一致しません」になります。 どうすれば変数1と変数2のフィルタ後のレコードの個数を取得できるのでしょうか? ご教授よろしくお願い致します。

  • ADOでエクセルからSQL Serverへデータを移行するには

    エクセルvbaのADOを使って、 SQL Serverの「test」という名のデータベースの「Table_1」に 新規レコードを追加する事はできますか? エクセルからアクセスには Sub test() Dim データベース名 As String Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection Set rs = New ADODB.Recordset cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & データベース名 rs.Open "Tテーブル1", cn, adOpenKeyset, adLockOptimistic rs.AddNew rs.Fields("フィールド1") = データ rs.Update rs.Close cn.Close Set rs = Nothing Set cn = Nothing End Sub で移行しています。 これをエクセルからSQL Serverへ移行させるにはどうすればいいのでしょうか? よろしくお願いします。

  • WHERE と Filter

    アクセスのADOで rs.Open "SELECT * FROM テーブル1 WHERE フィールド1=あ", cn, adOpenStatic, adLockOptimistic とするのと、 rs.Open "テーブル1", cn, adOpenStatic, adLockPessimistic rs.Filter = "フィールド1゛ = 'あ'" とするのでは、 どちらの方が処理速度が速いですか?

  • WHERE レコードが抽出されない

    ADOでSQL文を作ってるのですが WHERE句がうまくできません。 rs.Open "T_テーブル", cn, adOpenKeyset, adLockOptimistic rs.Filter = "URL like '#*'" なら、うまくいくのですが、 Filterを使うのをやめて、WHEREに書きかえると、エラーにはならないのですが 取得レコードが0件になります。 rs.Open "T_テーブル WHERE [URL] like '#*';", cn, adOpenKeyset, adLockOptimistic も rs.Open "T_テーブル WHERE URL like '#*';", cn, adOpenKeyset, adLockOptimistic も、0件が返ります。 何がおかしいのでしょうか? URLフィールドで、#で始まるレコードを抽出したいです。

専門家に質問してみよう