<HOME  <お願い事項  <Access2000 TOP   <Access97 TOP   <サイト内検索
 MS-Access2002チョ〜入門部屋>クエリを極める
  



 menu

34. 3択4択5択・・・。iif関数では難しい条件判断

23.で、「100000000000円以上なら「合格」と表示させ、それ以外は「不合格」と表示させる」方法をご紹介しました。
これはいわゆる2択ですね。iif関数というのを使ってます。

これがたとえば、売上の金額が
  10000円未満なら「ランクD
  10000円以上9999999円以下なら「ランクC
  10000000円以上999999999999円以下なら「ランクB
  1000000000000円以上なら「ランクA
と表示させたい。。。。なんて場合は、どうしたらいいでしょうか?

iif関数でがんばれば、何とかできないことはないのですが、式が長くなりすぎるのもよくありません(間違えやすいしね)。
そこで、式が複雑になりそうな場合は、あらかじめ「4択の判断をして、その人がどのランクなのか算出する関数」を作っておいて、その関数をクエリで呼び出して使うようにしておくと良いかもしれません。
関数は、VBAというプログラミング言語を用いて作ります。

こんな感じかな↓多分こんな感じでいけると思うんですけど。


上のコードそのまんま使うとすると、kingaku()という関数を使うことになるのですが、具体的にはフィールドグリッドに普通の関数と同じように入力してやります↓

引数のuriageにあたるところに、[売上]と入れてやることによって、各レコードの[売上]の金額が関数に渡り、ランクAなのかBなのかCなのか・・・・が答えとして返ってきます。

結果はこんな感じです↓

まあ・・・要は・・・クエリっていうよりも、うまいこと関数が作れるかどうか、ってところにかかってますね(笑)
自分で関数作ってクエリで使っちゃったりもできるよ、ってことで。




■関数作成手順■
今回はクエリを作るのが目的であって、は関数の作り方(VBAについて)のコーナーじゃないので、詳しい解説はやりません。ご自分でいろいろ応用して作りたいという方は、ちゃんとした解説書とかで習得してください。

これから、売上フィールドの値が10000未満なら"ランクD"、10000以上9999999以下なら"ランクC"、10000000以上999999999999以下なら"ランクB"、1000000000000以上なら"ランクA"という「文字列」を答えとして出すための関数を作ります。
関数の名前はkingakuにしようと思ってます。
関数名は漢字とかひらがなとかでもいいんですけど、なんて名前付けたかわけがわからなくなるといけませんので、なるべくなら関数っぽい名前がいいかもしれないですね。ただし、既にMS-Accessの中にある関数名は使っちゃいけませんですよ。ありそうでなさそうな名前を付けるのが粋ってもんですぜ。


では作り始めましょう。
データベースウィンドウから、モジュールをクリックし、「新規作成」ボタンをクリックします。


Visual Basic Editorのウィンドウが開きます。



こんなふうに、処理の内容を入力します。



今日はクエリの練習なので・・・。
最初にご紹介したコードをコピーして、空いているところに貼り付けちゃってください。
Option Compare Databaseって行の下の空いているところなら、どこにはっつけても大丈夫です。
そうすれば、上の図と同じになると思います。
ほんとは、ちゃんと全行理解していかないと、思わぬ問題が発生する可能性もありますけれど・・・。でも今日は、あくまでもクエリの練習ですから・・・雰囲気だけってことで。

余分な文字が入っちゃったりしてないかどうかのチェックも含めて、メニューバーの[デバッグ]→[○○のコンパイル]をクリックしましょう。エラーが出なければオッケーデス。



■コードの内容の解説■
3択以上の場合は、Select Caseという構文を使うことが多いです。
これは、
 Select なんとか
  なんとかが1だったら
    こうしなさい
  なんとかが2だったら
    ああしなさい
  なんとかが3だったら
    そうしなさ
 End Select
という感じで、いくつもいくつも条件判断をさせることができるわけなんです。
今回は、
 Select 売上のフィールドの中の値
    Case < 10000
       kingaku関数の答えは"ランクD"という単語
    Case 10000 から 9999999
       kingaku関数の答えは"ランクC"という単語
    Case 10000000 から 999999999999
       kingaku関数の答えは"ランクB"という単語
    Case > 1000000000000
       kingaku関数の答えは"ランクA"という単語
 End Select
ということになります。もちろん、もっともっと細かく分けたい場合は、
あとは、もっとVBAっぽい書き方をしてやればOK。Case xx を増やしていきましょう。

で、肝心の[売上]フィールドの中の値なんですが、引数という形で受け取れるようにしておきます。
1行目がポイントなんですが、
   Public Function kingaku(uriage)
赤い字で書いた部分が、いわゆる「引数」です。ランクAなのかBなのかCなのか・・・を判断する「元ネタ」をカッコの中に入れてやるわけなんです。

今回使ってる[社員テーブル]の中の[売上]フィールドのデータ型は「倍精度浮動小数点型」です。
「倍精度浮動小数点型」はVBA的に書くと「Double」となります。なので、
   Public Function kingaku(uriage As Double)
ですね。
ついでに、kingakuという関数の答えとしては、ランクAとかランクBとか、いわゆる「文字」を返すので、kingakuという関数は「テキスト型」の答えを返せるように指定しておくとよいでしょう。「テキスト型」はVBA的にはStringと書きます。
   Public Function kingaku(uriage As Double) As String



ついでに・・・・・Public というのは、「このMDBファイルの中なら、どこからでも呼び出せる汎用関数」という意味です。
これに対して、特定のフォームの中とかだけの場合はPrivateという構文で始まります。Publicってやっとかないと、クエリの中とかで自由に使えなくなっちゃうので注意なのです。
   Public Function kingaku(uriage As Double) As String

Functionというのは、何かしら答えをはじき出す「関数」の場合につけます。
これに対し、何か特に答えを出すためではなく、順番に処理を実行するような場合は、Subという構文がつきます。
FunctionとかSubとかで始まる「処理ひとかたまり」を総称して「プロシージャ」と呼びます。
   Pblic Function kingaku(uriage As Double) As String

モジュールというのは、プロシージャが集まってひとまとまりになったオブジェクトのことです。
と、いうようなことは、専門の本で学習してくださいね〜。
ここはクエリを習得するためのコーナーだし、VBAを使った処理を書けるようになろうと思ったらやっぱ本の1冊や2冊は読まないといけませんよ。ヘルプも読むクセつけないとなりません。