<HOME  <お願い事項   <Access2002 TOP   <Access97 TOP   <サイト内検索
 MS-Access2000--稼働日テーブルを作る
   1 2 3



さてそれでは・・・。
まず、どんなケースが考えられますでしょうかねぇ。
「今年のデータ」というのを考えてみましょうか。

今年は2001年です。
つまり「AAAAAという変数に入ってる値の、年の部分が2001年の間」ずっとループをまわすような処理にすればよいわけですね。
Format関数っていろんなことに使えます。AAAAAをしっかりとDate型にしておけば、「年」の部分だけ取り出すこともできます。DatePart関数というのもありましたね。どちらでも何とかなると思いますよ。
"2001"の部分も、直接タイプするのではなくて「今年の」という変動的な値を持たせたいのであれば、Date関数を使って、Format(Date,"yyyy")を右辺に持ってくれば比較できると思います。まあ、来年になったら2002って書き換えればいいや、っていう感じなら、下のコードで十分だと思いますよ。

ループを抜ける条件のとこ、しっかりチェックしておいてくださいね。
Whileを使うと、どういう条件式を持っておけば必要な回数分ループしてくれるのか、まずはそこのところに慣れるべきですね。
また、Untilだったらどうなるか、Forを使うならどうなるか・・・色々考えてみて、一番しっくりくる(みなさんにとってわかりやすい)方法を使ってみてください。
でも、ループを抜ける条件がおかしいと、永久ループになっちゃいます。くれぐれも気をつけて。
あ、永久ループしちゃったらどうすればよいのか、って話、前にもしましたよね。Ctrl+Breakキーですよね。
止まることは止まりますが、決して望ましいことではありません。やっぱり最初から、きちんとループを抜けるよう、条件式を考えてから取り組みましょう。

1年分、できました?

これ応用すれば、「今月分」とかもできますよね。Format関数の引数を、yyyyじゃなくて、yyyy/mmとかにすれば、月の部分まで取ることができますよね。


2〜3年分まとめて作りたいなら、Untilの方がよさそうですね。

5年分、しっかり作ってくれます。


さて・・・ループ処理をうまく活用したテーブル作成のプロシージャ、いろいろ見てまいりましたがいかがでしょう。

じゃ。。。。最後に、日付の範囲を自由に指定できるようにしてみましょうか。
例えばフォームから、開始日と終了日を入力することで、その範囲内のデータを作成するように作ってみましょう。

まず、適当な無地フォームを作って、テキストボックスをふたつ配置します。
テキストボックスの名前が「テキストxx」のままじゃ味気ないかなぁと思ったんで、[開始日][終了日]としてみました。

で、フォームの方は、一旦閉じて・・・。
プロシージャに手を加えます。

変数を増やしました。まーなんてわかりにくいんでしょう。
みなさんは、変数名もわかりやすいものをつけるようにしてくださいね。AAAAAとかつけちゃうと、あとでわけわかんなくなりますよ。ホホホ。

で、ループに入る前に、変数AAAAAと変数CCCCCに、フォームから取ってきた値を代入します。
つまり、このプロシージャ実行時には、このフォームは開いてないといけない、ってことですね。これも、初歩的な勘違いに陥りやすい部分ですので、頭の隅に置いておいてください。

そして、Do Loopを抜ける条件として、AAAAAとCCCCCを比較します。
AAAAAがCCCCCより大きくなったら、処理は終わりです。
ループの中身は今までどおり、AAAAAに1ずつ足し算して、ループのたびに「CCCCCより大きい?」という質問に答えていけばいいわけですよね。


さて。このプロシージャ、こう作ったら、フォームが開いてないとデータを作成する範囲がプロシージャに伝わらないわけですよね。
では、このフォーム上にコマンドボタンを作って、そのボタンのクリック時のイベントでこの処理を動かすようにしましょう。

プライベートプロシージャではなく、パブリックなプロシージャならば、どこからでも呼び出すことができましたよね。
Callというステートメントを使って呼び出します。

例えば、開始日と終了日がちゃんと入力されていないうちはプロシージャを動かさないようにしたいとか、そんな場合は

こんな感じで、入力チェックをすることもできますね。
これをうまく応用すれば、開始日より終了日のが前の日付になっちゃってるとか、そういうわけのわからない入力ミス時にプロシージャを走らせないようにすることも可能だと思います。いろいろ工夫してみてください。