[Excel で VBA] Sub プロシージャ



プロシージャ〜プログラムを複数のブロックに分ける

今まで何度もプログラムを書いてきたので気づいていると思うが、
Visual Basic ではプログラムの中身を以下のような「Sub 〜 End Sub」という構造の内部に記述する。

Sub 名前()
	処理内容
End Sub

このように、処理内容がひとまとめになっているものを Visual Basic では「プロシージャ」と呼ぶ。
プロシージャには Sub プロシージャと Function プロシージャがあるが、
上のものは Sub 〜 End Sub で囲われているので、Sub プロシージャである。

今回はこの Sub プロシージャについてもう少し詳しく学ぼう。

[プログラミングに興味のある学生向け]
Visual Basic におけるプロシージャ (procedure) は、他のプログラミング言語では
関数手続きと呼ばれることが多い。

名前はどうであれ、プロシージャのようにプログラムを複数の部分に分けるという手法は
プログラミングを行う上で必須の知識である。

さて、今までのところはSubプロシージャはプログラムを記述するための 枠組み、という程度のイメージしかないかも知れないが、
Subプロシージャの本来の役割は、プログラムをまとまった機能をもった部品に分割することである。

例えば、大きなプログラムを複数の部品に分割し、その部品をグループで手分けして開発する、
などという手法が実際の開発現場で行われている。

とはいえ、いきなり難しい例を取り扱うわけにもいかないので、シンプルな「プログラム中に2つのSubプロシージャがある例」から学ぶことにしよう。


プログラム中に2つのSubプロシージャがある例

それでは、「プログラム中に2つのSubプロシージャがある例」から学んで行こう。
最初に取り上げるプログラムは以下である。

このプログラムには「prog」という Sub プロシージャと「subtest」という Sub プロシージャの二つがあることをまず確認して欲しい。

Sub prog()
	subtest 

	MsgBox "メインのプロシージャを終了します"
End Sub

Sub subtest()
	MsgBox "subtestプロシージャを実行しました"
End Sub

上記のコピー可能なプログラムを Excel 上の VBA に貼り付けよう。

貼り付け後の状態が下図である。プロシージャの間にある横線は自動的に引かれる。



実行する前に、もう一つ確認して欲しいことがある。

prog プロシージャの中に、下図のように subtest と書かれた行があることである。
これは、自作の Sub プロシージャ 「subtest」を、 prog プロシージャから呼び出しているのである。
それにより、subtest プロシージャが実行される。

言い替えると、「自作の Sub プロシージャは、その名前を書くことで命令として実行することができる」のである。



以上を確認したら、実行してみよう。ただし、実行の際に注意すべきことがある。
下図のように、文字の書き始めであるカーソルを prog プロシージャ内に置いた状態で実行して欲しい。
これは、プログラム実行時に実行されるプロシージャを (subtest プロシージャではなく) prog プロシージャとするためである。



さて、正しく実行すると、下図のようにまず「subtestプロシージャを実行しました」という MsgBox が現れる。



そして、OKボタンをクリックすると、今度は「メインのプロシージャを終了します」という MsgBox が現れる。



何が起こったかわかるだろうか?

このプログラムにおける処理の流れを示したのが下図である。



まず、いつも通り prog プロシージャ内部から実行される。最初に実行されるのは subtest 命令である。
それにより、subtest プロシージャの実行に処理が移る (図の赤矢印) 。
subtest プロシージャでは「subtestプロシージャを実行しました」という MsgBox を表示する。
それが終わると、prog プロシージャの続きの処理に戻る (図の青矢印)。
それにより「メインのプロシージャを終了します」という MsgBox が現れるのである。

ここで注意すべきなのは、
複数のプロシージャがあるプログラムでは、プログラムは上から下へと実行されるとは限らない
ということである。

これまでのプログラムでは、If 文で処理が分岐したり For 文で同じ命令を繰り返すことがあったものの、
プログラムはおおむね上から下へと実行された。

一方、先程のプログラムでは、下にある「subtestプロシージャを実行しました」という MsgBox が
上にある「メインのプロシージャを終了します」という MsgBox よりも先に実行されている。
このようなことが頻繁に起こるのがプロシージャが複数あるプログラムの特徴である。

そのようなプログラムは、これまでのようにプログラムを上から順に読み進めるだけでは理解できない。
まずプログラム全体を見て、プロシージャがいくつあり、そのプロシージャ同士の関係はどうなっているか (呼び出す側はどちらか、など)
を把握するようにしなければならない。

すなわち、今後プログラムに対する新しい視点が必要になる、ということである。



←配列引数のある Sub プロシージャ→

Excel で学ぶ Visual Basic for Applications (VBA)に戻る