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



で、AAAAAに2001/1/1を代入して(日付時刻型なので#で囲むの忘れないように。じゃないと割り算の式になっちゃうよ)、ループをスタートさせます。ループを抜ける条件は、「AAAAAが2001/1/31になるまで」です。
とりあえず[稼働日]のフィールドだけ書き込んでいくとしましょうか。フィールドひとつだけなら、AddNewの右側に「どのフィールドに、なんという値を」追加するかということを書いてやればオッケー。[稼働日]フィールドのデータ型が日付時刻型で、AAAAAの型もDate型で、AAAAAに代入される値が#y/m/d#であれば、問題はないはずです。データ型をちゃんとそろえるっていうことは、VBAでは不可欠です。次回、変数やデータ型についてはなんかテーマを持とうかなと思ってますが、データ型、意識して作ってみてください。

できました?
んじゃ、コンパイルして、イミディエイトウィンドウでテストしてみましょう。

Subプロシージャですので、プロシージャ名だけ入力してEnterキーを押します。
多分、あっという間に処理は終わると思います。カーソルがぴかぴか明滅してれば、処理は終わってますので、テーブルを開いて見てみましょう。

レコードはできてますが・・・。あれ・・・なんか、1月30日までしかないぞ???

Untilで、「1月31日になるまで」っていう書き方をしているので、こうなりますね。30回目のループのとき、AAAAAには1月30日が入ってます。これに1足して、1月31日になりました。Loop文からDoへ移動して、「AAAAAは1月31日?」と聞かれて、そうなので、はい、と答えると、そこでループを抜けることになりますよね。だから、1月30日までしかテーブルにはAddNewされてないわけです。
うーん、ちょっと違うかな・・・まあ、Do Until AAAAA = #2001/2/1#ってすれば、1月31日まで取ってきてくれるとは思うんですが、できれば「1月31日までと指定したら1月31日まで」データ作ってもらった方がわかりやすいですよね。
ループ文の書き方で、AAAAA = #2001/1/31#をループの後半(AAAAAに1を足す式の後とか)に持ってくることもできるんですが、今のままで考えるとすると・・・・・。

じゃあ・・・こうしようかな。あ、とりあえずこの部分は、コードの修正だけしておいて、実行はしなくてよいですよ。
ええと、「AAAAAが1月31日を超えた?」っていう質問に変えてやれば・・・

おお、1月31日までデータが作られますね。こういうのがなかなか難しいですねぇ。
テストしてみないとイメージ湧かないところもありますもんね。

ループ文のコツは、とにかく目でくるくるとシュミレーションしてみることです。
1回目のループでAAAAAに何が代入されているか、2回目のループでは何が代入されるのか・・・ということを、じっくり目で追ってみましょう。


さて、主軸となるループが完成したら、次はAddNewする処理を増やすんですが・・・。
このテーブル、[稼働日]を主キーにしています。なので、同じ日にちを2回使うことはできません。繰り返しテストするときとかもそうですけど、2回このプロシージャを動かすということは、1月1日からの稼働日を、もう1回書き込むことになりますよね。これじゃキーがダブっちゃいます。っていうか、このテーブルの意味なくなっちゃう。
そこで・・・。毎回、心機一転新しいレコードを作成する、という気持ちをこめて、最初に全レコード削除しようと思います。

まず、↑こういう処理を書いてから・・・。

この↑ループに入ろうと思います。フィールドも、稼働日のほかにもうひとつ、[曜日]も出すとしましょうか。AddNewの書き方変えてますんで、注意してください。複数のテーブルのときは、「あれと、これと、それ」という具合に複数書いておいて、一気にUpdateします。
こうすれば、毎回テーブルの中身を全件削除してからデータを書き出しますので、ダブらないですね。

もちろん、AddNew(レコードの追加)でなければ、「すでに入力されている稼働日であれば、分類と曜日だけ更新して、まだ入力されていない稼働日については新規に追加」とか、そういう処理も可能ですよ。でもそれはちょっとこのループとは別のやり方になりそうですね。とりあえず今日は、このループを徹底的に極めちゃいましょう。


さて・・・。3つめのフィールド、「分類」の部分を作っていきましょう。
ココの部分は、ほんとは「手入力」しなくちゃならない部分なんですよね。
会社によって、学校によって、国によって・・・1月31日は水曜日ってのは世界共通ですけど、この日が休みか休みじゃないか、出勤したら給料がちょっとよいのか、何か特別な雛のかどうか・・・は、それぞれ異なりますよね。
でも・・・1年365日、全部の日がバラバラってことはないでしょう。360日くらいは世界共通の標準的な扱いで、5日間くらい、特別な休暇があったりする・・・って場合、手入力する部分の方が圧倒的に少ない場合は、ある程度自動的に値を入力してもらっといた方が楽ですよね。

そこで・・・。んー、今日は練習ですんでまあ気楽に考えていただくとして、「土曜日と日曜日とそれ以外の日」という3パターンにしましょうか。

Select case文を使って、BBBBBという変数に1桁の数字を代入するようにします。
で、分類フィールドにAddNewしてやるわけです。
AddNewの下に、分類フィールドにBBBBBを代入する処理を付け加えてやってください。
変数については、また後で機会を持ちたいと思いますけども、どういうときにBBBBBの中身が何になっているか、その辺見ておいてくださいね。

この処理を実行すると、

これで、3つのフィールドがすべて埋まるような、この処理のホネ組みの部分が完成しました。
あとは・・・。
今、「1月31日までの分」って指定してますよね。
つまり、ループの回数が決まってるわけです。
ループの回数を色々変化させることによって、1年分のデータを作ることもできますし、指定した範囲のデータだけ作ることもできます。
次はループの条件について考えてみましょう。