<HOME  <お願い事項   <Access2002 TOP   <Access97 TOP   <サイト内検索
 MS-Access2000超入門部屋--絞込みの仕組み(初級)
 [まずは基本となるフォーム作り]   [クエリーを使う場合1] [2]   [フィルタを活用する場合]   [コンボボックスに変更] 



■フィルタを活用する

まず、フィルタとはなんでしょう???
いろんなところに存在するんですけど・・・今回利用するのは、フォームの中の「フィルタプロパティ」というやつです。

そのプロパティはここにあります。
フォーム全体のプロパティは、左の上のほうの、赤いしるしつけたところをクリックすると出てきましたよね。
んで、データプロパティの中を見てみてください。

フィルタ、というプロパティがあると思います。

とりあえず内容を確認しておきましょう。「フィルタ」の床をクリックしてカーソルを出してから、F1キーを押してください。

ちょっと時間がかかることもありますが・・・Accessのヘルプ画面が出てきます。とにかくささっと目を通してみてください。

わけわかんないですか???
ははは。

まあ、そう言わないで・・・・。途中に、

Me.Filter = "都道府県='東京'"

Me.FilterOn = True

って書いてあるとこがあるでしょ?
これをね、やろうかなって思ってるんです。


文章をよく読むと、「設定値は文字列で、WHERE句からWHEREを省いたものです」ってありますよね。
WHERE句というのは、SQLの構文のひとつです。SQLっていうのは、データベースのための言語のことで、つまり、SQL文の文法に従ってくださいってことみたいですね。SQL詳しい方は、あ、なるほどね、ってことで、ココから先の解説は必要ないと思いますが、なんじゃそりゃーという人は、ちょっとだけ練習してみましょう。

んじゃあ、上の例に従って、今回の検索の場合を考えてみましょう。まず、グループで絞込みをするんですカラ、TOKIOの人だけに絞り込みたいときは

グループ = TOKIO

でオッケーのはずなんです。
ああ、でもひとつだけ・・・「グループ」ってテキスト型のフィールドですよね。
こういうとき、該当するフィールドがテキスト型か数値型かで、ひとつだけ考慮してあげないといけないことがあるんです。
数値の場合は、右辺の値は剥き出しのままでいいんですけど、テキストの場合はシングルコーテーションで囲まないとなりません。これは、いちおう一般的な式の書き方のルールなんです。シングルコーテーションが必要ない場合もありますが・・・たいがいは必要なので・・・。

グループ = 'TOKIO'

これで、TOKIOとはテキスト型で、「グループ」というフィールドの値とつりあう、ってことになります。これ書き忘れると「グループのフィールドとTOKIOのデータの型が一致しませんわ」とかワケのわかんないこと抜かし始めますので、こういうのはきっちりオトシマエつけてやりましょう。

でもって、上の文章をもう一度よく読むと、「設定値は文字列で」とありますよね。つまり、この式を、剥き出しの式の状態ではなくて、そのままそっくり文字として届けてもらいたい、ってことなんですよ。剥き出しのままだと、そのまま計Zされちゃったりするんでね。

"グループ = 'TOKIO'"

で、オッケー。これをそのままそっくり、フォームのフィルタプロパティにぶち込んでやればよいのです。
フォームの中のコードとして書き込む場合は

Me.Filter = "グループ = 'TOKIO'"

こうなります。ね。ちゃんとシングルコーテーションのつき方、ダブルコーテーションのつき方にも、規則性があるでしょ?これ、理解しておくと何かと便利ですよ。
じゃ、ここまでのとこ、ちょっと挑戦してみましょうか。まだ中途半端ですけど、雰囲気だけでも・・・。


どうするかというと、「へのへのもへじ」テキストボックスの「更新後処理」のところで、フィルタに式を代入するイベントを起こします。
左の図のようにプロパティを出して、右端のビルドボタン(赤いしるしつけてるちっちゃいボタン)をクリックしましょう。

で、コードビルダを使いましょう。
マクロでもできないことはないでしょうが、多分めんどいしわかりにくいです。コードで書いたほうが絶対わかりやすいと思いますよ。
細かく書きますので、今回はコードビルダを使ってみてください。

なんか・・・こんな画面出てきましたよね。

いわゆる「Visual Basic の Editor」です。Accessとは別のウィンドウとして出てきてますよね。
その中に、左のようなウィンドウがあると思います。
カーソルがぴかぴかしてるとこに、フィルタに式を代入するコードを書きます。

me.まで入力すると(ドットまで)、なんかつらつらと一覧が出てきます。

これね、このフォームのプロパティ名の一覧なんですよ。エーゴですけど。
だからこの中のどこかに、Filterってのがあるはずなんで、選べばいいんですが、プロパティっつってもたくさんあるんでいちいち探すより入力した方が早いかも。

me.filter です。

で、こんな感じ。

上のほうで解説した式をそのまま書き込んでください。
2行目の FilterOnっていうのは、フィルタを有効にするかどうか、っていうプロパティで、Trueってのは「はい」っていう意味です。
これはだいたいセットでいつも書きますから、こういうもんだと思っちゃってよいと思います。
大文字小文字は、自動的に変わりますけど、「グループ」というフィールド名以外は全部半角ですので、全角で入力しないよう注意してくださいね。


んじゃここまででとりあえずテストを・・・。
Visual Basic Editorの方だけウィンドウを閉じて、フォームのデザインビューに戻りましょう。
Accessまで閉じちゃダメですよ。

で、フォームをいちおう保存して・・(左上のフロッピーディスクの絵のツールボタンですよ)
フォームビューに切り替えます(一番左上のツールボタンですよ)

TOKIOと入力して、Enterキーを押します。

