【連載】#03-02 VBA のSubプロシージャと関数(Functionプロシージャ)の違いとは?

【連載】#03-02 VBA のSubプロシージャと関数(Functionプロシージャ)の違いとは?
【連載】#03-01 VBA のSubプロシージャとは? 関数(Functionプロシージャ)とは?

この記事では Microsoft Access VBA の中に登場する Subプロシージャ、関数(Functionプロシージャ)の違いについて詳しく紹介します。

【連載】#03-02 VBA のSubプロシージャと関数(Functionプロシージャ)の違いとは?
しらかば堂

いつも記事を読んで頂きありがとうございます~
今日の調子はいかがですか?

Sub プロシージャ と 関数  ( Functionプロシージャ)の違い

前回

  • Sub プロシージャ は VBE のマクロ画面から呼び出せる
  • Function(関数) は VBE のマクロ画面から呼び出せない

とご紹介しました。

これはどういうことでしょうか?

前回のサンプルプログラムをもう一度のせますね。


Sub access_vba_sample_03_01()

MsgBox "早く家に帰りたい!"

End Sub


Sub access_vba_sample_03_02()

MsgBox "早くコロナが収束してほしい!"

End Sub


Function Access_VBA_Sample() As Integer

MsgBox "友達とお茶したい!"

Call access_vba_sample_03_02()

Access_VBA_Sample = 0

End Function

 Function(関数) の定義行(ステートメント)の後ろには As Integer という記述があります。これは「整数として」という意味です。

そして End Function 行(ステートメント) の前にこの関数の名前と同じ名前を使った
 Access_VBA_Sample = 0
という行(ステートメント)がありますが、これは Access_VBA_Sample
「整数として」戻り値 を設定しているという意味です。

つまり Sub プロシージャ  Function(関数) の違いは以下のように戻り値の有無なんです。そして戻り値の型を定義するためにFunction(関数) の定義行(ステートメント)の後ろには As Integer という記述が必要になっています。

  • Sub プロシージャ :戻り値なし
  • Function(関数)   :戻り値あり、戻り値の型指定が必要

この仕組みを使ってあなたは VBA に予め準備された組み込み関数に加え自分専用の関数を自由に定義することができます。

この 関数 VBA の中では例えば
Dim y As Integer
・・・
y = Access_VBA_Sample()
・・・​
のように呼び出します。

従って前回紹介した

  • Sub プロシージャ は VBE のマクロ画面 から呼び出せる
  • Function(関数) は VBE のマクロ画面 から呼び出せない

という事実は

VBE のマクロ 画面 は戻り値を表現するように設計されていないためと考えられます。

同様に

Sub access_vba_sample_02_01()

MsgBox "早く家に帰りたい!"

End Sub

に入力パラメータ msg As String(msg という変数を文字列として)を追加し

Sub access_vba_sample_02_01(msg As String)

MsgBox msg

End Sub

というように変更して先頭行にアイコンをおいて 実行ボタンをクリックしたときも VBE の マクロ 画面に access_vba_sample_02_01 は現れません。

つまりVBE のマクロ 画面入出力パラメータを表現するように設計されていないようです。
これは皆さん自身でも確認してくださいね。

一方プログラムは一般にそのステートメントの順番を意識的に変更しない限り上から下へ順番に実行されます。

この  Access_VBA_Sample 関数の定義の中で
 MsgBox “友達とお茶したい!”
を実行した後に
Call access_vba_sample_03_02()


という行(ステートメント)がありますが、これは access_vba_sample_03_02 という Sub プロシージャ を呼び出すという意味です。

前回の記事の動画

で Access_VBA_Sample 関数の部分にカーソルをあてて実行 ボタンをクリックしたとき

友達とお茶したい!” というダイアログボックスの後に
早くコロナが収束してほしい!” というダイアログボックス
現われましたよね。

それは  Access_VBA_Sample 関数の中で
 MsgBox “友達とお茶したい!”
を実行した後に

Call access_vba_sample_03_02()
を実行したので access_vba_sample_03_02 を呼び出して
 MsgBox “早くコロナが収束してほしい!”
が実行されたということなんです。

マクロ から 関数 を呼び出す

さてこの記事全体の目標は

  • 今の状況から抜け出してもっと前向きな仕事に取り組みたい
  • さっさと仕事を切り上げて充実したアフターファイブを過ごしたい

でしたよね。

この目標達成のために前回作成されデスクトップに保存された

【連載】#03-02 VBA のSubプロシージャと関数(Functionプロシージャ)の違いとは?

03_01.accdb を少し変更し、04_01.accdb を作成します。

この 04_01.accdb をダブルクリックすることで何が起きるか確認してくださいね。

見づらいときは画面をフルスクリーンにすることをお勧めします。

まとめ

いかがでしたか?

今回 Sub プロシージャ  Function(関数) の違いは以下のように戻り値の有無であること。

  • Sub プロシージャ :戻り値なし
  • Function(関数)   :戻り値あり、戻り値の型指定が必要

関数 の仕組みを使って VBA に予め準備された組み込み関数に加え自分専用の関数を新たに定義できること。

Access VBA の 関数 には何やら別の呼び出し方があるらしいこと。を確認しました。

次回はまた

【連載】#04 Access のテーブル クエリ フォーム マクロ とよく使う画面をおぼえよう

Access VBA の次の扉を開けましょう。

さらに違う世界が見えてくるはずです。


Microsoft Access 関連教材は次のリンクからどうぞ。

Access VBA 関連教材の紹介