Junchi Lab

トップ > Excelマクロ > 2-7 お会計(関数を作る)

2-7 お会計(関数を作る)


【今回できるようになること】

・Functionプロシージャについて知る


こんにちはー!!
今回の内容を学べば、作業に合わせてExcelの関数を自由に作れるようになります!
「自分で関数作るから大丈夫(どや)」って言ってみたいですよね?笑
それではやっていきましょう!


vba1_4_1


さて今回の例です。
下の表のG列「合計金額[円]」に、各商品の合計金額を入力します。
しかし、商品は量り売りと定額のものが混在しています。
皆さんならどのように計算しますか?


vba2_7_1


マクロを知らなくても、IFS関数を使って出来なくもない内容ですね。
しかし、この作業が毎日行う作業の場合、毎回IFS関数を入力して計算するのは少し面倒です。
そこで今回は、この作業のために最適化されたオリジナルの関数を作ります。


それでは、VBEを開いて標準モジュールを追加し、メモ帳みたいなものの「Option Explicit」以下に、下のコードを書いてみましょう!

1-4 マクロを動かす 参照

vba2_7_2


いままでは、「Sub」から始まるSubプロシージャを使っていましたが、
今回新たに、「Function」から始まるFunctionプロシージャを使いました。

イメージとしては、
Subプロシージャは、一連の処理をひとまとめにしたワンセットでした。

2-6 当番表の作成(Mod関数他) 参照


これに対して、Functionプロシージャは、
引数(値)を受け取って、処理をした結果を戻り値として返す変換器のイメージになります。


vba2_7_3


それではExcelの画面にもどって、普通の関数を入力するように、
先ほど作った関数を「=Func1」で呼び出してみましょう!


vba2_7_4


先ほど作ったオリジナルの関数「Func1」が、Excelの関数のように出てきましたか?

あとは、引数として指定した5つを、カッコ()の中にカンマ,で区切って配置して完了です!


vba2_7_5


ちなみに、もう一度コードのIf構文を見てください。

Excel画面の11行目のように、会計方式が量り売りでも定額でもなかった場合に、
きちんと日本語でエラーメッセージが出るようになっています。

Excel関数だと「#DIV/0!」など、よく分からないエラーメッセージが表示される場合があるので、
IF ERROR関数などで別途対応する必要があります。

しかし、VBAで作る関数なら、エラー対応も含めて1つの関数にまとめることができます。


vba2_7_6


さて、ここまで、FunctionプロシージャをExcelの関数として使用する方法を見てきました。

しかし、Subプロシージャのときと同じように、
Functionプロシージャも他のプロシージャから呼び出すことができます。

下のコードを見てください。


vba2_7_7


これは、先ほどのコードにおいて、小計を計算する部分を別のFunctionプロシージャに分けたものです。

下にある「Calc1」「Calc2」が、それぞれ必要な値を引数として受け取り、
戻り値として小計を返すFunctionプロシージャです。

そして、もともとあった「Func1」の、「Calc1(単価,重さ)」「Calc1(単価,重さ)」
の部分で、それぞれのFunctionプロシージャを呼び出しています。

ここで、Subプロシージャは「Call プロシージャ名()」という1行の命令として呼び出されていましたが、
Functionプロシージャは、変数と同じように数式の一部として使われるということに注意してください。

例えば上の例では、「Calc1(単価,重さ)」の部分が、Calc1の戻り値が代入される変数のように機能しています。

今回の内容は以上です!ありがとうございました!!


vba2_1_7

【今回のまとめ】

・Functionプロシージャは、引数を受け取って戻り値を返す
・Functionプロシージャは、Excel画面から関数として使える
・Functionプロシージャをプログラムで呼び出す際は、
 「プロシージャ名(引数)」という形の変数として記述する


前回 2-6 当番表の作成(Mod関数他)
Excelマクロに戻る