VBA講座2

条件分岐の制御文と関数作成
”VBA講座1”は、つまらなかったと思います。
わざわざ関数を作らなくても”B1セル”に”=2*A1”と式を書くだけで同じ結果が得られるのですから。
しかし、五段階評定をエクセルの式で記述しようとすると、
大変な手間になりますし、十段階評定にいたっては不可能です。
(エクセルのIf文の入れ子式は七個までしか出来ません。)
自分で必要な関数を作っておけば、セルには”=関数名(対象セル番地)”を入力するだけで動作します。
この、講座2では、条件分岐の制御文と関数作成について説明します。
If Else文について

プログラムを作成する人は、まず変数を理解します。
そして、制御文であるif Else文を理解すると思います。
If Else文とは、”もし、何だったらだったら、こうします” ”そして、そうでなかったら、こうしてください。”という文章です。

さらにIf Else文では、以下のように多くの条件分岐が可能です

もし、何々だったらだったら、こうしてください。
そして、そうでなく、この場合は、こうしてください。
さらに、それでもなくて、この場合はこうしてください。
さらに、それでもなくて、この場合はこうしてください。
さらに、それでもなくて、この場合はこうしてください。
さらに、それでもなくて、この場合はこうしてください。
さらに、それでもなくて、この場合はこうしてください。
さらに、それでもなくて、この場合はこうしてください。
さらに、それでもなくて、この場合はこうしてください。
さらに、それでもなくて、この場合はこうしてください。
さらに、それでもなくて、この場合はこうしてください。
さらに、それでもなくて、この場合はこうしてください。
さらに、それでもなくて、この場合はこうしてください。
さらに、それでもなくて、この場合はこうしてください。
そして、それ以外の場合はこうしてください。
という具合に条件分岐が出来ますから、10段階評定も可能です。

If Else文では、上から順に該当する項目を調べていきます。
どこかで、該当する項目がある場合は、そこで終了します。
最後の行の”それ以外の場合はこうしてください。”は、
エラーを防ぐために必要です。
どうしても、上から順に調べて行くために処理が遅くなります。これが欠点です。
また、上から順に調べていくため各ステートメントの並びが大切です。

最初から、必要な条件の場合に、その選択肢に行けるのがSelect Case文です。
私は、C言語から勉強してましたので、Switch case文が、Select Case文にあたるのを
理解するのに、しばらくかかりました。C言語の文法は、If Else文、Switch case文
Do While文、for文の四つだけですから。
VBやVBAでは、If Else文、Select Case文、For Next文、Do While文だけで、
だいたいのプログラムは組めると思います。
If Else文は、C言語と同じで、Select Case文もC言語のSwitch case文と同じです。
For Next文がC言語のfor文やDo While文にあたると思ってください。
本当は違うのですが、まあ差し障りはないと思います。

ここからは、元三条学園の教師だった外道院先生に説明してもらいます。
「先生、こんにちは。」
「先生のことは、シラサさんからいろいろ聞いています。」
「ふうん、どんな内容なのかな?」
「先生が、学年主任だったり生徒会担当だったこととか、
成績処理プログラムをつくられたこととかですが。」
「ふうん、それだけかな?」
「ええと、あと奥様に逃げられたこととか、」
「長男の卓太郎君が、今も家出中とか、でしょうか。」
「それから、定年退職した今も、エロゲーやエロ同人誌を買いあさっておられるとか、」
「いまだに、コミケに出没しておられることとか、」
「もういい、シラサ君は相当おしゃべりだな!」
「それだけ、先生がシラサさんに慕われていたのですよ。」
「ところで先生、奥様はどうして逃げたのですか?」
「卓太郎君の家出の原因は有名ですから、いいんですが。」
「貧乏が悪いのだ。家内は”切れた電球”を渡した翌日に逃げおった。」
「切れた電球?何ですかそれ?」
「わしが職場に履いていく靴下に、穴があいていてな、」
「わしは、普段は草履か下駄で行動するから靴下は履かないのだが」
「始業式には、さすがに靴を履くからな、」
「ふむふむ、それで???」
「家内が『新しい靴下を買うからお金ください。』といったので、」
「ははあ、・・・」
「金の代わりに、切れた電球を渡したら・・・」
「なるほど、電球を靴下の中に入れて、穴を修繕しろと、」
「それは、奥様も怒りますね。」
「よくわかったな!そんなに若いのに!」
「シラサさん所のメイドのサヨリさんに教わりました。」
「あの姉妹、家では、ツギの当たった靴下を平気で履いています。」
「そうか、三条家の姉妹もなかなかやるな。」
「イソメ君がケチなのは知ってたが、シラサ君までとはな、」
「二人とも、趣味以外には金を使わんタイプのようだな。」
「でも、あちらは大金持ちなのに、本当にケチですね。」
「ひょっとして、金持ちほどケチなんでしょうか?」
「それはいえる。金持ちは”金が好き”だから、金を使うのが嫌いなんだ。」
「しっかりと、一円たりとも節約するからな。」
「守銭奴みたいなもので、結婚したら大変だぞ!」
「そうですか、玉の輿なんて悲惨かも知れませんね。」
「貧乏人は、金を使うのが好きだから貧乏なのかも?」
「そうなんだ、貧乏なやつは”金がほしい”とか”金が大好き”というが、
本当は、金を使うのが大好きなんだな。」
「金は使わなければ減らないんだ。」
「なるほど、”金は使わなければ減らない。”名言ですね。」
「ところで、三条学園の給料はそんなに少なかったんですか?」
「いいや、わしの給料は人並みにあったのだが・・・」
「まさか、給料の大半を、エロゲーや同人誌やフィギュアーに使ったとか?」
「しかたあるまい。」
「この国で一年にどれほどのゲームや同人誌やフィギュアーが出ると思う。」
「わかりました。もういいです。」
「先生の作ったプログラムの説明をお願いします。」


