<HOME  <お願い事項  <Access2000 TOP   <Access97 TOP   <サイト内検索
 MS-Access2002チョ〜入門部屋>MS-Accessを使いこなすために・・
  (←別ウィンドウでサブメニュー)



10.指定した月の分だけ表示させる

では、メインフォーム内のどこかに、非連結のコンボボックスを作りましょう。
とりあえずどこでもいいですよ。開いているところに適当に作ってください。

でもって、プロパティの 値集合タイプ 値集合ソースというのを、↓下のようにしてみましょう。

  値集合タイプ  値リスト
  値集合ソース  2002/1;2002/2;2002/3(半角のセミコロンで区切って入力)

フォームビューに切り替えてコンボボックスの中身を見ると、こんな風になりますか?

コンボボックスってけっこう便利ですから、ヘルプで大まかな仕様を確認しておかれるといいと思いますよ。
(MS-Access のウインドウの右上の質問ボックスに、コンボボックスって入力してEnterすればヘルプが出てきます)

(余談ですがこれが質問のボックス↓。「Accessのコントロールの種類について」っていうところを見ると、いろいろ載ってます)

で、お話を元に戻しまして、このコンボボックスに選んだ年月の労働情報だけをフォーム内に表示するようにしてみます。
これもけっこう後で役に立つ方法じゃないかなと思うんで、是非とも挑戦してみてください。



まず、このコンボボックスの名前を確認しましょう。わたしのは、コンボ21です。21は半角の数字でした。
皆さんのはなんて名前でした?ぜったい確認してください。確認の仕方がわからない?思い出してください。
コンボボックスのプロパティ見れは確実ですよ。多分、名前は適当につくので必ずしもみなさん「コンボ21」ではないはず。
っていうか、今後のためにも、必ず「名前を確認する」クセはつけておこう。

でもって、このフォームは閉じずにフォームビューの状態でちょっと横にのけといて(フォーム、閉じないでください)、データベースウィンドウを見ましょう。
Q_労働テーブル(という名前を私はつけましたが)をデザインビューで開きます。
今、サブフォームが基にしているクエリですね。こいつの、「式1」の抽出条件をちょいと変えます。

    forms!社員フォーム!コンボ21

これはMS-Accessの中での決まった書き方なので覚えておくとよいかもしれません。
これで、「社員フォームという名前のフォームの中にあるコンボ21という名前のもの」という意味になります。
これをもうそのまま抽出条件にしてしまおうというわけです。

このクエリ、左上のツールボタンでデータシートビューに切り替えてみて、結果を確認してみてください。
今さっき作ったコンボボックスの中に今選択している月のデータだけが出てくるはずなんですけど、どうでしょう?

この時点で

こんなのが出てくる!という方はここでぶち切れないで、もう一度デザインビューに戻って抽出条件を確認してください。
それか、あんなに青い太字でお願いしたのに、フォーム、閉じちゃったんじゃないですか???
これの意味は、「Forms!社員ファーム!コンボ21ってなんですか?」っていう意味です。つまり、このクエリが、そんなものは見当たらないけれど、何なの?と聞いてきているわけです。
そう。ほぼ9割方、書き間違いつづり間違い半角全角の間違い、です。
上の例でも、ほんとうは「社員フォーム」なのに、「社員ファーム」って出てきてますよね。
抽出条件にForms!社員ファーム!コンボ21って書いちゃってるんですね。この場合は。抽出条件の間違いを直せば、これ、出なくなります。
1割くらいの割合で、単にそのフォームが閉じてる、って可能性が残ってますね。そういう名前のフォームが存在していても、開いてなかったらこういうメッセージが出ます。

実のところ、「パラメータの入力っていうのが出るんですが、これを出なくするにはどうしたらいいんですか?」っていう質問メールが、多分過去最高数です。そのたびに、「抽出条件書き間違えてないですか?」って返信しなきゃならないんですが、「絶対間違ってません」って怒りの返信が返ってきたり、この部分の説明はほんとに気が重いことが多いんです。。。
でも、この「パラメータの入力」っていうやつ自体、クエリの抽出条件に書いてあるものがなんだかわからないときに出るのだから・・・。

  Forms!フォーム名!テキストボックスとかコンボボックスとかの名前

と入力するのがお約束なので、フォーム名、コンボボックス名を正確に確認/入力するクセをつけてってくださいね。
あと案外多いのが、FormsなのにFromsって入力する人。それからびっくりマークが全角の人。
どっちも間違いです。。。。

今わたしは、コンボボックスに「2002/1」を選んでるので、クエリの結果は2002年1月のデータだけが出てます。

