<HOME  <お願い事項  <Access2000 TOP   <Access97 TOP   <サイト内検索
  Ac2002--VBAの沼 > クエリでプロシージャ使う
  



クエリでプロシージャ使う

「Access2002チョ〜入門部屋」とのコラボレーションでお届けするコーナーです。
実は、あちらのコーナーで、新春にふさわしく「百人一首」を楽しむデータベースを作ってるんですよ。ええ。もちろん、何の役にも立ちません。
いい加減にしろって感じです。

いちおう、かるた取りなので、上の句の読み札をランダムにしないと、面白くないじゃないですか。
そこで、「ランダムに数字を発生させるための関数」を作っちゃおうというわけです。
実は関数そのものはしごく簡単です。
乱数を発生させる関数にRnd関数っていうのがあるので、それを使うだけです。
使い方もヘルプに載ってるので、ここまでの「VBAの沼」の内容を理解していただいてれば、特別お話しすることもないんです。

今日のテーマは、作った関数をクエリで使う場合のお話です。



んでは、モジュールを新規に作成しましょう。

VBEのウィンドウが開いてきたら、左上のツールボタンのリストボタンをクリックして、一覧から「プロシージャ」をクリックします。

プロシージャ名は Uenoku にしましょうかね。半角英数字のみですよ。
で、種類を Functionプロシージャにして、OKボタンをクリックします。

関数の内容としては、これだけです。

Rndというのが、乱数を発生させる関数なので、Uenokuというプロシージャ名に乱数の結果を代入するだけ。
Rndは、特に何も指定しないと、1から0の間で、乱数を発生させます。
それじゃ1と0の2つの数字しか出てこないんじゃないの?って思います???
それは読みが甘いですぜ旦那。0と1の間には、小宇宙があるんです。

とにかく、やってみましょう。
ウィンドウの左上の「上書き保存」ボタンをクリックして、このモジュールに適当な名前を付けておきましょう。
Module1のままでいいですよ。



で、次に、クエリの作成です。

例えば、こんなふうに、↑とあるテーブルを基にしてとあるクエリを作ったとします。
3つフィールドを選んで、4つ目の空いているグリッドに、さっきのプロシージャ名を↓入力するわけです。

このテーブルには100件のレコードが入っているので、このクエリを開いたとき(データシートビューなどで表示した場合)に、uenokuプロシージャが100回実行されることになります。



ちょっと実験・・・。
データシートビューに切り替えてみましょう。

と、どうでしょう。やけくそにランダムな数字が、各行に表示されてると思います。
何回か、デザインビューとデータシートビューを行ったり来たりしてみてください。
その都度、数字が変わっていることがお分かりいただけると思います。

この列を直接表示したりするわけではないので、こんな妙な値でも問題ナシなのです。
要は、ランダムにレコードを並べ替えるための「何か」がほしいだけなので。

なので、並び順は降順でも昇順でもどっちでもいいかなぁと思います。
この列に対して、何らかの並び順を指定して↓おけば、

レコードの順番を、クエリを開くたびに毎回変えることが、できそうですよね。

んでは、このクエリに名前を付けて保存しておきましょう。
[Q_上の句用]とでもしておきましょうかね。

さてさて、これで、必要な作業は完了しました。
百人一首を作っている途中の方は、「Access2002チョ〜入門部屋」の「百人一首」コーナーへ戻るといたしましょう。Go!!!

【補足】
上記のコードについて、ご指摘がありましたので少々補足をさせていただきます。
以下の↓クエリでの関数使用の例をご覧いただければと思いますが、本来、クエリで関数を毎行実行させて毎行違う答えを得る場合、必ず何かしら「毎行関数を動かさなければならないんだよ」ということを示さなければなりません。
上記の書き方ですと、Rnd関数は引数を指定しなくてもよい関数なので(任意の引数を指定することはありますが)、このままクエリで動かすと、1レコード目を開くとき1回だけUenokuを実行し、あとはずっと1レコード目で得た答えを引き継いでしまいます。

もし、上記のようなクエリ結果にならずに、全部同じ乱数が出てしまった場合は、Uenokuとクエリのグリッドの式の書き方を、以下のようにしてください。

  Uenokuプロシージャ

  クエリ

上のようにしなくても、乱数が毎レコード違う答えを出している場合は、そのままで問題なく遊んでいただけると思います。

何かしらの答えを出すように作ったFunctionプロシージャは、こうやってクエリで使うこともできるんですね。
今回は単に、各行でRnd関数で出した答えがそれぞれ表示されるようなプロシージャを作ったわけなんですが、

例えば、こういうプロシージャを↑作ったとします。
今まで特に気にしなかった、プロシージャ名のあとに続くカッコの中に、AAAという変数を指定しておきます。
型を決めてないので、この場合はVariant型になりますね。

で、プロシージャの内容としては、AAAという変数に100を足した答えが、Testdaというプロシージャの答えである、という、簡単な例でお話いたします。こんな簡単な処理をわざわざプロシージャで書くことはないので、まあ、ほんの例として見ておいてください。




で、このAAAという変数の行方なんですが・・・。
例えば、何かの金額が入力されてるテーブルがあったとして、そのテーブルを基にクエリを作ったとします。

[金額]というフィールドに、数値または通貨型のデータが入ってるわけなんですが、下のようにTestdaというプロシージャのカッコの中に、[金額]というフィールド名を入力します。(正しいフィールド名なら、あとで自動的にカギカッコがつくと思います)

つまり、この場合に限っては、[金額]というフィールドの値が、変数AAAに入るわけなんですね。
こういう、カッコの中身のことを、引数と呼びます。testdaというプロシージャを実行するのに必ず必要な値とかのことですね。
このtestdaというプロシージャは、指定された値に100を足すという仕事をするプロシージャなので、なんかしら値を指定しなくてはなりません。それを、こうやって引数という形で指定してるわけですね。

計算式で出した答えには、データ型というものがないので、数値だか文字だかわからない状態の表示になってしまいますけれども、とりあえず、答えは出てますね。まあ、こんな感じです。

ではでは、「Access2002チョ〜入門部屋」の「百人一首」コーナーへ戻られる方はコチラからジャンプをしてください。
「VBAの沼」のトップへ戻る方は、下の「モドル」をクリックして戻ってくださいね。