なんでEnterキーを押さないかんのか、というのはみなさんだいたいお分かりですよね。
まだカーソルがテキストボックスの中にあるうちは、TOKIOなのかTOKIOKAなのか、Accessにはわからんのです。あたりまえですよね。
「これで入力完了!」という合図がEnterキーになります。このタイミングで「更新後」とみなされるので、あまり疑問に思わずEnterキーを押してください。

どや♪

つっても、まだこれじゃ未完成です。だって、今の状態じゃ、V6やSMAPは出ないですよね。
ダイレクトに'TOKIO'じゃなくて、ちゃんと、フォームの中のテキストボックスの中身を指定しないと・・・。


さて、さっきの式ですが、

Me.Filter = "グループ = 'TOKIO'"

赤い文字のトコを Me![へのへのもへじ]にすればよいんですよね。

Me.Filter = "グループ = 'Me![へのへのもへじ]'"

で、どうなるかというと・・・。察しのよい方はあれ?と思ってらっしゃるかも・・・。
そう。このままだと、テキストボックスの中身ではなく、「Me![へのへのもへじ]」という文字列を探してしまいます。コンピュータってほんとばかですねー。いくら探したってそんなグループの人、いるわけないじゃないですか。ねえ。

Me![へのへのもへじ]というのが、値そのものではなくてフォームの中のテキストボックスの中身のことを明示しているのだ、ということを、なんとかAccessに伝えないとなりません。そのためには、Me![へのへのもへじ]の部分だけ、ョの外にうまいこと出さないと・・・。
なので、出したいところだけダブルコーテーションの外に出します。

Me.Filter = "グループ = '" Me![へのへのもへじ] "'"

ここんとこがちょっとばかり技術のいるとこかもしんないですね。でも、よく見ると、ちゃんとMe![へのへのもへじ]だけ外に出てますよね。

でも、このままだと、式が3つに分断されてしまってます。なので、3つをそれぞれ&でつなげます。半角の&です。

Me.Filter = "グループ = '" & Me![へのへのもへじ] & "'"

もし、「グループ」のフィールドが数値型なら、シングルコーテーションがいらないんだから

Me.Filter = "グループ = " & Me![へのへのもへじ]

と、いうことになりますね。


さあ、書き換えてみましょうか。

この画面をもう一回出すには・・・。

 フォームをデザインビューに切り替えて(左上の青い三角定規ボタン)
 「へのへのもへじ」テキストボックスのプロパティを出して
 「更新後処理」イベントプロパティのとこをクリックして
 右端のビルドボタンをクリックします。

で、ちょこちょこっと書き換えちゃってください。

でもって、改めてテストしてみてください。
今度はちゃんと、V6もSMAPも絞り込んでくると思いますよ。


んじゃあ、ついでにもう一工夫・・・。
「フィルタを解除」すればいいんですけど(へのへのもへじテキストボックスの中を右クリックすると、ショートカットメニューの中にあります)、この辺の動きも、コマンドボタンを作ってちょいとスマートな感じに仕上げてみようと思います。せっかくですからね。

じゃ、コマンドボタンを適当なトコにひとつ作ってください。あ、フォームヘッダーの中ですよ。「詳細」に作ってはなりません。
別にいいけど、ボタンは一個でいいですもんね。

わたしのボタンは「コマンド10」って名前になりました。こりゃ別に何でもいいです。

で、「クリック時のイベントを作ります。

これですね。

Me.Filter に ""(隙間をあけないでダブルコーテーションふたつ)を代入してFilterOnをTrueにしてもいいのかもしれないですが、多分FilterOnをfalse(いいえ)にするやり方でもうまく行くと思いますよ。


ボタンの標題とかは、適当に書き換えてください。「コマンドxx」のままじゃあ・・・なんかねぇ。
「名前」じゃなくて「標題」ですよ。コマンドボタンの書ョプロパティの中の「標題」。マクロとかコード書いちゃってから名前変えたりするの、よくないですからね。承知してらっしゃればいいですけど、それで「動かなくなった」とかなったら、しゃれになりませんよ。
なんで?って思った方は、「名前」っていうプロパティがどこに影響を及ぼすものなのか、じっくり見直してみてくださいね。

コマンドボタンの標題は、デザインビューの状態なら、プロパティじゃなくっても、直接コマンドボタンの中を強くクリックしたり(強くクリックする必要はないかも)すると、カーソルが出てきて書き換えることができますから、標題変えるだけならそれでもいいかもしんないですね。フォームビューの状態ではなくて、あくまでもデザインビューでのお話ですからね。
くどいようですが、「標題」を変えても「名前」は変わらないですよ。これは別もんですからね。


んじゃ、改めて総合テストです。

まず、グループ名を何か入力すれば、絞り込まれますよね。

んで、その後「コマンドボタン」をクリックすると、再び全件表示されるようになります。

いかがでしょう。


ひとくちに検索といっても、ちょいと体裁を整えようと思うといろんな仕組みを組み合わせていかないとならないですよね。でも逆に、いろんな仕組みを組み合わせることで、より使いやすくよりわかりやすい検索の仕組みを作ることができるはず。ここまで面倒なことやりたくない・・・という方もあるかもしれないですけど、わたしは、Accessを使うなら、こんな感じの検索画面、作っていってもらいたいなぁって思います。
せっかくいろんな機能があるんだし・・・。

テーブル作って、データシートビュー広げて、ツールボタンを使ってサーチしても、それでもAccessを使ってるってことにはなりますけど、でも、できれば、ほんの少し時間を割いて、一工夫していかれてはどうかな、て思うんですよ。ぜひ、みなさんのデータベースの中にもこんな感じの仕組み、取り入れてみてください。