<HOME  <お願い事項   <Access2002 TOP   <Access2000 TOP   <サイト内検索
 Access97 VBAの森>縦のものを横に



(2)

では、例によってほとんど意味のない例題をもとに、とうとつにプロシージャを作ってみましょう。

今回は、「縦のものを横にする」ためのプロシージャを考えてみようと思います。すなわち、

↑こういうテーブルから

↑こういうテーブルを作っちゃうプロシージャです。うひー。けっこう大変そう。

あんまりこういう処理は作らないと思いますけど・・・とりあえず今日は練習なので、犬にかまれたと思って挑戦してみてください。

前に振れましたけど、VBAはプログラムで、自分自身には抽出したデータを表示したり書き出したりする能力はありませんから(あたりまえですが)、こういうテーブルをあらかじめ用意しておいて、ここにデータを書き出す仕組みをVBAで作ることになります。まずはその辺の流れをイメージしてみてください。


 1.データ書き出し先のテーブルを作ります。

じゃあ、例によってだらだらとはじめましょう。れっつごー。

まず、上記のようなテーブルをそれぞれ用意します。上の「売上テーブル」には、20件くらいデータ入力しておきましょう。
まあ、練習ですから、どんなデータでもよいです。こういう時はちょっぴり遊んじゃってください。

で、下の方の「売上テーブル」は、空っぽで結構です。データシートビューを見てお分かりと思いますが、右によってるのが数値フィールド、左によってるのがテキスト型フィールドです。スラッシュで区切ってあって右によってるのは日付時刻型。これはオッケーですよね。

VBAを使うってことは、こういうデータ型もいちいち気にしてやらないといけないんで、こういうのちらっと見るのもクセ付けちゃいましょう。

あ、テーブル名とかフィールド名はなんでもいいですが、付けた名前はしばらくの間記憶しておいてくださいね。

・・・練習ですからね。ほんとに適当にやりましょう。


 2.処理の流れを確認しておきますかね。

テーブルの用意ができたら、「売上テーブル」の内容を読み取って、「売上集計」の方に書き出す、という流れをしっかりと頭の中に描いておいてください。

やることを書き出してみると、

1)「売上テーブル」の1件目のレコードを見る。
2)「売上テーブル」の[売上日]から、売上月を判断する。
3)1月なら「売上集計」の[1月]のフィールドに足し算する。
2)2月なら「売上集計」の[2月]のフィールドに足し算する。
2)3月なら「売上集計」の[3月]のフィールドに足し算する。
2)4月なら「売上集計」の[4月]のフィールドに足し算する。
2)5月なら「売上集計」の[5月]のフィールドに足し算する。
2)6月なら「売上集計」の[6月]のフィールドに足し算する。
2)7月なら「売上集計」の[7月]のフィールドに足し算する。
2)8月なら「売上集計」の[8月]のフィールドに足し算する。
2)9月なら「売上集計」の[9月]のフィールドに足し算する。
2)10月なら「売上集計」の[10月]のフィールドに足し算する。
2)11月なら「売上集計」の[11月]のフィールドに足し算する。
2)12月なら「売上集計」の[12月]のフィールドに足し算する。
4)「売上テーブル」の2件目のレコードを見る。
5)「売上テーブル」の[売上日]から、売上月を判断する。
6)1月なら「売上集計」の[1月]のフィールドに足し算する。
2)2月なら「売上集計」の[2月]のフィールドに足し算する。
2)3月なら「売上集計」の[3月]のフィールドに足し算する。
2)4月なら「売上集計」の[4月]のフィールドに足し算する。
2)5月なら「売上集計」の[5月]のフィールドに足し算する。
2)6月なら「売上集計」の[6月]のフィールドに足し算する。
2)7月なら「売上集計」の[7月]のフィールドに足し算する。
2)8月なら「売上集計」の[8月]のフィールドに足し算する。
2)9月なら「売上集計」の[9月]のフィールドに足し算する。
2)10月なら「売上集計」の[10月]のフィールドに足し算する。
2)11月なら「売上集計」の[11月]のフィールドに足し算する。
2)12月なら「売上集計」の[12月]のフィールドに足し算する。
7)「売上テーブル」の3件目のレコードを見る。


という感じでしょうか。げろげろーいっつくれいじー!やってられるかー!

ちこっと画面では色の識別がしにくくなっちゃってますが、青い字で書いた処理と、緑の字で書いた処理と、赤っぽい字で書いた処理と分けてみました。
どれも、VBAの中ではよく使う手法を用いて作る処理なんで、後々いろいろ応用が利くと思います。

まず青い時。1)の処理ですね。これは、レコードの1件目、2件目、3件目・・・と、「売上テーブル」の中の最後のレコードまで、順々に一回ずつ処理してほしいわけです。

