Function ステートメント

Function プロシージャの名前、引数を宣言し、Function プロシージャの始まりを示します。

[Public [Default] | Private] Function name [(arglist)]
   [statements]
   [name = expression]
   [Exit Function] 
   [statements]
   [name = expression]
End Function 

引数

  • Public
    すべてのスクリプトのすべてのプロシージャから参照できる Function プロシージャを宣言するときに指定します。
  • Default
    Class のキーワード Public と共にのみ使用し、Function プロシージャをクラスの既定のメソッドに指定します。1 つのクラスで複数の Default プロシージャを指定するとエラーとなります。
  • Private
    Function プロシージャを記述したスクリプト内のプロシージャ内からのみ参照できるプロシージャを宣言するときに指定します。関数がクラスのメンバの場合、その Function プロシージャは、そのクラスの中の他のプロシージャからのみ参照が可能になります。
  • name
    定義する Function プロシージャの名前を指定します。変数の標準的な名前付け規則に従って名前を付けます。
  • arglist
    Function プロシージャを呼び出すときに、Function プロシージャに渡す引数を表す変数のリストを指定します。複数の変数を指定するときは、カンマ (,) で区切ります。
  • statements
    Function プロシージャ内で実行される一連のステートメントを指定します。
  • expression
    関数の戻り値を指定します。

arglist の構文と指定項目は次のとおりです。

[ByVal | ByRef] varname[( )]

引数

  • ByVal
    その引数が、値渡しで渡されることを示します。
  • ByRef
    その引数が、参照渡しで渡されることを示します。
  • varname
    引数として渡す変数名を指定します。変数の標準的な名前付け規則に従って名前を付けます。

解説

キーワード Publicまたはキーワード Privateを指定しない場合、Function プロシージャは既定のパブリック プロシージャとなり、スクリプト内の他のすべてのプロシージャから参照できます。Function プロシージャ内のローカル変数の値は、プロシージャの実行が終了すると破棄されます。

Function プロシージャを Sub プロシージャや Property Get プロシージャなど、他のプロシージャの中で定義することはできません。

Exit Function ステートメントは、Function プロシージャを直ちに終了します。プログラムの実行は、その Function プロシージャを呼び出したステートメントの次のステートメントから継続されます。Exit Function ステートメントは、Function プロシージャ内の任意の位置で何回でも指定できます。

Function プロシージャと Sub プロシージャには、似た点と異なる点があります。引数を受け取って一連のステートメントを実行し、引数の値を変える点は似ています。しかし、Function プロシージャは Sub プロシージャと異なり、Sqr 関数、Cos 関数、Chr 関数などの組み込みの関数のように式の右辺に記述することで、戻り値を使用することができます。

Function プロシージャを式の中から呼び出すには、引数リストをかっこで囲んで指定します。Function プロシージャの呼び出し方法については、Call ステートメントを参照してください。

注意   Function プロシージャは、再帰的にプロシージャ自体を呼び出すことができます。ただし、再帰呼び出しを行うと、スタックがオーバーフローする可能性があります。

Function プロシージャから値を返すには、値を Function プロシージャ名 name に代入してください。name への代入は、Function プロシージャ内の任意の場所で必要に応じて何回でも行うことができます。name に値を代入しない場合は、既定の戻り値が返されます。既定の戻り値は、Function プロシージャが数値型の場合は 0、文字列型の場合は長さ 0 の文字列 ("") です。Set ステートメントを使っている Function プロシージャ内で、name にオブジェクトへの参照を代入しない場合、オブジェクトへの参照を返す Function プロシージャには、Nothingが返されます。

次のコードは、Function プロシージャ名 BinarySearch に戻り値を代入する例です。このコード例では、値が見つからなかったことを示すため、Function プロシージャ名に False を代入しています。

Function BinarySearch(. . .)
      . . .
      ' 値が見つかりません。値として False を返します。
      If lower > upper Then
            BinarySearch = False   
            Exit Function 
      End If
      . . .
End Function

Function プロシージャで使用する変数には、Function プロシージャ内で明示的に宣言される変数と、それ以外の変数の 2 種類があります。プロシージャ内で Dim ステートメントなどを使って明示的に宣言された変数は、そのプロシージャの中だけで有効なローカル変数になります。プロシージャ内で明示的に宣言せずに使われている変数も、そのプロシージャの外部のさらに上のレベルで明示的に宣言されていない限りは、ローカル変数となります。

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

注意   Microsoft Visual Basic Scripting Edition (VBScript) では、演算効率を高めるために数式が自動的に並べ替えられることがあります。このため、変数の値を変えてしまうような Function プロシージャを数式の中で実行しないようにしてください。

必要条件

バージョン 1

参照

Call ステートメント | Dim ステートメント | Exit ステートメント | Nothing キーワード | Set ステートメント | Sub ステートメント