Function ステートメント

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

構文

[パブリック] | プライベート | フレンド][ Static ] 関数 [ ( arglist ) ] [ Astype ]
[ statements ]
[ name= ]
[ Exit Function ]
[ statements ]
[ name= ]
End 関数

Function ステートメント構文には、次の指定項目があります。

指定項目 説明
Public 省略可能。 すべてのモジュールにおいて他のすべてのプロシージャが Function プロシージャにアクセスできることを示します。 Option Private が含まれるモジュールで使用されている場合、このプロシージャは、プロジェクト外では使用できません。
Private 省略可能。 Function プロシージャにアクセスできるのは、そのプロシージャが宣言されているモジュール内の他のプロシージャだけであることを示します。
Friend 省略可能。 クラス モジュールでのみ使用されます。 Function プロシージャは、プロジェクトを通して表示されますが、オブジェクトのインスタンスのコントローラーに表示されません。
Static 省略可能。 呼び出し間で Function プロシージャのローカル変数が保持されることを示します。 Static 属性は、Function 外で宣言された変数には、たとえその変数がプロシージャで使用されていても影響を及ぼしません。
name 必須です。 関数の名前。は、標準変数の名前付け規則に従います。
arglist 省略可能。 呼び出されたときに、Function プロシージャに渡される引数を表す変数の一覧です。 変数はそれぞれコンマで区切られています。
type 省略可能。 Function プロシージャによって返される値のデータ型。は、ByteBooleanIntegerLongCurrencySingleDoubleDecimal (現在サポートされていません)、DateString (固定長を除く)、ObjectVariant、または任意のユーザー定義型です。
statements 省略可能。 Function プロシージャ内で実行するステートメントのグループです。
expression 省略可能。 Function の値を返します。

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

[ Optional ] [ ByVal | ByRef ] [ ParamArray ] varname [ ( ) ] [ Astype ] [ =defaultvalue ]

指定項目 説明
Optional 省略可能。 引数が必須でないことを示します。 このキーワードを使用した場合は、それ以降の arglist 内の引数もすべて省略可能にして、Optional キーワードを使用して宣言する必要があります。 ParamArray が使用されている場合は、どの引数にも Optional は使用できません。
ByVal 省略可能。 値渡しで引数が渡されることを示します。
ByRef 省略可能。 参照渡しで引数が渡されることを示します。 ByRef は、Visual Basic .NET とは異なり、VBA の既定値です。
ParamArray 省略可能。 arglist の最後の引数としてのみ使用し、最後の引数が Variant 要素の Optional の配列であることを示します。 ParamArray キーワードを使用することで、任意の数の引数を指定できます。 ByValByRef、または Optional と併用することはできません。
varname 必須。 引数を表す変数の名前です。標準の変数の名前付け規則に従ってください。
type 省略可能。 プロシージャに渡される引数のデータ型。は、 ByteBooleanIntegerLongCurrencySingleDoubleDecimal (現在サポートされていません) DateString (可変長のみ)、 ObjectVariant、または特定の オブジェクト型です。 パラメーターが Optional でない場合は、ユーザー定義型の指定も可能です。
defaultvalue 省略可能。 任意の定数または定数式です。 Optional のパラメーターにのみ有効です。 Object 型の場合、明示的な既定値は Nothing のみが有効です。

解説

PublicPrivate、または Friend を使用して明示的に指定しない場合、関数プロシージャは既定でパブリックです。

Static が使用されていない場合、ローカル変数の値は呼び出し間で保持されません。

Friend キーワードは、クラス モジュールでのみ使用できます。 ただし、Friend プロシージャは、プロジェクトに含まれるどのモジュール内のプロシージャからでもアクセスできます。 Friend プロシージャは、親クラスのタイプ ライブラリに表示されず、Friend プロシージャを遅延バインドすることもできません。

関数 プロシージャは再帰的に指定できます。つまり、特定のタスクを実行するために自分自身を呼び出すことができます。 ただし、再帰はスタック オーバーフローの原因になることがあります。 静的キーワード (keyword)は、通常、再帰関数プロシージャでは使用されません。

すべての実行可能コードがプロシージャに含まれる必要があります。 別の FunctionSub、または Property プロシージャ内に Function プロシージャを定義することはできません。

Exit Function ステートメントを使用すると、Function プロシージャから即時に終了します。 プログラムの実行は、Function プロシージャを呼び出したステートメントの次のステートメントによって続行されます。 任意の数の Exit Function ステートメントを、Function プロシージャの任意の場所に表示できます。

