そういえば 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
まとめ(おわりに)
・いかがでしたでしょうか?
・「いつも汎用でだれでも使えて活用できるように考えてVBAを使う」というポリシーを念頭に記事を書いています。
・今回も、記事内で使用したコードのサンプルファイルを登録していますのでご利用ください。
・今までの記事のサンプルも登録していますのでよろしければお使いください(^^)
まとめと感想など
Functionについて理解できましたでしょうか。これを使いこなせると、コーディングの幅がグンと広がっていくと思います。がんばってね!
たくさん項目があってすぐに全部覚えるのは無理です(^^;
でもシンプルなサンプルは理解できました(^^)
それなら大丈夫ですよ!少しずつ使っていくうちにだんだん使いこなせるようになっていきますよ! 次回は、今回出てきた「値渡し」と「参照渡し」ついて解説したいと思います(^^)
・今までの記事でFunctionプロシージャを使ったブログカードを貼っておきます。
★★★ ブログランキング参加中! クリックしてね(^^)/ ★★★
今後の記事について
今回の記事はいかがだったでしょうか。皆さまのお役に立てたなら幸いです(^^;
「汎用でだれでも使えて活用できるように考えてVBAを使う」というポリシーで、記事を継続して書いていきたいと思っています。どうぞよろしくお願いしますm(_ _)m
【検討中の今後の記事内容は・・・・・】
・実務に役立つものを提供できるよう常に検討しています(^^ゞ
・その他雑記的に「プチネタなど」もいろいろ考えていきたいと思います・・・・・
・今後の記事にもご期待ください(^^)/
記事のサンプルファイルをダウンロードできます
今回の記事のサンプルをダウンロードできるようこのリンク先に登録しています!
過去の記事で使用したサンプルファイルがダウンロードできるページを設置しています
こちら(このリンク先)からご利用ください
スポンサーリンク
Amazonでも Microsoft 365 を販売しています!
【今回分かったことは】
・FunctionステートメントとFunctionプロシージャとは何かがわかりました
・Functionプロシージャの使い方がわかりました
・IsMissing関数について知ることができました