第6講 サブプロシージャの学習
第2話 新に社員を採用してその社員に仕事を依頼する
第5講までで作ったプログラム(マクロ)はすべて、社員が2人でした。
実行ボタンが押されると働く社員CommandButton1_Clickと、
消去ボタンが押されると働く社員CommandButton2_Clickの2人です。
VBAの場合には社員に上下関係はありません。
すべて同僚であると考えてください。
ですが、
Private Sub CommandButton1_Click()
  CommandButton2_Click
       ・
       ・
       ・
End Sub
Private Sub CommandButton2_Click()
  Rows("3:2000").Select
  Selection.ClearContents
  Cells(1, 1).Select
End Sub
の場合には、CommandButton1_ClickがCommandButton2_Clickに仕事を頼んでいるだけで、
CommandButton2_ClickはCommandButton1_Clickに仕事を頼んでいませんので、
CommandButton1_Clickを仮の社長であるとして、
以後の話を進めます。
チームにおいては、リーダーがいた方がチームワークが強固になります。
本当は権限においては、同等ですが実行ボタンを仮のリーダーとするわけです。
VBAではすべて同僚ですが、VBA以外の言語では絶対的な社長がします。
社長名はmainとするのが普通です。
これが絶対的な社長であるのは、
mainは社員に命令を下すことが出来るのに対して、
main以外の社員はmainに仕事を依頼することが出来ないからです。
mainとは中心という意味ですね。
つまり、VBA以外ではmainを社長としてすなわち中心としてプログラムが運営されるわけです。
社長を中心にしてプログラムを運営する方がわかりやすいですから、
CommandButton1_Clickを仮の社長として話を進めようというわけです。

では、新しい社員を雇うにはどうしたらよいでしょうか。
簡単です。
結果を報告しない=値を返さない社員fを雇うのであれば、
CommandButton1_ClickやCommandButton2_Clickの外側で、
Sub f
と打ってエンターするのです。
そして、fに仕事を依頼するには、fの名前を呼べばよいのです。
基本的にプログラミングを運営する会社の社員は、
封建農奴主義時代の職人と同じで、
1つの仕事しか出来ません。
資本主義社会では、流動性(社会的総労働をいろいろな生産部門に適宜に分配)に対応するために、
どんな仕事でも出来るように教育を普及させて、
事務作業でも現場の仕事でもその他でも出来る万能人を育てましたが、
封建時代は靴職員は靴を作る仕事以外には何も出来ませんでした。
職業の自由がないので、
一生同じ仕事をしますし、
被支配階級は教育も受けていませんので1つの仕事しか出来ないのです。
プログラミングの会社の社員も基本は仕事は1つに決まっています。
つまり、専門馬鹿です。
ですから、誰々君何々の仕事をしなさいと、何々の部分を言う必要がないのです。
だたし、第1話で述べましたように仕事に条件をつけなければならない場合もあります。
このときは、社員に仕事を依頼するときにその条件を引数(ひきすう)として送るのです。
では皆さん次の添付ファイルを開いて、
参考ダウンロード添付ファイル

Private Sub CommandButton1_Click()
  CommandButton2_Click

End Sub

Private Sub CommandButton2_Click()
  Rows("3:2000").Select
  Selection.ClearContents
  Cells(1, 1).Select
End Sub

CommandButton1とCommandButton2の間で、
Sub fと打ってエンターしてみてください。
すると
Private Sub CommandButton1_Click()
  CommandButton2_Click

End Sub
Sub f()

End Sub

Private Sub CommandButton2_Click()
  Rows("3:2000").Select
  Selection.ClearContents
  Cells(1, 1).Select
End Sub
となり、新しい社員fが採用できます。
さらにコードを次のようにしてください。
Private Sub CommandButton1_Click()
  CommandButton2_Click '社員CommandButton2_Clickに仕事を依頼
  f '社員fに仕事を依頼した
End Sub
Sub f()
  Cells(3, 2) = "はじめまして。"
End Sub
Private Sub CommandButton2_Click()
  Rows("3:2000").Select
  Selection.ClearContents
  Cells(1, 1).Select
End Sub
すると実行結果は
001
尚、社員名を呼ぶことをCall(コール)といい、
コールであることを強調するために
Private Sub CommandButton1_Click()
  CommandButton2_Click '社員CommandButton2_Clickに仕事を依頼
  
Call f '社員fに仕事を依頼した
End Sub


Private Sub CommandButton2_Click()
  Rows("3:2000").Select
  Selection.ClearContents
  Cells(1, 1).Select
End Sub
としてもよいのですが、
この後学ぶ引数が1個以下のときには、
Callを省略することが出来ます。
引数が2個以上では
  Call f 1,100
などと書き、Callは省略できません。
また、引数が1個のときは
  Call f(1)
とCallを入れるときには括弧が必要になります。
省略するときには
  f 1
  f(1)
の両方が認められます。
C言語では引数が1個のときも複数のときも
  f(1)
  f(1,100)
で括弧書きで書くのですが、
VBAでは引数が複数のときには
  Call f(1,100)
と書くとエラーします。
ですから、
  Call f 1,100
と()なしで書くしかありません。
本当は関数とはf(x)やf(s、t)(高校では変数が1つの関数しか学んでいませんが、変数が複数の関数もあるのです)
ですから、
C言語の書き方の方が好きですが、
決まりですから仕方ありません。

fのコードを次のように変更すると、
Sub f()
  Dim w As Integer, i As Byte
  w = 0 'wを0に初期化
  For i = 1 To 10
    w = w + i
  Next
  Cells(3, 2) = "1+2+3+・・・+10の計算結果は"
  Cells(4, 2) = w
  Cells(5, 2) = "です。"
End Sub
実行結果は
002
となります。
では、次の課題です。
fに仕事をさせて、
003
実行結果がとなるように変更しましょう。





第1話へ 第3話へ


トップへ