【VBA】SubとFunctionプロシージャの違いって何?

  • URLをコピーしました!

エクセルでVBAを使ってプログラムを作成する場合、「プロシージャ」と呼ばれる一連の動作をまとめた単位で作成していきます。

プロシージャには、SubプロシージャやFunctionと言うプロシージャが用意されています。

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プロシージャ実行前の画像
(実行前)

実行すると
①Sub シートの初期化()プロシージャにより、シートが初期化され
②データ編集()プロシージャにより、セルのA列に曜日が編集されました。

Subプロシージャ実行後の画像
(実行後)

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プロシージャを呼び出して実行してみましょう。

Functionプロシージャ実行後の画像
(実行後)

SubプロシージャとFunctionプロシージャの使い分け

実行すると、Functionプロシージャからの戻り値(今回の事例の場合、”function1の戻り値”という文字列)が、呼び出し元で表示したメッセージボックスで表示されていることが確認できますね。

SubプロシージャとFunctionプロシージャの違い
・Subプロシージャ:呼び出し元へ「戻り値」を返さない。
・Functionプロシージャ:呼び出し元へ「戻り値」を返却することが可能。

プロシージャの共有について

VBAのプログラムは、プロシージャの中にソースコードを記述します。

VBAを実行するときに、基本となる処理単位がSubプロシージャとなります。

記述されたプロシージャは、プロシージャの中から別のプロシージャを呼び出すことも可能です。

複数のマクロ処理を記述している中で、いくつかのプロシージャがあったとします。

例えば、金額計算処理など、同じ処理を何度もコーディングが必要な場合は、1つのプロシージャとして作成しておきます。(下記図の④)

そして、他のプロシージャから④のプロシージャを呼び出すことで、同じ金額計算処理のコードを何度も記述する必要がなくなり、効率的なマクロ作成が可能になります。

プロシージャの共通化・概念図

まとめ

SubプロシージャとFunctionプロシージャのまとめの画像

VBAの処理単位であるプロシージャには、SubプロシージャとFunctionプロシージャがあり、

両者は、以下の点で違いがあります。

  • Subプロシージャ:呼び出し元へ「戻り値」を返さない。
  • Functionプロシージャ:呼び出し元へ「戻り値」を返却することが可能。

最後までお読みいただきありがとうございました。

この記事が気に入ったら
いいねしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次