• ベストアンサー

Access97VBAでのFilter方法

・初歩的な質問でスミマセン。  Access97のVBAでツマヅキ、何か解決の方法はないかと思い質問させていただきます。 クエリー1を元にして作成した、開いている「フォームA」の「テキスト1」(テキストボックス)の文字列でフィルターをかけたいと思っています。 下記のコードを書き実行するのですが、フィルターがかからずクエリー1のデータがそのまま抽出されてしまいます。 Filterコマンド行の記述が間違っているのでしょうか? * クエリ1に「フォームA」の「テキスト1」ボックスを参照する抽出条件を入れてたのですが、「パラメータが少なすぎます。・・・」のエラーとなるので、この方法で行っています。 * Private Sub コマンド6_Click() Dim stTBL, stFltr As Recordset Dim stQRY As DAO.Recordset Set stQRY = CurrentDb.OpenRecordset("クエリー1") stQRY.Filter = "テキスト1='" & [Forms]![フォームA]![テキスト1] & "'" Set stFltr = stQRY.OpenRecordset stQRY.MoveFirst Do Until stQRY.EOF MsgBox stQRY.Fields("フィールド2") stQRY.MoveNext End If Loop 以上のようなんですが、どうかご指導お願いします。

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

  • ベストアンサー
  • holly2001
  • ベストアンサー率75% (25/33)
回答No.3

#2です。混乱してしまったので、まずは整理させて下さい。 [フォーム1]と書かれていますが、質問文の[フォームA]のことでしょうか? なさりたいのは、[テキスト1]で[フォームA]を絞り込むと同時にMsgboxで[フィールド2]を表示する、つまり、#1の方のご回答と#2をあわせたものですか? 上記と仮定して続けます。 先に[フォームA]にフィルターをかければ、Msgbox表示用にはMe.RecordsetCloneをそのまま使えるようになるので、次の形でいかがでしょうか。 ------------------------------------------------------------ Private Sub コマンド6_Click() Dim stFltr As DAO.Recordset 'フォームAのレコードを絞り込む With Me .Filter = "テキスト1='" & [Forms]![フォームA]![テキスト1] & "'" .FilterOn = True End With '絞り込み後のフィールド2をメッセージ表示する Set stFltr = Me.RecordsetClone stFltr.MoveFirst Do Until stFltr.EOF MsgBox stFltr.Fields("フィールド2") stFltr.MoveNext Loop End Sub ------------------------------------------------------------ (的外れかも(^^;)。もう少し実際の形に近い説明を頂けるとありがたいです。) 別件◆解説書 私はVBから入ったのであまり使いませんが、知人にすすめる時は、1)Access添付ヘルプ、2)小技集、3)リファレンスブック、4)サンプルデータベース集、の順です。 ◇1)のヘルプを使いこなし、使用例や関連項目にも合わせて目を通すようにすれば、かなり理解が深まります。例えば「stQRY.Filter」と入力した直後に[F1]キーを押せば、#2の※印で解説した内容に行き着きます。 ◇ヘルプの使用例が物足りない時は、2)の小技集(一問一答式で例文と解説が短く記述されているもの)を。できるだけ項目数の多いものを選べば、目次でしたいことを探して例文を手に入れられます。  (ISBN4-7741-0835-9 技術評論社「Access2000 表現百科500」など) ◇ヘルプ操作が面倒な方は、3)のリファレンスブック(辞書のようなもの)を。  (ISBN4-8163-2818-1 ナツメ社「Access2000 VBAハンドブック データ操作編」など) ◇目的がはっきりしているなら、それに似た例題のある、4)のサンプル集(CD付)を探すのも良いでしょう。  (ISBN4-7741-1152-X 技術評論社「Access2000 プロが作った!お手本データベース41選」など) この他に、データベース設計の基本をおさらいしたり、SQLが書けるように、この機会に中上級者向けの論述型の書籍を一読なさるのも良いと思います。  (ISBN4-8222-0930-X 日経BP社「実践Accessデータベース上級テクニック」など)

ironman
質問者

お礼

・丁寧なご回答ほんとうに有難うございます。 Set stFltr = Me.RecordsetCloneで、すでにフィルタをかけた状態のレコードセットになると解釈しました。ご紹介いただいた「本」などを見つけ、今後もコツコツ勉強していきます。  

その他の回答 (2)

  • holly2001
  • ベストアンサー率75% (25/33)
回答No.2

