関数とは?
Excelを使っている人なら、お馴染みだと思いますが、「引数」と「戻り値」から構成されていて、
戻り値 = 関数名(引数)
というように記述します。
「引数」に文字や数字などの値を入れると、その関数の法則に従って、結果が、「戻り値」として得る事が出来て、
クエリやモジュール・またフォームの表示用のテキストボックスやレポートのテキストボックスなどでも使う事が出来ます。
Excelで、セルに関数を記述する場合は、セルそのものが戻り値となりますので、
= 関数名(引数)
のように記述しますが、フォームやレポートのテキストボックスで使用する場合も同様です。
戻り値は、必ず1つです。関数ですから結果が複数になる事はありません。
引数は、関数によって異なり、1つだけの場合もあれば、2つの場合、
また、
必須の引数以外に、オプションとして複数、引数を指定する事も可能
という関数もあります。
複数の引数がある場合は、
戻り値 = 関数名(引数1,引数2,引数3)
というように、「,(カンマ)」で区切って記述します。
Accessには豊富に関数が用意されていて、大変便利なのですが、
「豊富すぎて、どれを使ったらいいか分からない」
という事もよくあります。
数多い関数ですが、その中でも、「よく使うもの」に厳選すれば、その数も限られます。
そこで、この「関数編」では、「この関数だけは知っておくと便利」という関数を厳選し、説明していきたいと思います。
関数を勉強するには、
とりあえず、
自分で関数を記述して、実際に使ってみて、確認・検証する
という事が大切です。
関数の機能を確認するには、クエリを使うのが簡単で、その場合の使い方は、クエリ編「文字列や計算に関数を利用する」で説明しています。
ただ、もっと簡単に検証する為に、
関数の検証用のフォームを作っておく方法を説明します。
1回、作っておけば、様々な関数を記述するだけで、結果を確認できるので便利です。
まず、フォームを新規作成し、次のようにラベルボックス・テキストボックスを配置します。
引数の入力用として、「引数1・引数2・引数3」の3つのテキストボックスを配置します。
※引数は、関数によって1つで済む場合も多いですが、一応、3つまで設定できるように3つ、用意してあります。
必要に応じて増やしても構いません。
「引数1・引数2・引数3」のコントロールソースは「非連結」にします。(コントロールソースに何も指定しなければ「非連結」となります。)
後は、「結果」のテキストボックスのコントロールソースに、それぞれの関数を記述するだけです。
画面の例では、「結果」テキストボックスのコントロールソースに、
=Int([引数1])
と記述し、保存します。
このフォームを開いて、
「引数1」に3.567と入力すると、
「結果」に3と表示されます。
※「引数1」や「引数2」の1や2は、半角と全角が混在しないように気を付けましょう。
ただし、様々な引数の場合の結果が、どのようなるのか?
一覧で、即座に見たい場合は、クエリを利用した方が便利です。
今後の説明の参考例でも、このようにフォームを使って説明した方が手っ取り早いと、クエリを使って説明した方が分かりやすい場合もあるので、その都度、使い分けていきたいと思います。
3.条件式によって、2つの別の結果を返す関数(IIf関数) |
条件式が正解か誤っているかによって、別の結果を返す関数として、IIf関数があり、
IIf([条件式],正,誤)
と記述します。
具体例として、
=IIf([引数1]=1,"男","女")
として、実行してみましょう。
「引数1」に1と入力すると「男」、それ以外の場合は「女」と表示されます。
最初、「引数1」に何も入力されていない時は、
「引数1」=1ではないので、「女」と表示されます。
4.IIf関数の中にIIf関数を入れて3つ以上の結果を求める |
IIf関数の正や誤、それぞれに更にIIf関数を記述して3つ以上の結果を求める事も出来ます。
例えば、
=IIf([引数1]=1,"東京",IIf([引数1]=2,"大阪","京都"))
このように記述すると、どうなるでしょう。
まず、「引数1」が1の場合は、「東京」に決定します。
そして、「引数1」以外の場合、
今度は、「引数1」が2なら「大阪」、それ以外なら「京都」と表示されるようになります。
更に、
その中にIIf関数
という事も可能です。
このようにIIf関数の中にIIf関数を入れる事によって、多くの分類に振り分ける事ができます。
この際、「()かっこ」の数が少なかったり、場所を間違えると、エラーになったり、思った結果が表示されないので、その点を注意しましょう。
5.条件式によって、3つ以上の結果を返す関数(Switch関数) |
IIf関数の中にIIf関数、更に、その中にIIf関数、
というように記述すれば、複数の結果に振り分ける事は可能ですが、これをやり過ぎると、かなり複雑で見づらい式になってしまいます。
こういった場合、わざわざ、IIf関数を使わなくても、もっと簡単に判断して振り分ける為の関数、Switch関数があります。
IIf([条件式],結果,[条件式],結果,[条件式],結果,[条件式],結果・・・)
このように、左から順番に、その条件式が正しければ、その次に書かれた結果、そうでなければ、その次の式で判断して、正しければ、その次に書かれた結果、
というように動作します。
具体的には、
=Switch([引数1]=1,"東京",[引数1]=2,"大阪",[引数1]=3,"愛知",True,"その他")
最後の
True,"その他"
は、
それまでの左の条件以外の場合すべて
という意味です。
この関数を実行すると、
1なら「東京」
2なら「大阪」
3なら「愛知」
それ以外は全て「その他」
と表示されます。
6.順番によって、複数の結果を返す関数(Coose関数) |
Switch関数は、
条件式・その結果・条件式・その結果・・・
というように、左から順番に判断していきますが、「条件式によって、3つ以上の結果を返す関数(Switch関数)」の例のように、
1なら「東京」
2なら「大阪」
3なら「愛知」
といった場合、要するに、1から始まる順番によって結果を得たい場合なら、Coose関数の方がシンプルです。
Choose([順番],結果1,結果2,結果3・・・)
と記述します。[順番]が1なら結果1、2なら結果2、3なら結果3
という意味です。
具体的には、
=Choose([引数1],"東京","大阪","愛知")
というように記述します。
ただし、[引数1]に何も入力されていないとエラー表示されますし、[引数1]が当てはまる順番以外の場合は、何も表示されないので、そういった点も考慮しようと思うと、IIf関数やIsNull関数と組み合わせる必要があり、
Switch関数とどちらがシンプルか?
微妙なところです。
必要に応じて、効率よく使い分けましょう。
7.何も入力されていないか、入力されているかを判断する関数(IsNull関数) |
次のようなフォームを作成し、Switch関数の動きを確認してみましょう。
「結果」の「テキストボックス」のコントロールソースには、
=Switch([引数1]="","未入力",[引数1]="1","男",[引数1]="2","女")
と記述してあります。
要するに、引数1に、
何も入力されていない時は「未入力」
1と入力されていれば「男」
2と入力されていれば「女」
と表示したい訳です。
実際に、このフォームを保存し、開いてみましょう。
開いて、最初の時点では「引数1」に何も入力されていないのに「結果」には何も表示されません。
????
引き続き、「引数1」に「1」や「2」と入力してみて下さい。
今度は、ちゃんと、「男」「女」と表示されるはずです。
再度、「引数1」を消去しても、やはり「未入力」とは表示されません。
何故でしょう???
実はAccessでは何も入力されていない状態は、空白(スペース)ではありません。空白の場合は、空白というコードが入力されている、また、今回のように、
[引数1]=""
というのは、
長さが0の文字列
という事で、何も入力されていない状態とは違います。
では、どのようにすればいいのでしょうか?
この、何も入力されていない状態の事をNull(ヌル)といい、Nullかそうでないかを判断する関数として、
IsNull関数があります。
では、先程の式を次のように変更してみましょう。
=Switch(IsNull([引数1]),"未入力",[引数1]="1","男",[引数1]="2","女")
これで、
もし、「引数1」に何も入力されていなければ「未入力」と表示される設定となりました。
フォームを再度、開いてみて下さい。
今度は、最初の「引数1」に何も入力されていない状態で結果に「未入力」と表示されました。
また、何か「引数1」に入力した後、消去したら、再度、「未入力」と表示されるはずです。
今回は、Switch関数を使いましたが、
=IIf(IsNull([引数1]),"未入力","入力済")
というようにIIf関数で使う事も出来ますし、モジュールで、
If IsNull(A) Then
A="未入力"
else
A="入力済"
End If
といった使い方をします。
このようにIsNull関数は、判断式や判断する関数と組み合わせて使います。
非常に使用頻度の高い関数です。是非、覚えておきましょう。
8.文字列の文字数とバイト数を調べる関数(Len関数・LenB関数) |
テーブルの各フィールドに保存されている文字列の文字数とバイト数を調べる事ができる関数があります。
Len関数とLenB関数です。
それでは、次のようなクエリを作ってみましょう。
このLen関数は、文字列の文字数を算出してくれる関数です。
この場合は、「品名」フィールドの文字数を表示する「文字数」という表示項目を作っています。
それでは、このクエリを開いて確認してみましょう。
確かに、品名の文字数が表示されています。
このように文字数を取得するのは簡単ですが、バイト数を取得するのは、ちょっと厄介です。
バイト数、要するに、
全角1文字の場合は2バイト、半角1文字の場合は1バイト
という具合に数えた結果が欲しい訳で、その為に、
LenBという関数があるのですが・・・
実際に、先程のクエリを、
バイト数:LenB([品名])
と変更してみて下さい。
次のようになりました。
???これでは、ただ、文字数を2倍しているだけですね。
例えば、1行目なら、
「パソコン」が全角、「MN-112」が半角ですから、
4×2+6=14
で、14バイトにならなければいけません。
マニュアルには、
LEN/LENB
文字列の文字数またはバイト数を返します。LEN 関数では、半角と全角の区別なく 1 文字を 1 として処理が行われます。LENB 関数では、バイト数
(半角単位) で処理が行われます。
と書いてありますが????
実は、私も以前に、この件で悩んだ事がありました。
印刷の時、「ある文字数以上の場合は改行する」という事がしたくて、その場合、文字数だと全角の10文字と半角の10では幅が全く違うので、文字数ではなく、バイト数で判断して改行したかったのです。
この疑問を調べていくと、マニュアルに、こんな事が書かれていました。
文字列操作関数の動作の違い
言語独自の情報について
Access 95 以降のバージョンの Visual Basic と Access 95 以前のバージョンの Access Basic とでは、文字列のメモリ上の格納形式が異なります。文字列は、Access Basic のコードでは ANSI 形式で格納され、Visual Basic では Unicode 形式で格納されます。
Visual Basic で Unicode 形式を使用するのは、Visual Basic と密接な関係のある OLE の内部での文字列の形式に合わせるためです。
この意味は別に理解する必要もないと思います。要するにLenB関数は、そのままでは使えないという事で、
StrConv 関数
という文字列のコードを変換する関数を利用する事で解決する事が分かりました。
クエリの式を
バイト数: LenB(StrConv([品名],128))
に変更して下さい。
次のようになりました。
こんどは、ちゃんとバイト数が表示されました。
要するに、
StrConv([品名],128)
で、文字列を一旦、変換した後に、LenB関数でバイト数を求めています。
なぜ、StrConvなのか?なぜ128なのか?
説明を始めると長くなりますし、この講座の趣旨とは離れますので省略します。
とりあえず、深く考えなくても、「このようにすれば、バイト数を求められる」という事を知っておけば、それでいいと思います。
※マニュアルには、この文字変換は、「Macintosh. では使用できません」と書いてあります。
私自身、Macintosh. は使った事がありませんし、その予定もないので、検証も出来ません。
ご了承下さい。
9.指定した数の文字を返す関数(Left関数・Right関数・Mid関数) |
文字列に対し、何文字目かを指定し、文字を返す関数を3つ紹介します。
まず、Left関数ですが、この関数は、
左(先頭)から何文字目かを指定し、その数字分の文字を返します。
例えば、
Left([品名],3)
とすると、
「品名」が「パソコンMN-112」でしたら先頭から3文字目まで、つまり「パソコ」となります。
次に、Right関数は、Left関数とは逆に、
右(最後)から何文字目かを指定し、その数字分の文字を返します。
Right([品名],2)
とすると、
「品名」が「パソコンMN-112」でしたら最後から2文字目まで、つまり「12」となります。
最後に、Mid関数ですが、
左(先頭)から何文字目から何文字分、その2つの数字を指定し、文字を返します。
Mid([品名],2,3)
とすると、
「品名」が「パソコンMN-112」でしたら先頭から2文字目から3文字分、つまり「ソコン」となります。
上図のように指定し、このクエリを開くと、
となります。
クエリで指定した各関数と、その結果について、それぞれ確認して下さい。
10.郵便番号に「-」が付いていない場合「-」を付ける |
これは、IIf関数・Left関数・Right関数の応用例です。
現在の日本の郵便番号は、「3桁-4桁」で統一されています。
既に入力されている郵便番号が、
123-3232
のように「-」が付いているデータと、
2338745
のように「-」が付いていないデータとが混在していた場合に、
全て「-」付きに統一したい
といった場合の処理です。
まず、
先頭から4文字目が「-」か?そうでないか?
という事で、
Mid([郵便番号],4,1)="-"
の結果が
正なら郵便番号をそのまま表示、
誤なら郵便番号3文字分+「-」+郵便番号4文字分
とします。
具体的には、
IIf(Mid([郵便番号],4,1)="-",[郵便番号],Left([郵便番号],3) & "-"
& Right([郵便番号],4))
とします。
このようになります。
ただし、この式では、郵便番号が入力されていない時や、郵便番号がきちんと7文字分の番号が入力されていない場合の考慮までは、されていません。
実務で使うなら、そういった点も考慮しましょう。
また、郵便番号の場合は、、「3桁-4桁」で統一されているので、こうやって分ける事が出来ますが、電話番号の場合は地域によって、どこに「-」が入るか、異なってきます。
もしも、分ける必要があるなら、テーブル作成の段階から、3つのフィールドに分けておきましょう。
|