これは、文科省の基準による、ABC判定の関数なんだ。名前はABCだ。
内容は、基準点に対して80パーセント以上の点数ならばA
50パーセント以上の点数ならばB
それより下ならCという内容なんだ。
ええと、知ってると思うが、数学用語で以上・以下はイコールのイで=なんだ。
よりとか未満は=じゃないんだ。知ってたか?
つまり、18歳未満や18歳より下は、18歳は含まないといううことなんだ。
20歳以上は20歳を含むということだから、お酒は20歳以上からは正しいけれど、
20歳以下はだめは、間違いとなる。
20歳未満または20より下の人はだめが正しいわけだ。
これ、パソコンや数学では大切なんだ。エラーの原因になるからな。
パソコンでは、矛盾が許されんから!

Public Function ABC(Target As Integer) As String
If Target >= 80 Then
ABC = "A"
ElseIf Target >= 50 Then
ABC = "B"
ElseIf Target >= 0 Then
ABC = "C"
ElseIf Target < 0 Then
ABC = "/"
End If
End Function


教師が、基準点を入れ生徒のデーターを入力すると、そこを見ているセルが
パーセント換算する。
そして、そのパーセントを見たセルに”=ABC”と関数名が記されているので、
ABCという関数が動作して、戻り値が返されるわけだ。
最初の行のAs Stringの理由は、戻り値が”A””B””C”の文字なので、
文字列型変数を指定しているからなんだ。

これは、五段階評定の関数なんだ。名前はhyotei(評定)とした。

Public Function hyotei(Target As Single) As Integer
If Target >= 85 Then
hyotei = "5"
ElseIf Target >= 75 Then
hyotei = "4"
ElseIf Target >= 55 Then
hyotei = "3"
ElseIf Target >= 40 Then
hyotei = "2"
ElseIf Target < 40 Then
hyotei = "1"
ElseIf Target < 0 Then
hyotei = "/"
End If
End Function


では、説明するよ。
まず、Targetになるセルには、パーセントが表示されるようにする。
具体的には、生徒の取った点数を満点の合計で割って、100を掛けるでしょうかね。
数値がかなり変なのは、Aを3点Bを2点Cを1点として計算しているからなんだ。
つまり、評価の総数が100回の場合、満点の合計は3掛ける100で300点となる。
100回ともAの子のセルには、300/300*100で、100パーセントが表示される。
100回ともBの子のセルには、200/300*100で、66.67パーセントが表示される。
100回ともCの子のセルには、100/300*100で、33.33パーセントが表示される。
これ、実は無茶なやり方で、相当な誤差が出ますな。
そもそも、ABCの三段階評定から五段階評定を出すのは、根本的に間違ってますな。
本当は各評価の割合をもとに評定を出すべきだと思うのですがね?
パソコンでシステムを作れば、誰でも簡単に出来るのですけどね。
(当時の教師の誰でもが可能なレベルという意識が、
文科省にあったのでしょうかね?
たしかに、この方法なら電卓で計算できますから)
そうゆうわけで、変なことになり、後での修正が不可欠になりますな。
最初の行の(Target As Single)少数を含む実数になる可能性があるからなんだ。
また、Public Function は、モジュール以外で使う関数の場合に使うんだが、
Functionだけでも動作するよ。自動的にPublic Functionと解釈されるから。
Select Case文について
「では、次にセレクト・ケース文について説明してください」

これはSelect Case文で、同じような関数を作った例だ。

上記の観点別評価や評定の欠点を補うための関数なんだが、
観点が4項目あって、それぞれの項目ごとの評価回数が同じならば、問題は少ないのだが、
評価回数に差がありすぎると、矛盾が生まれるんだ。
そこで、評定の値が、以下の関数からの戻り値以外の場合に、
条件付書式で評定セルを<赤く表示することにした。
(条件付書式については自分で勉強してな。)
まず、各観点の合計欄(A1)をつくり、その隣に=checkm(A1)という関数を入力、
さらにその隣に=checks(A1)という関数を入力する。(A1)は合計欄なんだ。
そして、評定のセルに、条件付書式で、書式を設定するわけなんだ。
まず、空白セルに色が表示されるのを防ぐため、
条件1で、どこか差しさわりのない空白セルをを指定し、
”条件が真の場合”の書式は”色なし”とでも指定しておこう。
そして、条件の追加をして、条件2で、
”評定の値が、関数を入力した二つのセルの値以外の場合に赤く表示する”
セルの値が”関数1のセル”の値と”関数2のセル”の値以外の場合、
書式が赤になる。という内容なんだ。

Public Function checkm(Target As Integer) As Integer
Select Case Target
Case 12, 11
checkm = 5
Case 10
checkm = 4
Case 9, 8, 7
checkm = 3
Case 6, 5
checkm = 2
Case 4
checkm = 1
Case Is < 4
checkm = 0
End Select
End Function

まあ、分かると思うけど、観点4項目がAAAAやAAABの場合の5はOK
AABBの4もOKといった内容なんだ。

Public Function checks(Target As Integer) As Integer
Select Case Target
Case 12
checks = 5
Case 11
checks = 4
Case 10, 9, 8
checks = 3
Case 7, 6
checks = 2
Case 5, 4
checks = 1
Case Is < 4
checks = 0
End Select
End Function


「先生ありがとうございました。」
「次は、先生が作っていた女子生徒や女性教師のブラサイズを求めるプログラムを教材にさせていただきます。」

「な!いつのまのわしの秘蔵のプログラムを!?」
前に戻る次に進む
最初に戻る