関数 Functionステートメント
※より実装に近く表示させる為、コードの改行を避けています。スマホ等で閲覧される際は向きを変えてご覧ください。
※実装するバージョンによってはバージョンアップの仕様により動作しないコードもあります。実装には動作確認の上ご使用下さい。
'Function プロシージャの名前、引数、および本体部分を構成するコードを宣言します。() ' '構文 ' '[Public | Private | Friend] [Static] Function name [(arglist)] [As type] '[statements] '[name = expression] '[Exit Function] '[statements] '[name = expression] ' ' 'Function ステートメントの構文は、次の指定項目から構成されます。() ' '指定項目 'Public 'Private 'Friend 'Static 'name 'arglist 'type 'statements 'expression ' '引数 arglist は、次の形式で指定します。 ' '[Optional] [ByVal | ByRef] [ParamArray] varname[( )] [As type] [= defaultvalue] ' '指定項目 'Optional 'ByVal 'ByRef 'ParamArray 'varname 'type 'defaultvalue ' '解説 ' 'キーワード Public、キーワード Private、またはキーワード Friend を指定しない場合、Function プロシージャはパブリックが既定値になります。キーワード Static を指定しない場合、ローカル変数の値は Function プロシージャの実行が終了すると破棄されます。キーワード Friend は、クラス モジュール内でのみ使えます。ただし、Friend を指定したプロシージャは、プロジェクト内のすべてのモジュールのプロシージャから呼び出せます。Friend を指定したプロシージャは、親クラスのタイプ ライブラリには書き込まれません。また、実行時バインディングは行えません。 ' 'メモ Function プロシージャは、再帰的な使用、つまり、ある機能を実行するためにプロシージャ自体を呼び出すことができます。ただし、再帰呼び出しを行うと、スタックがオーバーフローする可能性があります。通常、キーワード Static は、再帰的な Function プロシージャでは使いません。 ' '実行可能なコードは、すべてプロシージャ内に記述する必要があります。Function プロシージャは、ほかの Function プロシージャ、Sub プロシージャ、Property プロシージャの中では、定義できません。 ' 'Exit Function ステートメントは、Function プロシージャを直ちに終了します。プログラムの実行は、その Function プロシージャを呼び出したステートメントの次のステートメントから継続されます。Exit Function ステートメントは、Function プロシージャ内の任意の場所で必要に応じていくつでも指定できます。 ' 'Sub プロシージャと同様に、Function プロシージャは、引数を受け取り、一連のステートメントを実行して、引数の値を変更します。ただし、Sub プロシージャとは異なり、Function プロシージャは、Sqr、Cos、Chr などの組み込み関数と同じように、式の右辺に記述して、関数の戻り値を使うことができます。 ' '式の中で Function プロシージャを呼び出すには、関数名の後にかっこで囲んだ引数リストを付けて使います。Function プロシージャを呼び出す方法については、Call ステートメントを参照してください。 ' 'Function プロシージャから値を返すには、値を Function プロシージャ名に代入します。プロシージャ名には、Function プロシージャ内の任意の場所で、必要に応じて何回でも値を代入できます。プロシージャ名 name に値を代入しない場合、既定の戻り値が返されます。既定の戻り値は、Function プロシージャが数値型の場合は 0、文字列型の場合は長さ 0 の文字列 ("")、バリアント型の場合は Empty 値です。オブジェクトへの参照を返す Function プロシージャでは、プロシージャ内で Set ステートメントを使ってプロシージャ名 name にオブジェクトへの参照を代入しない場合は、Nothing が返されます。 ' '次の例では、BinarySearch という名前の Function プロシージャに戻り値を代入しています。ここでは、値が見つからなかったことを示す偽 (False) をプロシージャ名に代入しています。 ' 'Function BinarySearch(. . .) As Boolean '. . . ' 値が見つからないときは偽 (False) を返します。 If lower > upper Then BinarySearch = False Exit Function End If '. . . 'Function プロシージャで使う変数には、Function プロシージャ内で明示的に宣言される変数と、それ以外の変数の 2 種類があります。プロシージャ内で Dim などのステートメントで明示的に宣言された変数 (ローカル変数) は、そのプロシージャの中だけで有効です。プロシージャ内で明示的に宣言されていない変数も、そのプロシージャの外部のさらに上のレベルで明示的に宣言されていない限り、ローカル変数となります。 ' 'メモ プロシージャ内で明示的に宣言されていない変数をプロシージャ内で使うことは可能ですが、その変数と同じ名前の変数などがモジュール レベルで定義されている場合、名前の競合が発生します。あるプロシージャから、ほかのプロシージャ、定数または変数のいずれかと同じ名前を持つ未宣言の変数を参照した場合、そのモジュール レベルの名前を参照しているものと見なされます。変数を明示的に宣言すれば、このような名前の競合は避けられます。Option Explicit ステートメントを使うと、変数の明示的な宣言が強制されます。 ' 'メモ Visual Basic では、演算効率を高めるために数式が自動的に並べ替えられることがあります。数式の中で使用している変数の値を変えてしまうような Function プロシージャは、同じ数式の中で実行しないようにしてください。 'Function ステートメントの使用例 '次の例では、Function ステートメントを使って、Function プロシージャの名前と引数を宣言し、プロシージャのコードを記述しています。最後の例では、既に定義されて、初期化された、キーワード Optional 指定の引数が使われています。 ' 次のユーザー定義関数は、引数として渡された値の平方根を返します。 Function CalculateSquareRoot(NumberArg As Double) As Double If NumberArg < 0 Then ' 引数を評価します。 Exit Function ' 終了して、呼び出し側のプロシージャに戻ります。 Else CalculateSquareRoot = Sqr(NumberArg) ' 平方根を返します。 End If End Function '関数が任意の数の引数を受け取るようにするには、キーワード ParamArray を使います。その例を次に示します。また、この例では、引数 FirstArg を値渡しで引き渡します。 Function CalcSum(ByVal FirstArg As Integer, ParamArray OtherArgs()) Dim ReturnValue ReturnValue = CalcSum(4, 3, 2, 1) ' この関数を上のように呼び出すと、 ' 配列の添字の最小値が既定値の 1 であれば、 ' ローカル変数には FirstArg = 4、OtherArgs(1) = 3、 ' OtherArgs(2) = 2 のように値が代入されます。 End Function 'キーワード Optional が指定された引数は、既定値とバリアント型 (Variant) 以外のデータ型を持つことができます。 ' 関数の引数が次のように定義されているものとします。 Function MyFunc(MyStr As String, Optional MyArg1 As _ Integer = 5, Optional MyArg2 = "Dolly") Dim RetVal ' この関数は次のように呼び出すことができます。 RetVal = MyFunc("Hello", 2, "World") ' 3 つの引数をすべて指定します。 RetVal = MyFunc("Test", , 5) ' 2 番目の引数を省略します。 ' 名前付き引数を使って、1 番目と 3 番目の引数を指定します。 RetVal = MyFunc(MyStr:="Hello ", MyArg1:=7) End Function |