第6講 サブプロシージャの学習
第1話 サブプロシージャとは?
C言語ではプログラムの単位を関数と呼び、
他のプログラミング言語もそれにならった言い方で呼んでいます。
Javaであればメソッドですし、
VBやVBAならサブプロシージャとファンクションプロシージャです。
ファンクションプロシージャのファンクションはFunctionと書き、
意味は関数です。
メソッドも方法とか働きという意味で、
Functionと関連を持っています。
C++でもメンバー関数と呼び、
やはりFunction由来の言い方をしています。
単なる単位にすぎないものをなぜ関数と呼ぶのでしょうか。
それは、プロシージャの1つである引数付きのファンクションプロシージャを学ぶとはっきりとわかります。
y=f(x)
が関数ですね。引数(「ひきすう」と読みます。「いんすう」ではありません。)がxに相当して、
返された値がyに収納されます。
関数を関係する数と解釈する(=名詞として捉える)と、
働きとまったく結びつきませんが、
関数を動詞として考えると働きの方がむしろぴったりであることがわかります。
どういうことかと申しますと、関数のイメージは

左からxを入力すると加工されてyとなって出てくるものだからです。
私の実家は温泉まんじゅうを製造販売していましたが、
まんじゅうを製造する機械はまさに関数でした。
入り口から皮の材料やあんこを入れると、
出口からおまんじゅうが出てくるのです。
皮の材料とあんこを加工することが機械の任務です。
xを加工してyにする、これが関数を動詞として解釈するという意味です。
ところが、入力するものもそこから出てくるものもないものまで、
関数と呼びます。
C言語ではvoid型関数と呼び、VBやVBAではサブプロシージャと呼びます。
もちろん、引数付きのvoid型関数とサブプロシージャもあるわけですが、
引数のないものもあります。
引数とは関数に送る値のことです。
引数付きで値を変える関数の場合には、
引数を加工して値を返すのです。
送る値xも返す値yもないものまでなぜ関数と呼ぶのでしょうか。
それは、voidの意味を考えるとわかります。
これは「空」という意味です。
void型関数とは返す値が空である=返す値がないという意味です。
引数のないvoid型関数は関数に送る値もないし、
戻す値もないというわけです。
するとおまんじゅうの機械で比喩した関数のイメージからかなり遠くなります。
ですが、「空っぽ」も立派な値であると考えるのが、
プログラミングの面白いところです。
変数のところで文字型変数は""に初期化されており、
整数型変数は0に初期化されていると説明しました。
0の意味はそもそも何もないということでしたね。
何もないものも立派な量=0である、と考えることによって数学は著しく発展しました。
インド人が0を発見してくれなかったら、
現代の高等数学は存在していないわけです。
空っぽを0または""で、これも立派な値であるという考えがプログラミングの背景にあります。
空=何もないも立派な値と考えると、
関数は
①送る値と返す値があるタイプ
②送る値はなく=送る値が空っぽで、返す値のみがあるタイプ
③送る値のみがあり、返す値は空っぽ=返す値がないタイプ
④送る値も空っぽ=送る値がないし、返す値が空っぽ=返す値がないタイプ
の4つのタイプがあることになります。
サブプロシージャは③と④になりますし、
この後学ぶファンクションプロシージャは①と②に対応します。

ところで、さっきから返す値とか戻す値ととしきりに言っていますが、
返す相手、戻す相手は誰でしょうか。
これを明確にするために、
私は関数やプロシージャのことを社員と呼びます。
誰に返すのか。
誰に戻すのか。
それは仕事を依頼した社員に戻すのです。

仕事を依頼するはどういうことでしょうか。
皆さんは、すでにその場面を何回も見てきています。
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です。
依頼された仕事内容は、3行目から2000行目まで消去して、
A1を選択仕直すことです。

第1講の最終話において、
ボタンでマクロを実行させました。
そのコードは、
081
でした。この場合には、2人の社員がそれぞれ、
Module1.Macro1
Module1.Macro2
に仕事を依頼しています。

Private Sub CommandButton1_Click()       ・
       ・
End Sub
Private Sub CommandButton2_Click()
       ・
End Sub
の一つ一つがサブプロシージャなのですが、
私はそれを社員と呼びます。
なぜなら、上司や同僚に頼まれて仕事をするのが社員であり、
その点ではプロシージャもまったく変わらないからです。
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は何の値も返していません。
値を返していないは、何も報告していないと考えてください。
それに対して、ファンクションプロシージャという社員に対しては、
例えば、1から100までの和を調べて報告せよと、
などと要求します。
その報告が返す値ですし、
1や100が引数(送る値)です。
y=f(1,100)
などの形をとります。
このタイプのファンクションプロシージャは何から何までの和を求めているのかがわからなければ、
答えようがありませんね。
①送る値と返す値があるタイプ
なら関数と呼ぶのはわかります。
ですが、
Private Sub CommandButton1_Click()
  CommandButton2_Click
       ・
       ・
       ・
End Sub
Private Sub CommandButton2_Click()
  Rows("3:2000").Select
  Selection.ClearContents
  Cells(1, 1).Select
End Sub
のように送る値も返す値もない場合になぜ関数と呼ぶのでしょうか。
実は、CommandButton2_Click側は明確に答えを返しています。
それは、結果を報告しませんが、
仕事を遂行することです。
仕事が終了しましたとは報告しなくても、
仕事をやってくれたことは、
依頼した側に応答したことになります。
何も報告しない=返す値が空っぽのものまで関数と考えるのは充分な根拠があります。
今回は、仕事を依頼するときの引数(条件)がありませんが、
条件をつける必要がないからです。
なぜなら、CommandButton2_Clickの仕事は決まっていますから、
何の仕事をしてくれと頼む必要がないのです。
条件がない=空っぽでも大丈夫なのです。
それに対して、先のy=f(1,100)は1と100がないと、
頼まれた側は困ってしまいます。
この場合には、仕事の依頼内容を相手に伝える必要があります。
それが引数の役割です。
1から100まで足したらいくつになるのか調べてくれ、
という条件をつけて仕事を依頼するわけです。
以上の説明を聞くと、
①送る値と返す値があるタイプ
②送る値はなく=送る値が空っぽで、返す値のみがあるタイプ
③送る値のみがあり、返す値は空っぽ=返す値がないタイプ
④送る値も空っぽ=送る値がないし、返す値が空っぽ=返す値がないタイプ
のいずれも関数と呼ぶことに意味があるのだと言うことが少し納得していただけるのではないでしょうか。
もちろん、まだ具体例を示していませんので、
????状態だと思います。
第1講でそのときにわからなくても先まで読む必要があり、と言ったことを覚えていますか。
今は、わからなくても先まで読んでからここに戻って読み返せば、
今度は完全にわかりますよ。
推理小説と同じで、学問も先まで読まないとわからないものなのですよ。
ですから、そのときに投げ出してはだめなのです。
理解できなくても我慢して先まで読んで、
後で読み返すことを繰り返す以外に、
学問を修得する方法はないのです。
「学問に王道はない」とマルクスは言っています。
まさにこの通りですね。
ヘーゲルの精神現象学は、最初ちんぷんかんぷんでしたが、
何回も何回も読んでいく内に、
ヘーゲルの言いたいことがわかった体験は私にとって大変貴重な体験でした。

第2話からは、具体例に入りますよ。

第5講第9話へ 第2話へ


トップへ