じゃあ、「2002/2」にすれば、クエリの内容も変わるんだよな・・・。
あれ?
変動なし・・・なんで???

これはですねぇ。
この、クエリの結果を表示する「データシートビュー」ってやつなんですけども、基本的に「開くときの抽出条件」が基になってるわけなんです。だから、今みたいに、開いた後、抽出条件であるコンボボックスの中身が変わったとしても、このままじゃ反映されないわけなんです。

一度、左上の青い三角定規ボタンでデザインビューに戻って、すぐデータシートビューに切り替えてみてください。

要は、もう一度クエリを開きなおしたって感じですね。
こうすれば、コンボボックスの内容を反映した状態になると思います。

これ、とっても重要なことなので、心に留めておいてください。
このことを踏まえたうえで、仕上げです。

Q_労働テーブルは、保存して閉じましょう。



フォームも、さっきお話したデータシートビューと同じで、開くときの抽出条件を基準にしてます。
したがって、ここで今、コンボボックスから他の月を選んでも、たとえ何億回選んでも、サブフォームの中の労働データは「今月の分」です。変わりません。
変えるためには、フォームを一度閉じてもう一度開く必要がありますが、いちいちそんなことをやるくらいならこんな仕組み作らないほうがいいですよね。

そこで、こういうときに用いる方法でもっともポピュラーなのが、「再クエリ」(Requery)という動作なのです。
これ、前にも出てきましたよね。ご記憶ですか???
で、どうするんでしたっけ・・・。
と、いうのは、別に覚えてなくてもけっこうですよ。ただ、「再クエリ」って、検索フォームなどを作るとき付きまとう言葉なので、ただ丸覚えするのではなく、どうして必要なのか、ってところを押さえておいたほうが、きっと応用も利くと思うんですよ。



具体的な方法としては、「再クエリ」というアクションを実行するマクロを作っても同じことなんですが、今回は「サブフォーム部分を再クエリ」させようと思うんで、多分、コードを書いたほうが簡単だと思います。マクロのほうが難しいです。

ではやってみましょう。フォームをデザインビューに切り替えます。
コンボボックスのプロパティの「イベント」というところを見てください。

「更新後処理」というのを使いましょう。
「コンボボックスの内容が更新された後」起こることを、ちょこちょこっと指示するのです。

クリックすると、右側にボタンが二つ出ますよね。
一番右端のビルドボタンをクリックしましょう。

でもって、「コードビルダ」です。
コードは、こんな感じで書きます。

これで、「わたしの中のサブフォーム部分を再クエリしなさい」っていう意味になります。
Meっていうのはこの場合は、「社員フォーム」のことです。
「社員フォームの中にある労働サブフォームという名前のものを再クエリしなさい」という意味ですね。



もし、どうしてもコードを書くのはいやだ、マクロを使いたい、という場合は、マクロビルダを使って「再クエリ」というアクションだけのマクロを作ってください。再クエリするコントロール名は空欄でいいでしょう。
空欄だと、「社員フォーム(メインフォームの方)」を再クエリすることになるのですが、今回はこれできちんと機能すると思います。でも、たった1行だけの処理のために、マクロを一個作るのもなんだかややこしくなるような気がするので・・・こういう処理の場合は、コードを書くほうが、お勧めだと思います。
んでは、フォームビューに切り替えて、コンボボックスから他の月を選んでみてください。
いかがでしょう。サブフォームの中身、変わりますか?



さらにもう一工夫・・・。
コンボボックスの中身、これも常に「今月」を指し示すようにしておくってのは、どうでしょう。
そしたらですねえ。
コンボボックスのプロパティをもう一度見ましょう。「データ」っていうところを見てみてください。

「既定値」っていうプロパティがあります。
フォームを開いたときに、デフォルトで表示させておきたい値を指定しておくプロパティです。
ここに、クエリの抽出条件と同じように、Format関数とDate関数を使った式を入れとけば・・・。

   Format(Date(),"yyyy/m")

これで、どうでしょう。
パソコンの時計が狂ってなければ、コンボボックスの既定値は「今月」になってくれるはずです。



ふい〜。
いっぱい工夫するところがありますでしょう。
また、逆に、いろいろ作りこんでいくうちに「こういうふうにできないかな」とか「こうしたいんだけど」とか、ちょこちょこと要望が具体的になってきますよね。もちろん、根本的に無理なこともたくさんあるでしょうが、工夫次第でどうにかなるもんです。しかし、悲しいかな工夫しなければ何もできませんのです。