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

実行するとセルの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プロシージャ実行後の画像
(実行後)

実行すると、Functionプロシージャからの戻り値が、呼び出し元のSubプロシージャにおいて表示したメッセージボックスで表示されていることが確認できますね。

結論:SubとFunctionプロシージャの違い

ソースコードを読むことで、SubとFunctionプロシージャの違いがイメージできたのではないでしょうか。

実際にコーディング量が増えていくと、2つの違いを意識してコーディングすることができるようになります。

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

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

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

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

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

他のプログラム言語でも同じ考え方ができる重要なポイントなのですが、

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

その中で、金額計算など共通的な処理を1つのプロシージャとして作成しておくことで、

他のプロシージャから、呼び出すようなプログラム構造にすることで、

おなじコーディングを複数記述する必要がなくなり、効率的なマクロ作成が可能になるのです。

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

開発現場では・・・
大きな開発現場では、プログラムの機能分割、モジュール構造をあらかじめ
設計書に落とし込み、第三者チェック(設計書レビュ)を行ってから
プログラムの実装に着手することが多いです。
(プログラムを実装してからでは手戻りが大きくなるためです)

まとめ

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

いかがでしたでしょうか。

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


両者には、

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

この点が最も大きな違いです。

もうひとつ、イベントプロシージャという、ボタンをクリックしたときなど
あるイベントが発生したときに処理を行う際に使用するプロシージャがあります。

これについてはまた別の記事で紹介したいと思います。


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

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

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