ご苦心の後が解ります。お手本の丸ごとコピーでなく、ご自分で調べて書かれたんですね。 なので、できるだけ原形を残しましょう。 (行番号は、「Private Sub~」から、空の行を飛ばして数えて下さい。) Line2:「stTBL」は、使われていないので削除。    「stFltr」は、フィルターをかけたRecordsetですね。ここにも「DAO.」をつけておきましょう。 Line4:クエリー1は、このプロシージャ(コマンド6_Click)の呼出元(フォームA)で使っています。    この場合は一般的に「自分自身(フォームA)のレコードソースのコピー」という意味で、    「Me.RecordsetClone」をSetします。 Line6:「stQRY」を使っていますが、5行目でフィルターがかかったのは「stFltr」です。(※)    これ以降の6~9行目は全て「stFltr」に書き換えて下さい。 Line10:「If」が無いので、この行は削除。 (※)この6行目がネックです。 1つめのRecordsetオブジェクト(stQRY)のFilterプロパティを設定しても、stQRYに含まれるレコードは減りません。 「stQRYを元に開く、新しいRecordsetオブジェクトが、stQRYのうちFilter条件に合うレコードを取得する」だけ、要は「次に開くヤツにフィルターかけてね」という予約みたいなものです。 つまり、実際にフィルターがかかるのは、2つ目のRecordsetオブジェクト(stFltr)です。 さて、あえて修正後のコードは書きませんが、うまく行ったでしょうか?もし駄目なら返信して下さい。 あとは、本筋に関係無い、細かい話です。 (1) 変数名は、先頭の2~3文字に、タグと呼ばれる変数の質を表す略語をつける習慣があります。  「stQRY」なら「st」がタグにあたるようですが、これだとString(文字列型)に見えてしまうので、   Recordsetなら「rsQRY」の方が解りやすいです。   (ちなみに、本当にString型の場合は「str」をつける事が多いですが、これはお好みで。) (2) 変数名はもちろんですが、クエリ・フォーム・フィールド名など、VBA内で使う要素は、   全て英数字にした方が安全です。   2バイト文字(日本語など)を使うと、解析困難なエラーなど、思わぬトラブルの引き金になります。   同じ理由で、ユーザーアカウント・フォルダ・ファイル名も、日本語は好ましくないようです。 なお、目的が「コマンドボタンを押すと、フォームAにフィルタをかけた状態にする」なら、 #1の方の回答が簡潔で素晴らしいと思います。

ironman
質問者

お礼

・有難うございます。各行ごとの詳細な解説まで戴き、本当に感謝しています。これからご説明いただいた内容を確認していきます。この場をお借りしてはなんですが、ご回答いただいたような噛み砕いた解説書などをご存知ですか?良い書籍があったらお教えください。 取り急ぎお礼まで・・。

ironman
質問者

補足

・お教えいただいた結果で上手く絞り込みができました。関連で今ひとつ上手くいきません。 フォーム1はサブフォームで、このプロシージャはフォーム1を開くイベントに付いています。 stFltrをsetしたあとのメッセージ表示(Msgbox)などは、フィルタが有効になり、絞り込まれたレコードが抽出出来ました。(有難うございます) ただ、今開いているフォーム1はクエリー1をレコードソースとしているためか、クエリー1の全レコードが表示されています。実はこのフォーム1にはstFltrの結果を表示したいのです。 そこで、stFltrをフォーム1のレコードソースにすべく「Me.Recordsorce = stFltr」としましたが、文字列ではないので、当然エラーとなってしましました。 また、stFltrのあとに「FilterON = True」も試しましたが上手くいきません。 レコードソースを変更する方法をお教え願えませんでしょうか? #1で教えて戴いた方法を使えば絞り込まれた結果となりますが、その後処理で各々のレコードにある、別のフィールドにプローシジャで処理したテキストを 追加しようと思っています。(Do Until stFltr.EOF .... LOOP を使い)ですから、stFltrの結果を有効にしたいのです。 以上、よろしくお願い致します。

  • redsky
  • ベストアンサー率18% (66/360)
回答No.1

単純に、 Private Sub コマンド6_Click()  Filter = "テキスト1='" & [Forms]![フォームA]![テキスト1] & "'"  FilterOn = True end sub ではダメなんですか??

ironman
質問者

お礼

・出来ました。この感じで良いです。如何せん、コマンドの意味や機能をあまり理解しないで作っていますので、本当に必要なもの、逆に不要なものの区別が出来なくなってしました。有難うございました。

