エクセルでVBAを使ってプログラムを作成する場合、「プロシージャ」と呼ばれる一連の動作をまとめた単位で作成していきます。
プロシージャには、SubプロシージャやFunctionと言うプロシージャが用意されています。
SubプロシージャとFunctionプロシージャは、ほとんど同じ動きをしてくれるためよく似ています。
この記事では、SubプロシージャとFunctionプロシージャの使い方、使い分けについて解説していきます。
・SubとFunctionプロシージャの違い
・プロシージャの構造化、共有の概念
SubとFunctionプロシージャの使い方
ずばり、SubプロシージャとFunctionプロシージャの違いは以下の点にあります。
- Subプロシージャ:呼び出し元へ「戻り値」を返さない。
- Functionプロシージャ:呼び出し元へ「戻り値」を返却することが可能。
実際に、ソースコードを読むことで理解が深まります。
それでは具体的に簡単なソースコードでSubプロシージャとFunctionプロシージャの違いを見てみましょう。
Subプロシージャのサンプル事例
メインというSubプロシージャから、2つのプロシージャ(①シートの初期化、②データ編集)を呼び出しています。
呼び出された「シートの初期化」、「データ編集」のSubプロシージャはプロシージャ内の一連の手続きを実行して、呼び出し元の「メイン」プロシージャへ制御を戻します。
Sub メイン()
Call シートの初期化
Call データ編集
End Sub
Sub シートの初期化()
Worksheets("sheet1").Cells.ClearContents
End Sub
Sub データ編集()
Worksheets("sheet1").Cells(1, 1) = "月曜日"
Worksheets("sheet1").Cells(2, 1) = "火曜日"
Worksheets("sheet1").Cells(3, 1) = "水曜日"
Worksheets("sheet1").Cells(4, 1) = "木曜日"
Worksheets("sheet1").Cells(5, 1) = "金曜日"
Worksheets("sheet1").Cells(6, 1) = "土曜日"
Worksheets("sheet1").Cells(7, 1) = "日曜日"
End Sub
では、Subプロシージャを実行してみましょう。
実行前は1行目と3行目に日本語が表記されています。
実行すると
①Sub シートの初期化()プロシージャにより、シートが初期化され
②データ編集()プロシージャにより、セルのA列に曜日が編集されました。
↓
Functionプロシージャのサンプル事例
sample_funcというSubプロシージャから、Functionプロシージャ(function1)を呼び出しています。
呼び出されたfuinction1は、”function1の戻り値” という文字列を呼び出し元のsample_funcプロシージャへ返却します。
そして、呼び出し元のsample_funcは、function1を返却された文字列を自Subプロシージャ内で使用することが可能になります。
今回は、返却された文字列をメッセージボックスで表示しています。
Sub sample_func()
Dim ret1 As String
ret1 = function1
MsgBox ret1
End Sub
Function function1()
function1 = "function1の戻り値"
End Function
では、SubプロシージャからFunctionbプロシージャを呼び出して実行してみましょう。
SubプロシージャとFunctionプロシージャの使い分け
実行すると、Functionプロシージャからの戻り値(今回の事例の場合、”function1の戻り値”という文字列)が、呼び出し元で表示したメッセージボックスで表示されていることが確認できますね。
プロシージャの共有について
VBAのプログラムは、プロシージャの中にソースコードを記述します。
VBAを実行するときに、基本となる処理単位がSubプロシージャとなります。
記述されたプロシージャは、プロシージャの中から別のプロシージャを呼び出すことも可能です。
複数のマクロ処理を記述している中で、いくつかのプロシージャがあったとします。
例えば、金額計算処理など、同じ処理を何度もコーディングが必要な場合は、1つのプロシージャとして作成しておきます。(下記図の④)
そして、他のプロシージャから④のプロシージャを呼び出すことで、同じ金額計算処理のコードを何度も記述する必要がなくなり、効率的なマクロ作成が可能になります。
まとめ
VBAの処理単位であるプロシージャには、SubプロシージャとFunctionプロシージャがあり、
両者は、以下の点で違いがあります。
- Subプロシージャ:呼び出し元へ「戻り値」を返さない。
- Functionプロシージャ:呼び出し元へ「戻り値」を返却することが可能。
最後までお読みいただきありがとうございました。