しかーし。VBAで書いたプロシージャに、そんなことはワカリマセン。
ふつう、テーブルの中のデータを読みに行くとき、特に指示がない場合は必ず1レコード目に移動して処理をはじめます。
そこまではいいんですけど、処理が終わったら次のレコードに移動・・・は、指示をしないとしてくれないんですね。

「次のレコードに移動しろ」という命令を書いておいてやらないと、いつまでたっても1レコード目でうだうだしています。
こういうのも、クエリーを使っているときなんかは気にしなくていいことなんですけどねぇ。

つまり、VBAでテーブルの中のレコードを上から1件ずつ、最後まで読み取って処理するためには、

1)テーブルの最後のレコードまで、以下の処理を繰り返せ
2)これこれこういう処理をしろ
3)次のレコードに移動しろ
4)1)に戻れ

という具合に、ちくいち行動パターンを書いておいてやらないといけないんですね。1)がなかったり、3)や4)が抜けてたりすると、いわゆる「永久ループ」というものに陥り、本当に、本当にずーっと1レコード目にとどまったまま、2)を繰り返します。気づけよーって思いたくなりますが、ほんとうにやっちゃいます。

そうなるとどうしようもないので、強制的にプロシージャを止めないと([Ctrl]+[Pause]かな?Breakキーっていうやつですね多分)なりません。
いわゆる失敗です。

VBAは、この繰り返し処理の作り込み方次第ってところもありますから、これには早いとこ慣れてしまった方がいいかもしれないですね。


そして次に、2)の処理。売上月を判断するための操作です。

これは・・・そうですねぇ。
要するに、コンピュータの中としては、99/03/25となっていると、日付まで入っているので、これ=3月とは、なかなかならないわけですね。

このまま[売上日]だけ見てグループ化しようとしたら、月ごとじゃなくて日ごとのグループ化になっちゃいますよね。ほんとにコンピュータって馬鹿ですよねぇ。

そこで、何とかして[売上日]から月の部分だけ取り出さないとなりません。これにはAccessにあらかじめ用意されている関数の力を借りるとしましょう。

Datepart関数というやつがあります。詳しくはオンラインヘルプを参照あれ。

DatePart("m",[売上げテーブル]![売上月])

と、こんな感じの書き方になりますね。赤い字になってるところは、実際にはもっと具体的な書き方になります。


それから次に3)のとこの、エライ処理です。

If then else...っていう構文、ご存知ですか?英語の構文そのままで、もし...だったら...して、そうじゃなかったら...する。っていうやつです。

2択のときは、これを使いますが、今回は12択ですよね。。12回もいふいふいふいふやってられないし、なんか間違えそう・・。

と、いうときに使う条件分岐の構文が、Select Case

書き方としては

Select Case 毛の色
  Case 茶
  毛が茶色いときの処理を書く
  Case 黒
  毛が黒いときの処理を書く
  Case ぶち
  毛がぶちのときの処理を書く
  ・
  ・
End Select

こんな感じかな。いろいろ使えますよ。これも。


さて、VBAを作るとき、やっぱり新しい単語とか、関数とかいろいろ使わなくちゃなりません。
そんなに種類はありませんけど、ケースバイケースで注意点などありますので、オンラインヘルプを必ず参照するようにしましょう。

わたしは、あんまりソフトの評価とかしたくないんですけど・・・読みにくいですよ。ヘルプって。特にAccessのは、日本語になってない。わかりにくい、非現実的なサンプル(あたしゃ人のこと言えないけど)こんなの読んでちゃんと理解できる人って、いないと思います(はっ、言い過ぎたかな・・・反省)。

でもこれを読まなくちゃいけないんです。VBAを使う方は、絶対これを拒絶してはいけません。絶対だめ。なあに、同じ文章を200回くらい声出して繰り返し読んでいれば、なんとなくわかるようになりますって。

(もうちょっとわかりやすい文章で書いてあるといいのに・・・でも、まあいろいろあるんだろうな)




3.じゃ、作ってみましょう。

では、新しいプロシージャを作り始めます。

既に存在するモジュールをデザイン画面で開いて、新規にプロシージャを作り始めてもよいし(左上のツールボタンですよね)、新しいモジュールを作ってもよいです。まあ、今日は練習ですので。

わたしは、既にあるモジュールの中に、新しいプロシージャを作ったんで、こんな感じの画面になりました。

下の方ね。例によってBBBというやる気があるんだかないんだかわからん名前を付けました。
上のは、前に作ったあやのこうじシステムです。

んで、なんでもいいんで、とりあえず必要なテーブル名を変数として宣言しておきましょう。
わたしはdb、d1、d2と付けました。テーブル名、間違えないように・・・。