Excel VBA Functionプロシージャを使ってみよう

スポンサーリンク

そういえば Functionプロシージャについて、まだ解説していませんでした。

くるみこ
くるみこ

今までの記事内で、すでに何カ所か Functionプロシージャを使ったコーディングをしていましたが、解説をサラッと流していました。ここでしっかりと解説したいと思います(^^;

はい。「セルの書式を他のセル範囲に適用する汎用ツール」でセルの書式を取得する関数として使っていました。解説よろしくお願いします(^^;

【この記事でわかること
・FunctionステートメントとFunctionプロシージャとは何かがわかります
・Functionプロシージャの使い方がわかります

前回記事のおさらいは、下のカードをクリックすれば開きます(^^ゞ

くるみこ
くるみこ

前回記事は、テーブル集計行の操作方法と活用方法に関する解説記事でした。覗いてみてね(^^)/

スポンサーリンク

FunctionステートメントとFunctionプロシージャ

Functionステートメント」と「Functionプロシージャ」どちらを使えばいいの? って思いませんか? (Functionプロシージャを使っているケースが多いと思いますけど)

【Function ステートメント】
Function プロシージャの本文を形成する名前、引数、およびコードを宣言します。

構文:[Public | Private | Friend] [Static] Function name [(arglist)] [As type]
   ・・・
   End Function
詳しくは、Microsoft Docs のリファレンスを参照してください。

【Function プロシージャ】
1 つの単位として実行されるステートメント名前付きシーケンス
(シーケンスとは、順番に並んだ一続きのデータや手順のことや、並んだ順番にデータや手順を取り扱う処理方式などのこと)

・これでわかりますか?
・【Functionステートメント】の構文で【Functionプロシージャ】を作成します。

Sub も同じように【Subステートメント】の構文で【Subプロシージャ】を作成しています。
・呼び出すときは、【プロシージャの名前】で呼び出します。

・なんとなく、わかりましたか?

Functionステートメント

・Functionプロシージャの本文を形成する名前、引数、およびコードを次の構文で宣言します。

 構文 [Public | Private | Friend] [Static] Function name [(arglist)] [As type]     
・・・
End Function
パーツ省略説明
Public   省略可能すべてのモジュールから参照できるFunctionプロシージャを宣言します。
キーワードが指定されなかった場合Publicで宣言したとみなされます。
Private省略可能Functionプロシージャを記述したモジュールからのみ参照できる
Functionプロシージャを宣言します。
Friend省略可能クラスモジュール内でのみ使用できます。
Static省略可能Functionプロシージャのローカル変数の値をプロシージャの呼び出し間で
保存するときに指定します。指定しない場合は、ローカル変数の値は、
Functionプロシージャの実行が終了すると破棄されます。
name省略不可Functionプロシージャの名前を指定します。
引数省略説明
arglist省略可能Functionプロシージャが受け取る引数リストを指定します。
複数の変数は、カンマ (,) で区切ります。

arglist 引数の構文と指定項目は以下のとおりです。

 構文 [Optional] [ByVal | ByRef] [ParamArray] varname[( )] [As type] [= defaultvalue]
パーツ省略説明
Optional 省略可能Optionalを付けた宣言した引数は、Functionプロシージャを呼び出す際に
省略することができますが、Optionalを付けた引数以降の引数にもすべて
Optionalを付ける必要があります。
ByVal省略可能その引数が値渡しで渡されることを示します。
ByRef省略可能その引数が参照渡しで渡されることを示します。ByValとByRefの両方を
省略した場合は、ByRefが指定されたものとして扱います。
ParamArray省略可能arglistの最後の引数でのみ試用できます。ParmArrayを付けると、
その引数は省略可能な配列として扱われます。Optional、ByVal、
ByRefのキーワードといっしょに使うことはできません。
varname省略不可引数の名前を指定します。引数を配列として扱う場合は、
引数名の後ろに()を付けます。
type省略可能引数のデータ型を設定します。パラメータにOptionalが指定
されていない場合は、ユーザー定義型またはオブジェクトの
種類を指定することもできます。
defaultvalue省略可能任意の定数または定数の式を指定します。Optionalを指定した
パラメータに対してのみ有効です。データ型がオブジェクト型の場合、
明示的な既定値はNothingだけです。

IsMissing関数

Optionalを付けた引数が渡されたかどうかを調べるには、IsMissing関数を使います。

【IsMissingの構文】
 IsMissing(argname)

・引数argnameには、省略可能な引数の名前を指定します。
・省略可能な引数はバリアント型でなければなりません。

【解説】
 省略可能な引数が渡されなかった場合はTrueを返します。
 省略可能な引数が渡された場合はFalseを返します。

Fanctionプロシージャ

Functionプロシージャは呼び出し元から引数を受け取り、結果の値を戻す(戻り値)ことができます。Functionプロシージャから値を返すには、値をFunctionプロシージャに代入します。

関数のような動作をするため、ユーザー定義関数とも言われ、Functionプロシージャで好きな関数を作ることが可能です。

Fanctionプロシージャのサンプルコード

・SubプロシージャからFunctionプロシージャを呼び出して結果を表示するサンプルです。

'簡単なFunction使用例サンプル
Sub sample()
    Dim arg As Long, rslt As Long
    arg = 9
    rslt = f_sample(arg)
    MsgBox "戻り値の数値は" & rslt
End Sub
'Functionサンプル
Function f_sample(arg As Long) As Long
    f_sample = arg * arg    '9×9=81
End Function

・次は、arglist 引数の構文とパーツで解説した各指定項目の動作確認サンプル

'Functionプロシージャを呼び出すサンプル
Sub fsample()
    Dim a As Long, b As Long
    MsgBox OptIsmis(10, 5)      '50が返ります
    MsgBox OptIsmis(10)         '20が返ります
    a = 10      '変数に代入
    b = 10      '変数に代入
    MsgBox bValRef(a, b)        '40が返ります
    MsgBox a    '戻り値は10(値渡しなので変数は元のまま)
    MsgBox b    '戻り値は20(参照渡しは変数が変化する)
    MsgBox pArry(10, 20, 30)    '60が返ります
    MsgBox pArry(10, 20)        '30が返ります
    MsgBox OptDefVal(10, 2)     '20が返ります
    MsgBox OptDefVal(10)        '50が返ります
End Sub

'Optional使用例(IsMissing関数で第2引数の省略確認)
Function OptIsmis(arg1 As Long, Optional arg2 As Variant)
    If IsMissing(arg2) Then 'Optionalで第2引数arg2は省略可能
        OptIsmis = arg1 * 2    '結果を代入
    Else
        OptIsmis = arg1 * arg2 '結果を代入
    End If
End Function
'「値渡し」と「参照渡し」の例
Function bValRef(ByVal arg1 As Long, ByRef arg2 As Long)
    arg1 = arg1 * 2     'arg1は値渡し
    arg2 = arg2 * 2     'srg2は参照渡し
    bValRef = arg1 + arg2 '結果を代入
End Function
'ParamArrayの使用例「配列」
Function pArry(ParamArray arg() As Variant)
    Dim rslt As Long, i As Long 'argは省略可能な配列
    For i = 0 To UBound(arg)
        rslt = rslt + arg(i)
    Next i
    pArry = rslt    '結果を代入
End Function
'Optional使用例(第2引数の省略で定数を使うサンプル)
Function OptDefVal(arg1 As Long, Optional arg2 As Long = 5)
    OptDefVal = arg1 * arg2 'arg2が省略された場合の既定値は5
End Function

Subプロシージャの呼び出しはCallステートメントを使用し「Call プロシージャ名」と記述しますが、Functionプロシージャを呼び出す際は、Callステートメントは使用しません。

Subプロシージャは、
Functionプロシージャを値(引数)を与えて呼び出します。
Functionプロシージャの戻り値を利用して処理に活用します。

Functionプロシージャは、
値を受け取り
処理をして
結果(戻り値)を返します。

スポンサーリンク

まとめ(おわりに)

・いかがでしたでしょうか?
「いつも汎用でだれでも使えて活用できるように考えてVBAを使う」というポリシーを念頭に記事を書いています。
・今回も、記事内で使用したコードのサンプルファイルを登録していますのでご利用ください。
今までの記事のサンプルも登録していますのでよろしければお使いください(^^)

まとめと感想など

くるみこ
くるみこ

Functionについて理解できましたでしょうか。これを使いこなせると、コーディングの幅がグンと広がっていくと思います。がんばってね!

たくさん項目があってすぐに全部覚えるのは無理です(^^;

でもシンプルなサンプルは理解できました(^^)

くるみこ
くるみこ

それなら大丈夫ですよ!少しずつ使っていくうちにだんだん使いこなせるようになっていきますよ! 次回は、今回出てきた「値渡し」と「参照渡し」ついて解説したいと思います(^^)

【今回分かったことは】
・FunctionステートメントとFunctionプロシージャとは何かがわかりました
・Functionプロシージャの使い方がわかりました
・IsMissing関数について知ることができました

・今までの記事でFunctionプロシージャを使ったブログカードを貼っておきます。

今後の記事について

今回の記事はいかがだったでしょうか。皆さまのお役に立てたなら幸いです(^^;
「汎用でだれでも使えて活用できるように考えてVBAを使う」というポリシーで、記事を継続して書いていきたいと思っています。どうぞよろしくお願いしますm(_ _)m

【検討中の今後の記事内容は・・・・・】
・実務に役立つものを提供できるよう常に検討しています(^^ゞ
・その他雑記的に「プチネタなど」もいろいろ考えていきたいと思います・・・・・
・今後の記事にもご期待ください(^^)/

記事のサンプルファイルをダウンロードできます

今回の記事のサンプルをダウンロードできるようにしています
過去の記事で使用したサンプルファイルがダウンロードできるページを設置しています
こちら(このリンク先)からご利用ください

スポンサーリンク

スポンサーリンク