Functionプロシージャーとユーザー定義関数

VBAFunctioneyecatch

FunctionプロシージャーはExcel VBAの学習を進める中で、絶対使いたいと思っている人が殆どだと思います。実務利用のVBAでも非常に有用なものです。
働き、使い方、ユーザー定義関数について説明します。

こんにちは、じゅんぱ店長(@junpa33)です。

エクセルVBAを勉強していると、Functionで始まるコード文のプログラムがあることに気づきます。

これは何かというと、

Functionプロシージャー」というものです。

どの様に働くのかというと、

与えられたデータ値に対してルール決めされた方法で加工処理して、その処理後データを依頼元に返すという働きをします。

Functionプロシージャーの働き

VBAFunctionp006

「Function」とはGoogle翻訳によると、「機能」「働き」「関数」ということになります。

すでに内容を言い当てています。

全体の中の「機能の一部分」ということになります。

Functionプロシージャーの位置づけ

プログラムは長く大きくなればなるほど、実行コードの部品化が重要になってきます。

一つのプログラムの中で、同様な処理を毎回その都度コード化していては、長大なプログラムになってしまいます。

そこで、部分加工の専用工場(Functionプロシージャー)を作り、同一ルールで処理できるように仕組むことで、

プログラムコード全体(Subプロシージャー)を簡潔に記述し、また読みやすいものにしてゆくということです。

Functionプロシージャーの構文

Functionプロシージャーの構文としては次のようになります。

Functionプロシージャーの構文

[ Private / Public ( Static ) ] Function プロシージャー名 ( 引数リスト ) As データ型

   –VBAのコード–

    ・・・・・・・

    プロシージャー名 = 戻り値

End Function

頭に、「Private」「Public」さらに「Static」を付加することが出来ます。もちろん何もしなくてもいいです。

  •  「Private」を頭に付けると、同一モジュール内のプロシージャーからのみ呼び出すことが可能です。
  •  「Public」を頭に付けると、他のすべてのモジュールからも呼び出すことが可能です。
  •  「どちらも」つけない場合(こちらが多い)「Public」を指定したとみなされます。
  • 「Static」を間に付加すると、プロシージャー内で使われている変数の値が保存され、次にこのプロシージャーが呼び出されたときには、保存値が初期値として扱われます。

Functionプロシージャーの使い方の例

VBAFunctionp007

Functionプロシージャーの使い方としては、使用場面として、

があります。

VBAプログラムの中のFunctionプロシージャー

Functionプロシージャーは、

呼び出したSubプロシージャーに対して値を返すことが出来ます。

今回のサンプルは、定価に対して設定した値引率を商品毎に呼び出し、売値を計算します。

同じ結果になりますが、

の記述の違いを例示します。

VBAFunction001
VBAFunction002

引数を設定しない場合

( 引数リスト ) のところは ( ) 括弧のみになります。

値引率(MyPar)の計算部分をFunctionプロシージャーに投げています。

VBA
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
VBA
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コードの参考にしていただける記事です。

fornextirekoeyecatch For~Nextのループと入れ子構造をVBA最速理解 vbaroundeyecatch Round関数の罠。VBAで数値を四捨五入する時の注意点 vbaselectcaseeyecatch Select Case 条件分岐の使い方。ステートメントの基本

引数を設定する場合

( 引数リスト ) のところを記述します。

値引率(MyParb)の計算部分と売値(MyPriceb)の計算部分を、

それぞれ別のFunctionプロシージャーに投げています。

親プロシージャー

VBA
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

子プロシージャー(MyParb)

引数を1つ持つプロシージャーになります。
引数は「定価」の値

VBA
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

子プロシージャー(MyPriceb)

引数を2つ持つプロシージャーになります。
引数は「定価」と「値引率」の値

VBA
Function MyPriceb(pri As Long, 率 As Double) As Long
    pri = WorksheetFunction.Round(pri * 率, 0)
    MyPriceb = pri
End Function

ユーザー定義関数を作る

先の例題をユーザー定義関数で対応してみます。

ユーザー定義関数を設定する方法は、

利用するWorkbook(エクセルブック)のVBE標準モジュールに、

Functionプロシージャーを記述するだけ、それだけです。

実行方法は、ユーザー定義関数ですので、コードの実行はワークシート上で行うことになります。

VBAFunction005

ユーザー定義関数名  [ =L値引率(定価)]

先の例示で言うと「子プロシージャー(MyParb)」に当たる部分になります。
関数で「定価」のセルを指定して「値引率」列のセルに答えを表示します。

VBAFunction003
VBA
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)」に当たる部分になります。
関数で「定価」のセルを指定すると、その定価が「値引率」を引き出して、四捨五入計算を行い「売値」列のセルに答えを表示します。

VBAFunction004
VBA
Function L売値(定価)
    L売値 = WorksheetFunction.Round(定価.Value * 定価.Offset(, 1).Value, 0)
End Function

(.valueは省略可能です。)

ここの説明で出てくるVBAコードの参考にしていただける記事です。

vbaoffseteyecatch Offsetプロパティは指定範囲を移動させる

Functionプロシージャーの働きのまとめ

VBAFunctionp008

Functionプロシージャーは奥が深いです。

全部を知ろうとしても、ぶっちゃけ、実務的にあまり意味がありません。

必要部分、実務での利用部分に合わせて勉強しましょう。

必要に応じて学習を深めていきましょう。

この記事で説明したことが、(自分的には)まずは必要部分かなと考えます。

エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。

vbastudyeyecatch2 エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です

今回の記事はここまでです。   最後までご覧いただき有難うございました。

エクセルVBA最速理解で必要な知識を集めよう!

エクセルVBA業務ツールで日常の業務改善を行いましょう。

VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。

アンケートでポイ活しよう!!

アンケートに答えれば答えるほど ”使える” ポイントがたまります。

NTTコム サーチ

af_banner01

Dstyle web

dstyleweb_logo
dstyle_320x50-min