<HOME  <お願い事項   <Access2002 TOP   <Access97 TOP   <サイト内検索
 MS-Access2000--昨日の2倍の宝石をください
   1 2 3 4



で・・・本題なんですが、こうした計算をするのには、Excelのような表計算ソフトは非常に適していますね。
どういうところがポイントかというと、「前の日にもらった数」を容易に見渡せるというところです。

データベースのテーブルというものは、1レコード1レコード「独立したデータ」として扱われます。
といってもバラバラになってるわけではなくて、くっついて表みたいな感じで開いて出てきますけど、決して「1枚の表」ではない。「前のレコードの値を2倍した値」とか、そういう変動的な考え方はしないもんです。

この辺は、用途に合わせて、Excelみたいなソフトと、データベースというものをうまく使い分けていく必要があるんじゃないかと思うんです。
ExcelよりAccessの方が高度なことができるとかいうわけでもないし、Accessは使いにくくてExcelのが使いやすいというのもちょっとちがう。このふたつを比べるのは、ショベルカーと原チャリを比べてるみたいな感じで、ハタケは全然違うし便利さ加減も違うんですけど、どっちも人が腰掛けて操縦して前に進むもの、ってわけで。買い物に行くのか穴を掘るのかによって、どっちが便利なのか決めらんないですよね。

今回のように、「もしこんな感じだったとしたら、30日目にいくつになる?」みたいな感じで、全体を見渡しながら数字や文字を当てはめていくような、分析/シュミレーションっぽいお仕事の場合は、Excelってほんとにほんとに便利です。かゆいところに手の届く機能がいっぱい用意されてます。

でも、これがもし、「毎日王様からいくつか宝石をいただくので、数を毎日書きとめておいて、毎月集計する。毎月いつ頃が一番たくさんもらえるのかとかいつ頃が一番けち臭いかとか、底値表を作る」なんていう場合は・・・要するにもらった宝石の履歴を残しつつ集計したりする場合は・・・こりゃExcelよりAccessの方が活躍できるかもしれません。とにかくデータを溜め、そのデータをあとで集計したり検索したりしていろいろな形で活用していこう、という場合に、Accessは力を発揮するのです。


では・・・今回のこうしたケース、Excelで計算したみたいに、「○日にはいくつの宝石を手にすることができるのか」みたいなのを、Accessでもやってみましょうか。

「ひとつ前のレコードのデータを2倍にして・・・」といったロジックを実現させるのに一番適したオブジェクトはレポートかもしれないですね。
前に「シマシマもようのレポート」ってやりましたよね。あと、「ページ合計」を出したり・・・考え方はあれと同じような感じです。

まずは・・・テーブルを1個用意しましょう。
テーブルなしで、レポート内で31行分から回ししてもいいんですが、これってすごく難しいんですよ。できないことはないんですが・・・。
表形式のレポート作るときはできれば、レコードソースとなるテーブルがあったほうがよいでしょう。

といっても、[何日目]っていう名前の、数値型のフィールドが1つあるだけなんですけどね。
でもって、31日分、入力しておきましょう。31レコード入力しておくわけですね。

テーブルの名前はなんでもいいです。[テーブル1]でいいや。1は、半角の数字ですね。


で、このテーブルをもとにした表形式のレポートを作っちゃいます。

まあほんとに適当で・・・。ウィザード使わなくてもテキストボックスとラベルを6つ配置すればできちゃいますから、簡単に作っちゃってください。
いちおうわたしは、画面出見やすいように色を分けてみましたが、みなさんは別に変える必要ないですよ。

青いのが「ラベル」です。
詳細セクションに並べた赤、緑、紫のがテキストボックス。赤いのはコントロールソースに[何日目]という、[テーブル1]のフィールドをあてがってます。
あとのふたつは非連結です。わたしのは、緑のがテキスト0、紫のがテキスト2 という名前になってます。