Sub プロシージャと同様、Function プロシージャは個別のプロシージャとして、引数を取り、一連のステートメントを実行し、その引数の値を変更できます。 ただし、Sub プロシージャとは異なり、Function プロシージャは、関数で返された値を使用する必要があるときに、SqrCosChr などの組み込み関数と同じように、の右側で使用することができます。

関数プロシージャを呼び出す場合は、関数名を使用し、その後に引数リストをかっこで囲んで式で呼び出します。 関数プロシージャを呼び出す方法の詳細については、Call ステートメントを参照してください。

関数から値を返すには、その値を関数名に割り当てます。 このような割り当ての数は、プロシージャ内の任意の場所に表示できます。 name に値が割り当てられていない場合、プロシージャは既定値を返します。数値関数は 0 を返し、文字列関数は長さ 0 の文字列 ("") を返し、Variant 関数は Empty を返します。 オブジェクト参照を返す関数は、オブジェクト参照が関数内の名前 (Set を使用) に割り当てられていない場合、Nothingを返します。

次の例は、戻り値を関数に割り当てる方法を示しています。 この場合は、False が名前に割り当てられ、見つからなかった値があることを示しています。

Function BinarySearch(. . .) As Boolean 
'. . . 
 ' Value not found. Return a value of False. 
 If lower > upper Then 
  BinarySearch = False 
  Exit Function 
 End If 
'. . . 
End Function

Function プロシージャで使用されている変数は、プロシージャ内で明示的に宣言されている変数と、明示的に宣言されていない変数の 2 つのカテゴリに分かれています。

プロシージャ内で明示的に宣言されている変数 (Dim またはそれに相当するステートメントを使用) は必ずプロシージャに対してローカルです。 明示的に宣言されることなくプロシージャ内で使用されている変数もローカルになります。ただし、そのプロシージャの外側の上位レベルで明示的に宣言されている場合を除きます。

プロシージャでは、そのプロシージャ内で明示的に宣言していない変数を使用できますが、モジュール レベルで同じ名前が定義されているものがあると、名前の競合が発生することがあります。 プロシージャが、他のプロシージャ、定数、または変数と同じ名前の、宣言されていない変数を参照する場合、そのプロシージャは、そのモジュール レベルの名前を参照しているものと見なされます。 こうした競合を避けるには、変数を明示的に宣言するようにします。 Option Explicit ステートメントを使用して、変数の明示的な宣言を強制します。

Visual Basic では演算式を再調整し、内部的な効率性を向上させることがあります。 関数によって演算式の変数の値が変更される場合、その式で Function プロシージャを使用するのは避けてください。 算術演算子の詳細については、「 演算子」を参照してください。

この例では、Function ステートメントを使用して、Function プロシージャの本体を形成する名前、引数、およびコードを宣言します。 最後の例では、厳密に型指定および初期化された Optional 引数を使用しています。

' The following user-defined function returns the square root of the 
' argument passed to it. 
Function CalculateSquareRoot(NumberArg As Double) As Double 
 If NumberArg < 0 Then ' Evaluate argument. 
  Exit Function ' Exit to calling procedure. 
 Else 
  CalculateSquareRoot = Sqr(NumberArg) ' Return square root. 
 End If 
End Function

ParamArray キーワードを使用すると、引数の変数を受け入れることができます。 次の定義では、値によって渡されます。

Function CalcSum(ByVal FirstArg As Integer, ParamArray OtherArgs()) 
Dim ReturnValue 
' If the function is invoked as follows: 
ReturnValue = CalcSum(4, 3, 2, 1) 
' Local variables are assigned the following values: FirstArg = 4, 
' OtherArgs(1) = 3, OtherArgs(2) = 2, and so on, assuming default 
' lower bound for arrays = 1. 

Optional 引数には、Variant 以外の既定の値および型を指定できます。

' If a function's arguments are defined as follows: 
Function MyFunc(MyStr As String,Optional MyArg1 As _
 Integer = 5,Optional MyArg2 = "Dolly") 
Dim RetVal 
' The function can be invoked as follows: 
RetVal = MyFunc("Hello", 2, "World") ' All 3 arguments supplied. 
RetVal = MyFunc("Test", , 5) ' Second argument omitted. 
' Arguments one and three using named-arguments. 
RetVal = MyFunc(MyStr:="Hello ", MyArg1:=7) 

関連項目

サポートとフィードバック

Office VBA またはこの説明書に関するご質問やフィードバックがありますか? サポートの受け方およびフィードバックをお寄せいただく方法のガイダンスについては、Office VBA のサポートおよびフィードバックを参照してください。