FunctionプロシージャーはExcel VBAの学習を進める中で、絶対使いたいと思っている人が殆どだと思います。実務利用のVBAでも非常に有用なものです。
働き、使い方、ユーザー定義関数について説明します。
こんにちは、じゅんぱ店長(@junpa33)です。
エクセルVBAを勉強していると、Functionで始まるコード文のプログラムがあることに気づきます。
これは何かというと、
「Functionプロシージャー」というものです。
どの様に働くのかというと、
与えられたデータ値に対してルール決めされた方法で加工処理して、その処理後データを依頼元に返すという働きをします。
コンテンツ
Functionプロシージャーの働き
「Function」とはGoogle翻訳によると、「機能」「働き」「関数」ということになります。
すでに内容を言い当てています。
全体の中の「機能の一部分」ということになります。
Functionプロシージャーの位置づけ
プログラムは長く大きくなればなるほど、実行コードの部品化が重要になってきます。
一つのプログラムの中で、同様な処理を毎回その都度コード化していては、長大なプログラムになってしまいます。
そこで、部分加工の専用工場(Functionプロシージャー)を作り、同一ルールで処理できるように仕組むことで、
プログラムコード全体(Subプロシージャー)を簡潔に記述し、また読みやすいものにしてゆくということです。
Functionプロシージャーの構文
Functionプロシージャーの構文としては次のようになります。
[ Private / Public ( Static ) ] Function プロシージャー名 ( 引数リスト ) As データ型
–VBAのコード–
・・・・・・・
プロシージャー名 = 戻り値
End Function
頭に、「Private」「Public」さらに「Static」を付加することが出来ます。もちろん何もしなくてもいいです。
- 「Private」を頭に付けると、同一モジュール内のプロシージャーからのみ呼び出すことが可能です。
- 「Public」を頭に付けると、他のすべてのモジュールからも呼び出すことが可能です。
- 「どちらも」つけない場合(こちらが多い)「Public」を指定したとみなされます。
- 「Static」を間に付加すると、プロシージャー内で使われている変数の値が保存され、次にこのプロシージャーが呼び出されたときには、保存値が初期値として扱われます。
Functionプロシージャーの使い方の例
Functionプロシージャーの使い方としては、使用場面として、
があります。
VBAプログラムの中のFunctionプロシージャー
Functionプロシージャーは、
呼び出したSubプロシージャーに対して値を返すことが出来ます。
今回のサンプルは、定価に対して設定した値引率を商品毎に呼び出し、売値を計算します。
同じ結果になりますが、
の記述の違いを例示します。
( 引数リスト ) のところは ( ) 括弧のみになります。
値引率(MyPar)の計算部分をFunctionプロシージャーに投げています。
Sub Function引数なし()
Dim MyPrice, i As Long
For i = 4 To 11
Cells(i, 3).Select
Cells(i, 4) = MyPar
MyPrice = WorksheetFunction.Round(Cells(i, 3).Value * MyPar, 0)
Cells(i, 5) = MyPrice
Next i
End Sub
Function MyPar() As Double
Select Case ActiveCell.Value
Case Is >= 1000
MyPar = 0.9
Case Is >= 900
MyPar = 0.92
Case Is >= 700
MyPar = 0.95
Case Is >= 500
MyPar = 0.97
Case Else
MyPar = 1
End Select
End Function
ここの説明で出てくるVBAコードの参考にしていただける記事です。
( 引数リスト ) のところを記述します。
値引率(MyParb)の計算部分と売値(MyPriceb)の計算部分を、
それぞれ別のFunctionプロシージャーに投げています。
Sub Function引数あり()
Dim i As Long
For i = 4 To 11
Cells(i, 3).Select
Cells(i, 4) = MyParb(Cells(i, 3).Value)
Cells(i, 5) = MyPriceb(Cells(i, 3).Value, Cells(i, 4))
Next i
End Sub
引数を1つ持つプロシージャーになります。
引数は「定価」の値
Function MyParb(par As Double) As Double
Select Case ActiveCell.Value
Case Is >= 1000
par = 0.9
Case Is >= 900
par = 0.92
Case Is >= 700
par = 0.95
Case Is >= 500
par = 0.97
Case Else
par = 1
End Select
MyParb = par
End Function
引数を2つ持つプロシージャーになります。
引数は「定価」と「値引率」の値
Function MyPriceb(pri As Long, 率 As Double) As Long
pri = WorksheetFunction.Round(pri * 率, 0)
MyPriceb = pri
End Function
ユーザー定義関数を作る
先の例題をユーザー定義関数で対応してみます。
ユーザー定義関数を設定する方法は、
利用するWorkbook(エクセルブック)のVBE標準モジュールに、
Functionプロシージャーを記述するだけ、それだけです。
実行方法は、ユーザー定義関数ですので、コードの実行はワークシート上で行うことになります。
ユーザー定義関数名 [ =L値引率(定価)]
先の例示で言うと「子プロシージャー(MyParb)」に当たる部分になります。
関数で「定価」のセルを指定して「値引率」列のセルに答えを表示します。
Function L値引率(定価)
Dim par As Double
Select Case 定価.Value
Case Is >= 1000
par = 0.9
Case Is >= 900
par = 0.92
Case Is >= 700
par = 0.95
Case Is >= 500
par = 0.97
Case Else
par = 1
End Select
L値引率 = par
End Function
ユーザー定義関数名 [ =L売値(定価)]
先の例示で言うと「子プロシージャー(MyPriceb)」に当たる部分になります。
関数で「定価」のセルを指定すると、その定価が「値引率」を引き出して、四捨五入計算を行い「売値」列のセルに答えを表示します。
Function L売値(定価)
L売値 = WorksheetFunction.Round(定価.Value * 定価.Offset(, 1).Value, 0)
End Function
(.valueは省略可能です。)
ここの説明で出てくるVBAコードの参考にしていただける記事です。
Functionプロシージャーの働きのまとめ
Functionプロシージャーは奥が深いです。
全部を知ろうとしても、ぶっちゃけ、実務的にあまり意味がありません。
必要部分、実務での利用部分に合わせて勉強しましょう。
必要に応じて学習を深めていきましょう。
この記事で説明したことが、(自分的には)まずは必要部分かなと考えます。
エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。
エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です今回の記事はここまでです。 最後までご覧いただき有難うございました。
<記事内容についての告知>
VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。
アンケートでポイ活しよう!!
アンケートに答えれば答えるほど ”使える” ポイントがたまります。