関連するQ&A

  • Access2002のVBAエラーで

    クエリで抽出したレコードを利用したいのですがうまくいきません。 Dim ds As Database Dim rs As Recordset Set ds = CurrentDb Set rs = ds.OpenRecordset("クエリ名") デバッグすると  Set rs = ds.OpenRecordset("クエリ名") で止まります。 「実行時エラー’3061’ パラメータが少なすぎます。1を指定してください」のメッセージです。 どのような意味でしょう。教えてください。

  • ACCESS2000VBAでエラー「型が一致しません」

    ACCESS2000で、フォーム上にボタンを作り、そのボタンをクリック時に 以下のイベント プロシージャを実行させています。 Dim dbs As Database Dim rst As Recordset Set dbs = CurrentDb Set rst = dbs.OpenRecordset("採番_相談者") Dim Number rst.MoveFirst Number = rst!相談者番号 Number = Number + 1 Me.相談者NO = Number '相談者NOはフォーム上のテキストボックスです。 で上記 Set rst = dbs.OpenRecordset("採番_相談者") の所で、「実行時エラー 13 型が一致しません」とエラーになります。 テーブル:採番_相談者は、オートナンバー型のIDフィールドと相談者番号という7桁のテキスト型で ”1000001”が入っています。(ちなみに、数値型に変えても同じエラーでした。) 詳しい方教えてください。お願いします。

  • アクセスVBA 変数での抽出条件の書きかた

    顧客データテーブルからの抽出です。 変数を使った書き方がわかりません。 よろしくお願いします。 テーブルのレコードには [氏名]:鈴木 [telnum]:0123456789 が存在します。 Private Sub テキスト0_BeforeUpdate(Cancel As Integer) Dim db As DAO.Database Dim rs As DAO.Recordset Set db = CurrentDb Set rs = db.OpenRecordset("顧客マスタ", dbOpenDynaset) Dim str As String str = "0123456789" rs.Filter = "[telnum] = ' " & str & " ' " Set rs = rs.OpenRecordset MsgBox (rs!氏名) ’←エラーメッセージ”カレントレコードがありません。”が出ます End Sub

  • Access VBAでクエリーのレコード件数を取得したいのですが

    Access2003のVBAで次のような構文を用いてクエリーの該当レコード数を取得したいのですがうまく出来ません。 構文又は手法が間違っているのでしょうか。 Dim db As Database Dim rs As Recordset Dim cnt As Long Set db = CurrentDb Set rs = db.OpenRecordset("該当顧客リストクエリ", dbOpenTable) cnt = rs.RecordCount ※OpenRecordsetの行で「実行時エラー'3219'無効な処理です」と出てしまいます。 又、”該当顧客リストクエリ”では特定の抽出条件を設定して、”顧客リストテーブル”の一部を抽出するようにしています。

  • ACCESS どこがおかしいのか?

    ACCESSで。クエリからフォームを作成し、検索フォームを作成しようとしています。 AND条件とOR条件を作り検索(抽出)を行いたいのですが、何が間違っているのか、 検索をかけるとすべて「登録がありません」になってしまいます。 どこが間違っているのか、もしくは代替案を教えていただけますでしょうか。 以下は記述した、VBAコードです。 Private Sub 検索ボタン_Click() Dim db As DAO.Database Dim rs As DAO.Recordset Dim stFil As String Set db = CurrentDb() Set rs = db.OpenRecordset("Q_Autoweb", dbOpenDynaset) 'オプションボタンで条件を選択 If 検索条件 = 1 Then rs.Filter = "[タイトル]='" & タイトル検索 & "' and [本文]='" & テキスト15 & "'" Else rs.Filter = "[タイトル]='" & タイトル検索 & "' or [本文]='" & テキスト15 & "'" End If Set rs = rs.OpenRecordset Set Me.Recordset = rs If rs.EOF = True Then MsgBox "登録がありません" Else Me.ID = rs!ID Me.案件名 = rs!案件名 Me.タイトル = rs!タイトル Me.本文 = rs!本文 End If rs.Close Set rs = Nothing db.Close Set db = Nothing End Sub よろしくお願いします。

  • Access VBAでのデータ抽出の仕方

    Access VBAでのデータ抽出の仕方 Access VBAでデータを抽出して、テキストボックスにデータを配置したいと思います。 Formにtxt1~txt10までのテキストボックスが10個あります。 テーブルからデータを引っ張ってきてレコードセットにいれます。 Dim objADOCON As ADODB.Connection Dim objADORS As ADODB.Recordset Dim strSQL As String Dim SQL As string SQL = "Select * from Table1" Set objADOCON = Application.CurrentProject.Connection Set objADORS = objADOCON.Execute(SQL) これでレコードセットを取得しました。このレコードセットは「ID」列があり、プライマリーキーを設定しています。またZAIKOという列もあります。 ID=001の時、在庫は100 ID=002の時、在庫は200 といったように条件を絞って、テキストボックスに値を入れたいと思います。 objADORS.Filter = "[ID] = '001'" txt1.value = objADORS!ZAIKO objADORS.Filter = "[ID] = '002'" txt2.value = objADORS!ZAIKO ..... を10回繰り返せば条件毎に値がセットするのはわかります。 ただし、あまりスマートなやり方ではなく、もっといい方法があるんじゃないかと思うのですが考えつきません。 何か良い方法、手段がありましたらお教え下さい。 よろしくお願いします。

  • Access VBA 日付で抽出できない?

    次の質問にお答えいただけませんか。 フォームで抽出条件を入力しテーブルから抽出をするとき Dim db As DAO.Database Dim rs As DAO.Recordset Dim mySQL As String Set db = CurrentDb() mySQL = "SELECT * FROM T_明細 " _ & "WHERE 顧客ID = " & CStr(Me!txtKey) & ";" Set rs = db.OpenRecordset(mySQL, dbOpenDynaset) 上記のような記述をしました。 テーブル名:T_明細   フィールド:顧客ID  日付 金額  フォームの抽出条件入力テキストボックス:txtKey このとき顧客IDでの抽出は問題なく出来ましたが "WHERE 顧客ID = を "WHERE 日付 = に変更して日付で抽出をしたいのですがうまくいきません。 テーブルの日付フィールドは 書式をgee-mm-dd 定型入力を>L99\-99\-99;0;# で書き込みました。 フォームのtxtKeyテキストボックスのプロパティも書式をgee-mm-dd 定型入力を>L99\-99\-99;0;#に設定してあります。 このようなときは mySQL = "SELECT * FROM T_明細 " _ & "WHERE 日付 = " & CStr(Me!txtKey) & ";" の、記述を何か変更しないといけないような気もしますが 対処の方法を教えていただけませんか。

  • ACCESS VBA Parametersで or演算子を使用するには

    ACCESS VBA Parametersで or演算子を使用するには? 抽出クエリを作成して、抽出条件欄に"[WWW]"を設定してます。 このクエリを使用して下記のコードを実行した所、カレントレコード無しとの メッセージがでました。レコードは確かにいます。(1)の記述が悪いのでしょうか? Sub 処理() Dim DB As Database Dim 情報 As Recordset Dim Qdf As QueryDef 'db Set DB = CurrentDb Set Qdf = DB.QueryDefs("情報") Qdf.Parameters("WWW") = " 01" OR "02" → (1) Set 情報 = Qdf.OpenRecordset() 情報.MoveFirst  → デバックでとまるところ Do Until 情報.EOF MsgBox (情報!情報2) 情報.MoveNext Loop 情報.Close DB.Close End Sub ORをなくし"01"だけだとうまくいきます。 どうしても、このロジックを通したいのですが 教えてください。 ACCESS2000、XPPro を使用してます。

  • ACCESS VBA Filterに配列を使いたい

    初めての書込みです。誤りがあれば、訂正致しますので、宜しくお願いします。 (背景) Access2003で作成したプログラムを、3年ほど使ってきました。 少しずつバージョンアップを加え、機能を増やしてきた次第です。 これまでの検索は、クエリによる抽出条件設定を行っていましたが、 入力型フィールドが2つから4つに増えるため、Is Null とlikeによる抽出条件の設定ではカバーしきれないと判断しました。 (本題) 検索結果フォームのレコードに、VBAでFilterをかけるべく頑張ってきましたが、 Loopを使う為にフィールド名を配列変数にしているところで 行き詰まってしまいました。 (やりたいこと) 検索条件 ="部署 Like '*人事*'"   'としたい。 (今の状態) 検索条件 = "部署 Like '* Form_frm_検索ボックス!部署検索 *'" 'となってしまう。 (1)コード 検索条件 = sh(i) & " Like '*" & "Form_frm_検索ボックス!" & sh(i) & "検索" & "*'" (2)データ型 Dim 検索条件 As Variant Dim sh(4) As String Dim i as integer コード、及びデータ型で、間違っている場所が分かれば、ご指導頂けないでしょうか。 宜しくお願いします。

  • Access VBAでのフィルタ処理

    アクセス2003を使用しています。 今VBAを使用して、フォームのテキストボックスに記入された文字列を検索条件に、 クエリからデータ抽出したいのですが、 うまくいきません。 解決したい事は、 「abc*」といったように、前方が一致している文字列データを すべて抽出するといった処理です。 今は下記のようなプログラムを組んでいます。 Private Sub コマンド1_Click() On Error GoTo Err_コマンド1_Click Dim stDocName As String Dim stLinkCriteria As String stDocName = "クエリ1" DoCmd.OpenQuery stDocName, acNormal, acEdit If IsNull(テキストボックス) Then Else stLinkCriteria = "[クエリデータ]=" & "'" & Me![テキストボックス] & "'" End If DoCmd.ApplyFilter stDocName, stLinkCriteria Exit_コマンド1_Click: Exit Sub Err_コマンド1_Click: MsgBox Err.Description Resume Exit_コマンド1_Click End Sub これだと完全に一致しなければ抽出してくれません。 どの様に変更すればよいでしょうか? よろしくお願いします。