<HOME  <お願い事項   <Access2002 TOP   <Access2000 TOP   <サイト内検索
 MS-Access97超入門>絞込みの仕組みを作る
 基本のクエリー サブフォームで 表形式のフォームで コンボボックスで 全件表示 コンボボックスが片方空っぽでも 2段階の絞り込み



■コンボボックスが片方空っぽでも

これは、クエリーの作り方ですね。難しいんですよ。これ。
私たちから見ると当たり前のように見えるんですけど、コンピュータではこういうのがなかなか・・・。


こりゃいじるところは[クエリー]だけです。
黄色い枠で囲んでる部分のフィールド、この抽出条件に「もし[フォーム]の[種類]や[ランク]が空っぽだったら、すべてのレコードを表示し、
何か値が選択されているようなら、その条件にあったレコードだけ表示するようにする」という超わがままな式を作ります。

これだけの式を抽出条件欄に入力するのは、実際には無理です。そこで、こういう式を、別のフィールドとして作ります。

クエリーの「フィールド」欄で、計算式や関数を使うことができますよね。
それを利用して、IIf関数(わたしはあいいふかんすうと読んでますが)を使った条件式を作ります。

もし、フォームの[種類]コンボボックスが無選択(Null)だったら=全件出力

それ以外だったら=>[種類]=Forms![フォーム]![種類]

と、いう条件分岐をします。

青い方は特に問題ないですよね。普段抽出条件欄を利用して2次元的に書き込んでるクエリー式を1行に書いた状態ですんで、みなさんこれはオッケーだと思います。、
この式をそのままフィールド欄に書いちゃえばいいのです。

赤い方はどうしますかね・・・。
どうやってコンボボックスが無選択であることを判断するかというと・・・。IsNull関数という関数をさらに利用しましょう。
これは、指定したテキストボックスやコンボボックス、その他の値などがNullかどうかを調べるための関数です。

で、ここからが秘伝の裏技。問題は、Nullだと分かったとき全件出力するにはどうしたらいいか???ということです。
これがねぇ。難しいんですよ。
青い方では[種類]=Forms![フォーム]![種類]こんな式作れば抽出できますけど、抽出しないって式はどうすればいいやら・・・。

そこで、Nullだったら、[種類]のフィールドの中身の代わりに、なんか別の値を表示するようにして、それを全部抽出するようにしてみましょう。
ちょっとややっこしいですけど、クエリーはフィールド欄に無理矢理500とか入力すると、ずらーっと全レコードに500って表示してくれるんですよね。
普段はこんなことしないですけども。。。

もし、フォームの[種類]コンボボックスが無選択(Null)だったら=全レコードにTrueと表示

とします。で、抽出条件欄にTrueと入れておけば、全件出力できます。

IIf(IsNull(forms![フォーム]![種類]),True,[種類]=forms![フォーム]![種類])

こういう式になります。

この式を、右の端の方の開いているグリッドに直接入力します。
ちょっと長い式なので入力しにくいですけど、Shift+F2キーでズームという機能が↓働きますので、これも活用して入力しましょう。

で、抽出条件欄にTrueと入力し、表示を「非表示状態」にします(チェックボックスをはずす)。
表示しててもいいかもしれませんが、どうせ表示されるのは−1とかわけのわかんない値なんで、フォームでは使わないし、非表示にしておいた方がいいでしょう。

[ランク]の方も同様で、

IIf(IsNull(forms![フォーム]![ランク]),True,[ランク]=forms![フォーム]![ランク])

という式を、別グリッドに作りましょう。


すると、コンボボックスの中身を選ばない状態でも、何かしらサブフォーム内にデータが表示されていると思います。
種類やランクを選択すると絞り込まれ、空っぽにすると(文字削除するとか)全件表示されるようになるわけですね。

そうすると、[種類]のコンボボックスの更新後処理イベントでも、サブフォーム内を再クエリーするようにしておいた方がいいかもしれないですね。