VBAにおいて、プログラムを構成する要素が「プロシージャ」と「ステートメント」です。いろいろと新しい言葉が出てきてちょっとややこしいですが、単に言葉の問題なので難しく捉える必要はありません!
プロシージャとは?
プロシージャとは、VBAにおいて一まとまりの処理を表わす単位です。プロシージャには英語で「手続き」や「手順書」の意味があります。
VBAにおいて「プログラムを実行する」と言う時、任意の一つのプロシージャを実行することになります。マクロの説明で、マクロは手順書のようなものだという説明をしましたが、マクロの実体もこのプロシージャです。
プロシージャは機能ごとに分けるのが基本
プログラムのソースコードには、いろいろな内容が書かれています。プログラムの内容を一つのまとまりで管理するのは大変なので、処理や機能ごとにまとめて分けておこう!というのがプログラミングの基本的な考え方です。そのため、一つのプログラムの中にに複数のプロシージャがあるのが普通です。
もっと具体的に言うと、実行される対象としてのプロシージャが一つ、その他のユーティリティー的な役割を請け負うプロシージャが複数あるのが一般的なVBAプログラムの構成です。ユーティリティー的な役割を請け負うプロシージャは、他のプロシージャから必要に応じて呼び出されます。
「プロシージャ」「サブルーチン」「関数」の違い
プログラミングの解説書の中では、プロシージャのことをサブルーチン(Subroutin)と言い表している解説書もあります。似たような言葉があると混乱しますね。
サブルーチンとは、「一般的なプログラミング言語」における一まとまりの処理を表わす概念です。対してプロシージャは、「VBA(VB)」における一まとまりの処理を表わす概念です。つまり一般的なプログラミングにまで意味を広げた言い回しがサブルーチン、VBA(VB)限定の言葉がプロシージャです。サブルーチンとプロシージャは、同じことを別の言葉で言い表しているだけに過ぎません。
また、プロシージャとサブルーチンと似たような意味で、関数という言葉も使われています。関数はその時の文脈によって様々な意味で用いられます。
VBAで関数という場合、VBAの「組み込み関数」のことを表わすのが一般的です。ちなみにExcelのワークシート関数とVBAの組み込み関数は別物です。同じような言葉がたくさん出てきて混乱しますが、最初に言葉の意味を整理してしまうと後々困りません。
プロシージャの種類(SubプロシージャとFunctionプロシージャ)
プロシージャには、SubプロシージャとFunctionプロシージャの2種類があります。処理を実行する単位という点では同じですが、値を返すことができるかできないかという点が違います。もっと複雑な、値を渡すことのできるプロシージャについても今後触れる予定です。
- Subプロシージャ→値を返すことができないプロシージャ
- Functionプロシージャ→値を返すことができるプロシージャ
値を返すことができる、とはどういうことでしょうか。つまりプロシージャ内で実行した処理の「結果」を、呼び出し側に返すことができるかという意味です。
プロシージャの記述例
プロシージャの記述例を見てみましょう。プロシージャの記述例は以下の通りです。下の例の場合、SubプロシージャとFunctionプロシージャでやっている内容は全く同じです。
【Subプロシージャの例】
1 2 3 |
Sub 現在時刻() Debug.Print Now End sub |
【Functionプロシージャの例】
1 2 3 |
Function 現在時刻() Debug.print Now End Function |
この例ではステートメントは一行ですが、ステートメントは複数行になっても構いません。というかステートメントが一行だけのプロシージャというのはあまり多くなく、プロシージャが複数行の場合がほとんどです。
プロシージャには、一意に区別ができる「名前」をつける必要があります。上の例では「現在時刻」という名前をつけています。基本的にはアルファベットのプロシージャ名をつけることが多いですが、日本語も使用することができます。プロシージャ名には目的をわかりやすくした名前をつけたほうが、後々のメンテナンス性がよくなります。
プロシージャの呼び出し方(call)
他のプロシージャから、他のプロシージャを呼び出すことも可能です。Subプロシージャの中から、他のプロシージャを呼び出してみましょう。
1 2 3 4 5 6 7 |
Sub 現在時刻() Call CurrentTime End Sub Sub CurrentTime() Debug.Print Now End Sub |
現在時刻Subプロシージャの中から、CurrentTimeサブプロシージャを呼び出しています。callの後にプロシージャ名をつけることで、他のプロシージャを呼び出しています。
もちろんこの現在時刻を表示する例は2つのSubプロシージャに分ける意味はなく、1つのSubプロシージャで実行することが普通でしょう。あくまでも例としてなので(苦しい言い訳)ご了承ください。
なお、callは省略することができます。
1 2 3 4 5 6 7 |
Sub 現在時刻() CurrentTime End Sub Sub CurrentTime() Debug.Print Now End Sub |
callを省略する書き方も多いですが、呼び出しているという関係がわかりやすくなるので、個人的にはcallをつけるようにしています。
ステートメントとは?
ステートメントとは、VBAにおける一つの命令単位です。プロシージャの中に複数のステートメントを記述していくのが、VBAプログラミングの基本的なスタイルです。プロシージャを実行すると、上から順番にステートメントはが実行されます。