目次
Functionプロシージャ
こんにちは。伊川(@naonaoke)です。
今回は、Functionプロシージャについて説明をします。
プロシージャ(procedure)とは、複数の処理をまとめたプログラムの単位のことです。
その前に伊川の動画で紹介したプロシージャを説明します。
プロシージャの種類
・Subプロシージャ
今まで、伊川が紹介してきたコードは、ほとんどが、Subプロシージャになります。
コードを見ていただくと分かると思いますが、処理を単位ごとに行います。
重要なのは、上から下へ向かって順に処理を実行します。
Subプロシージャは戻り値を返すことができません。
・Functionプロシージャ
伊川はこの、Functionプロシージャはあまり使っていませんでした。
知らなくても、VBAを動かすことができるからです。
Subプロシージャとの最大の違いは戻り値を返すことができます。
また、自作の関数をつくることもできます。
・イベントプロシージャ
イベントプロシージャは、イベント(出来事)が起こったことをキッカケに、システム(コンピューター)が、自動的に呼び出すプロシージャです。これが最大の特徴です。
FunctionプロシージャやSubプロシージャは、呼び出すキッカケを作らないと実行できないのに対し、イベントプロシージャは自動的に呼び出されます。
この記事に、Worksheet_SelectionChangeの記載があります。
どこか、セルをクリックしたら、クイズ開始となるようにしています。
問題提起

回答
Functionプロシージャは、出前と理屈が同じ。
Subプロシージャは、出向いてラーメンを食べるのと理屈が同じ
VBAのコードから考える
セルA2の文字数が、7桁であれば、郵便番号ですとメッセージを表示させます
セルA2の文字数が、7桁以外であれば、郵便番号ではありませんとメッセージを表示させます。
Subプロシージャで実行する場合
1 2 3 4 5 6 7 8 9 10 11 |
Sub test1() If Len(Range("A2")) <> 7 Then MsgBox "郵便番号ではありません" Else MsgBox "郵便番号です" End If End Sub |
Functionプロシージャで実行する場合
1 2 3 4 5 |
Sub test2() 郵便番号判定 End Sub |
WorkSheet1のVBAエディタに、上記のコードを記載します。
1 2 3 4 5 6 7 8 9 |
Function 郵便番号判定() If Len(Range("A2")) <> 7 Then MsgBox "郵便番号ではありません" Else MsgBox "郵便番号です" End If End Function |
標準モジュールに、上記のコードを記載します。
郵便番号判定というのが、Subプロシージャで呼び出されて、処理を実行します。
ラーメンを食べるという場合で考えてみる
ラーメンを出前する場合
ラーメンの出前ならこのような流れでしょうか。
ラーメン店に食事に行く場合
ラーメン屋へ外食に行くならこのような流れでしょうか。
結果
結果は、どちらも満腹になります。
でも、その過程が違っています。
このラーメンを出前してとお願いする呼出(Function)に対して、
ラーメンを持ってくる(出前する)という戻り値(ラーメン)がある訳です。
FunctionプロシージャをGoogleで検索すると、税金が絡む
なぜ、Functionプロシージャのときは、税金の話がからむのでしょうか?
それは、Functionプロシージャの税金の部分だけを変更するだけで、終了するからです。
つまり、すべてのコードを変更する必要がありません。
ここがメリットなのです。
システムを作成場合は、メンテナンスも考えないと、後々、とんでもないことが発生します。
税金のサンプル
C列に税込後の金額を表示したいと思います。
1 2 3 4 5 6 7 8 9 |
Sub 計算() Dim i As Integer For i = 2 To 11 Cells(i, 3) = zeikomi(Cells(i, 2)) Next i End Sub |
・上記がWorkSheet2に記載しているコードです。
1 2 3 4 5 6 |
Function zeikomi(ByVal kakaku As Long) As Long Const zei As Currency = 1.1 zeikomi = kakaku * zei End Function |
・上記が標準モジュールに記載しているコードです。
計算が完了しました。
まとめ
Functionプロシージャは、最初は、分からないというより、イメージがつきません。
しかし、後々のメンテナンスを考えるとこちらのほうが、断然便利です。
また、他の方法で呼び出す方法もありますが、それはまた次回にします。