では・・・このレポートの「開くとき」のイベントを作りましょう。レポートのプロパティを出して、開くときのイベントをコードビルダで作ります。
と・・・この辺の操作方法でもたついちゃう人は・・・いませんよね。大丈夫ですね?コード書けるようになるのは2の次ですよ。「開くときのイベント」と言われて「え?なにそれ?」とならないよう・・・まずはイベントの概念に慣れちゃってくださいね。

このレポートでは、「開くとき」と「詳細セクションの印刷時」の2箇所でイベントを起こします。要するにコードを書くってことなんですが、共通して利用したい変数があるんで、一番上のところに宣言しておきます。
「今日もらう数」が入る変数と、「今までもらった数の合計」が入る変数です。

で、このふたつの変数を、レポートを開くときのイベントで「初期化」しておきます。今回の場合は一番最初にもらうのは1個なので、両方に1を入れておくとよいでしょう。


一旦レポートの方に戻って・・・詳細セクションのプロパティを出し、「印刷時」のイベントを作ります。

まずテキストボックスに変数の値を代入します。

でもって、次の行を印刷するときのために、今日もらった数を2倍しておき、合計を出しておきます。

コードなんてものは上から順番に処理をこなしていくだけですんで、あんまり難しく考えず、「今この時点でkyouの中はどうなってるのか、ということを考えるようにしていってください。そうすれば、なぜテキストボックスに代入したあと掛け算足し算しているのか、その順番の意味も理解できると思います。また、「足し算掛け算してからテキストボックスに代入」という順番で各場合はどうすればいいのか・・・など、じっくり考えてみてくださいね。


これで、一旦保存して、レポートを開く(プレビュー)してみると・・・

それっぽい結果が出てきますか?

レポートは表形式のフォームと違ってスクロールするわけでもないし「紙に印刷される」ということで値が固定されますから、こんな風に「前の行の値を変数に持っておく」とかいうことができるんですね。なんで表形式のフォームじゃできないのか・・・は、もうみなさんよいですよね。
フォームの詳細セクションに「印刷時」みたいなイベントがあればよいのでしょうが、残念ながらフォームというものはスクロールしたり改ページしたりと、かなり柔軟な動きを見せます。そんな中で「ひとつ前の行の値を・・・」なんて考え方は、ちょっと無理なのかもしれないですね。


もうちょっとおしゃれをして・・・「何日目」という値を出すためのテキストボックス、ちょっと変えてみたいと思います。
こいつはカンタン。「テキストボックスの名前」を適当な名前に変更して([何日目]という、フィールド名と同じ名前のままだとダメ)

で、コントロールソースに、「何日目というフィールド、あーんど "日目"っていう文字」という式を書いてやります。
これで、テキストボックスの中には、1日目、2日目、という具合にプリントされます。


ついでに、姉さんたちの取り分も並べてみましょうか。

ええと、テキストボックスとラベルを追加しました。わたしのは、姉さんのテキストボックスがテキスト8、もうひとりの姉さんのテキストボックスがテキスト10という名前になりました。
なので・・・。

姉さんのほうは、30000個と決まってるのでこれをそのまま表示するとして、もうひとりの姉さんの方は、前日の分に500足した数が、総計ですね。
もうひとりの姉さんのもらい分を集計する変数を宣言して、500ずつ足し算するようにしましょう。


ついでに、「いつごろ、姉さんたちは三女に追い抜かれたのか」を何らかの形で表現してみましょうか。
じゃあ・・・追い抜かれたら太字にしますか。フォントを。

そのテキストボックス内のフォントサイズやフォントの種類は、書式のプロパティで設定します。
「フォント太さ」というプロパティを探してください。んで、そこクリックしてからF1キーを押して、ヘルプを確認しましょう。
VBAで書くと・・・FontWeightという書き方になり、700という値を代入することで「太字」となると書いてありますね。

じゃ、こうなるかな・・・途中にIF文を書いて、30000以上かどうかの判断をするようにしましょう。

レポートを開くと・・・こんな感じで、微妙に太字になると思います。

15日目で追い抜かれますね。

もうひとりの姉さんのテキストボックスの方もこうして比較してみましょうか。