none
openformメソッドで、filterが効かない。 RRS feed

  • 質問

  • WinXP SP3、Access2003SP3のであるデータを、共通の帳票フォームで、条件に応じて表示分けようと思っています。

    Docmd.Openform "帳票フォーム",,"条件クエリ"

    帳票フォームの設計時のプロパティでは、データソースは、未設定になっています。ところが、この条件クエリが効きません。しょうがなく、同じクエリ名をデータソースに設定すると、幾つかある条件クエリは、それぞれ動作・表示されます。

    なにか、これを有効にする条件などがあるのでしょうか?

    注意スべき点などあるのでしょうか?

    よろしくご教授ください。

    2012年8月28日 11:08

回答

  • FilterNameという名前が示しているように、フィルタ(抽出条件)を設定するもので、レコードソースを設定するものではありません。
    フォームのレコードソースを元に抽出条件を設定したクエリを指定すれば、フィルタがかかります。
    レコードソースと関係ないクエリ、あるいはレコードソースが指定してないフォームで指定しても無視されます。

    抽出条件が変わるだけでなく、対象テーブルや結合状態が変わるようなクエリを設定したい場合は、
    RecordSourceプロパティに直接クエリ名を設定してください。

    コード例
    DoCmd.OpenForm "帳票フォーム", , , , , acHidden
    Forms!帳票フォーム.RecordSouce = "クエリ名"
    Forms!帳票フォーム.Visible = True

    • 編集済み hatena19 2012年8月31日 10:35
    • 回答としてマーク Tolbie 2012年8月31日 14:10
    2012年8月31日 10:14

すべての返信

  • Docmd.Openform "帳票フォーム",,"条件クエリ"

    帳票フォームの設計時のプロパティでは、データソースは、未設定になっています。ところが、この条件クエリが効きません。しょうがなく、同じクエリ名をデータソースに設定すると、幾つかある条件クエリは、それぞれ動作・表示されます。

    なにか、これを有効にする条件などがあるのでしょうか?

    データソースが未設定と言うことですが、フォームの「レコードソース」プロパティが空白になっていると言うことでしょうか。もし、そうならば、フォームには何も表示されません。

    Openform の第3引数(FilterName)はフィルタを設定するためのもので、ソースに何もないものにフィルタをかけてもやはり何もないことになります。

    使い方としては、レコードソースには、テーブルをそのまま設定するか、抽出条件を設定していないクエリを設定して、フィルタをかけたいときに、応じたクエリ名を、第3引数に設定するという使い方をします。

    ただ、VBAでフォームを開くときにフィルタをかけるなら、第4引数(WhereCondition)を設定する使い方が一般的です。

    Docmd.Openform "帳票フォーム", , ,"抽出条件式"


    2012年8月30日 11:50
  • 回答有り難うございます。

    openformメソッドのヘルプに以下の様な説明があるのですが、

    FilterName      省略可能です。バリアント型 (Variant) の値を指定します。カレント データベースのクエリの有効な名前を文字列式で指定します。

    私は、このクエリに寄って、データソースが決まるのだと思っていました。

    試しに、基本となるテーブルをプロパティのデータソースに設定して、なおかつ、このFilterにもっと複雑な事をしているクエリを第3パラメータFilterに与えてみると、Filterは、全く無視されて、テーブルが全部表示されてしまいました。

    第2パラメータ以降をコメントアウトして、当該クエリをプロパティに記述すると、思った通りのクエリの結果が表示されます。

    フォームは、データ表示の枠で、その内容をクエリを切り替えることによって、色々な表示をさせる、というのは、間違った使い方なのでしょうか?

    2012年8月30日 14:02
  • FilterNameという名前が示しているように、フィルタ(抽出条件)を設定するもので、レコードソースを設定するものではありません。
    フォームのレコードソースを元に抽出条件を設定したクエリを指定すれば、フィルタがかかります。
    レコードソースと関係ないクエリ、あるいはレコードソースが指定してないフォームで指定しても無視されます。

    抽出条件が変わるだけでなく、対象テーブルや結合状態が変わるようなクエリを設定したい場合は、
    RecordSourceプロパティに直接クエリ名を設定してください。

    コード例
    DoCmd.OpenForm "帳票フォーム", , , , , acHidden
    Forms!帳票フォーム.RecordSouce = "クエリ名"
    Forms!帳票フォーム.Visible = True

    • 編集済み hatena19 2012年8月31日 10:35
    • 回答としてマーク Tolbie 2012年8月31日 14:10
    2012年8月31日 10:14
  • ご教授ありがとうございます。

    完全に間違って理解していたようです。

    「昔やったはず」という思い込みで、ハマっておりました。

    この度は、回答ありがとうございました。

    2012年8月31日 14:10