第7講 結果を報告しない社員
第1話 分業の考え方
第7講の名称をどうするか悩みました。
実は、C言語&C++やJavaなら親分と子分あるいは社長と社員の名称がぴったりなのです。
C++(C言語を含む)やJavaには、誰も命令できない絶対的な存在である親分または社長がいるからです。
C++とJavaでは、社長(親分)が一人いて、残りは全員社員(子分)です。
社長は、社員に命令を下せます。
社員も社員に命令を下せます。
しかし、社員は社長には命令を下せません。
社長または親分は絶対的な存在です。
C++またはJavaの絶対的な親分は、main(メイン)と呼ばれます。
ところが、VBAの場合全体的な親分または社長はいないのです。
誰が誰に対しても命令を下せます。
ですから、VBAは社員のみにしかいない会社なのです。
VBAの場合、mainがありません。
ですから、第1講第5話の説明
Private Sub CommandButton1_Click()
・・・
・・・
・・・
End Sub
は、CommandButton1ボタンがクリックされたときに働く社員(社長、将来多数の社員を持つので)という意味です。
社長のことをこの講義では、親分ともいいます。
親分ですから、当然子分も持ちます。
といっても、現在のところ2人(CommandButton1=実行とCommandButton2=消去)の親分は、
まだ、それぞれ1人も子分を持っていません。
つまり、2つの会社は今のところそれぞれ社員は、社長一人のみであるわけです。
CommandButton2=消去の方の任務は、セルの内容を消してA1を選択するだけですから、
社長以外の社員を持つ必要がないので、社員を持つことはありませんが、
CommandButton1=実行の方は、複雑な業務(例えば、数独問題作成)を行いますので、
社長一人では、処理しきれませんので社員をたくさん持つことになります。
は実を言うと少し不正確な説明です。
CommandButton2などが社長なら、社員は命令を下せないはずです。
ところが、VBAの場合CommandButton2に対してもCommandButton1の子分が命令を下せるのです。
そして、CommandButton1の子分もCommandButton1に対して命令を下せます
(ただし、この場合は気をつけないと、命令が無限に連鎖する無限ループになったしまう危険性があります。
なぜなら、CommandButton1の文章の中に社員Aに対する命令があり、
社員Aの文章にもCommandButton1に対する命令があるとすれば、
2枚の鏡を平行においたときのように、命令が事切れることなく連鎖してしまうからです。
後で具体例を取り上げます。)。
ですから、親分・子分または社長・社員ではなく、全員が上下関係のない社員なのです。
お互いに命令する(命令という言葉に抵抗があるのでしたら仕事を頼む)ことができる対等な社員なのです。
具体例がないと今までの説明わかりませんよね。
ここで言いたいことは、仕事を一人でしないで、
分業していろいろな社員が仕事をするようにしようということなのです。
前話のコード
Private Sub CommandButton1_Click()
Cells(6, 2) = "出席番号"
Cells(6, 3) = "国語"
Cells(6, 4) = "社会"
Cells(6, 5) = "数学"
Cells(6, 6) = "理科"
Cells(6, 7) = "英語"
Cells(6, 8) = "合計"
Cells(6, 9) = "平均"
Cells(6, 10) = "評価"
Cells(6, 11) = "3段階評価"
Cells(6, 12) = "4段階評価"
Cells(6, 13) = "5段階評価"
Dim i As Byte, j As Byte, w As Integer
For i = 0 To 39
Cells(7 + i, 2) = i + 1
For j = 0 To 4
Cells(7 + i, 3 + j) = Int(100 * Rnd())
Next
Next
For i = 0 To 4
w = 0
For j = 0 To 39
w = w + Cells(7 + j, 3 + i)
Next
Cells(47, 3 + i) = w
Cells(48, 3 + i) = w / 40
If w / 10 >= 50 Then
Cells(49, 3 + i) = "合格"
Else
Cells(49, 3 + i) = "不合格"
End If
Next
For i = 0 To 39
w = 0
For j = 0 To 4
w = w + Cells(7 + i, 3 + j)
Next
Cells(7 + i, 8) = w
Cells(7 + i, 9) = w / 5
If w / 5 >= 50 Then
Cells(7 + i, 10) = "合格"
Else
Cells(7 + i, 10) = "不合格"
End If
If w / 5 >= 55 Then
Cells(7 + i, 11) = "優秀"
Else
If w / 5 >= 50 Then
Cells(7 + i, 11) = "普通"
Else
Cells(7 + i, 11) = "努力が必要"
End If
End If
If w / 5 >= 60 Then
Cells(7 + i, 12) = "天才級"
Else
If w / 5 >= 55 Then
Cells(7 + i, 12) = "秀才級"
Else
If w / 5 >= 50 Then
Cells(7 + i, 12) = "平凡"
Else
Cells(7 + i, 12) = "不出来"
End If
End If
End If
If w / 5 >= 65 Then
Cells(7 + i, 13) = "神"
Else
If w / 5 >= 60 Then
Cells(7 + i, 13) = "准超越者"
Else
If w / 5 >= 55 Then
Cells(7 + i, 13) = "人間"
Else
If w / 5 >= 45 Then
Cells(7 + i, 13) = "人造人間ベム・ベロ・ベラ級"
Else
Cells(7 + i, 13) = "ピノキオ以下の存在"
End If
End If
End If
End If
Next
w = 0
For i = 1 To 10
w = w + Cells(6 + i, 8)
Next
Cells(47, 8) = w
Cells(48, 8) = w / 40
Dim v As Single
v = 0
For i = 1 To 39
v = v + Cells(6 + i, 9)
Next
Cells(47, 9) = v
Cells(48, 9) = v / 10
Cells(47, 2) = "合計"
Cells(48, 2) = "平均"
Cells(49, 2) = "評価"
End Sub
は同じことを横縦に繰り返すによって、かなりすっきりしたとはいえ褒められたものではありません。
一人ですべての仕事をこなしているからです。
このプログラムの文章を次のように改変したら大変わかりやすくなります。
Private Sub CommandButton1_Click()
表題を表示するという仕事をAさんに依頼
出席番号とデータを発生させる仕事をBさんに依頼
各生徒の合計・平均・評価算出の仕事をCさんに依頼
各教科の合計・平均・評価算出の仕事をDさんに依頼
合計の合計・平均の算出やその他の仕事をEさんに依頼
End Sub
(上の色と下の色は対応させてあります。)
全員が先に上下関係のない社員であると言いましたが、
それは理論上の話でありまして、
実際上は、全体の仕事像を把握して、いろいろな人に仕事を依頼(命令)している人は、
CommandButton1さんですから、やはりこの人が社長であると言ってよいでしょう。
会社CommandButton1は社長を含め5人の会社になったことになります。
ただし、この場合命令の及ぶ範囲つまり命令系統を会社といっています。
第6講第8話へ 第2話へ
vc++講義へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
vb講義へ
VB講義基礎へ
初心者のためのJava 入門 基礎から応用まで
数学研究室に戻る