関数が操作できる値は、次のとおりです。
次の節では、モジュールレベルの変数、アプリケーションが関数を呼び出すときに引数として渡す値、関数がそれ自身で使用するために定義する変数を関数が処理する方法を説明します。
関数は、同じ名前でローカル変数を定義しない限り、モジュールレベルで定義された変数にアクセスできます。
以下に例を示します。
Dim anInt As Integer
Function ThreeTimes1 As Double
' Multiply the module-level variable anInt% by 3
' and assign the result as the function's return value.
ThreeTimes1# = anInt% * 3
End Function
anInt% = 5
Print ThreeTimes1#
' Output: 15
変数を常に明示的に宣言しない場合などにおいてアプリケーションにエラーが発生する可能性があるため、モジュールレベルの変数を直接操作するためにプロシージャを使用することは推奨されません。
関数を定義する場合、関数の先頭部の一部として変数リスト (仮パラメータまたは単にパラメータとも呼ばれます) を宣言できます。これらの変数は、実行時にアプリケーションが関数に渡し、関数が実行するときに使用する値の位置を示します。アプリケーションが関数に渡すランタイム値は実パラメータあるいは引数として知られています。
プロシージャは、専用の変数を定義できます。既定では、ローカル変数はそれが定義されたプロシージャが実行されている間だけ存在します。ローカル変数の宣言に Static キーワードを含めると、その変数のアドレスがメモリに保持され、複数のプロシージャへの呼び出しから次の呼び出しまでの間だけ、その値が維持されます。どちらの場合も、ローカル変数は、変数を定義したプロシージャの外部では無効ですが、そのプロシージャが呼び出すほかのプロシージャに引数として渡すことはできます。
ローカル変数をモジュールレベルの変数と同じ名前で定義すると、プロシージャはローカル変数を使用し、モジュールレベルの変数は無視します。これは、変数の隠ぺい (シャドウイング) という動作です。
例えば、counter% をローカル変数として定義すると、この例は、適切な動きをします。BadCount はループの呼び出しで counter 変数に何も影響しないため、While ループの呼び出しは 3 回実行されます。
Dim counter As Integer ' Module-level variable
Function BadCount As Integer
Dim counter As Integer ' Local variable
counter% = 1
While counter% < 4
' Do something.
counter% = counter% +1
Wend
BadCount% = counter%
End Function
counter% = 1
While counter% < 4
Print "BadCount% = " & BadCount%
counter% = counter% +1
Wend
この例では、静的なローカル変数と静的でないローカル変数と、ローカル変数が別のプロシージャへの呼び出しの中でどのように引数として渡されるかを示しています。例は、GetID と FindMatch の 2 つの関数を使用します。GetId はユーザーにパスワード (ファーストネーム) の入力を求め、次に FindMatch を呼び出して、パスワードを渡します。FindMatch は、名前がモジュールレベルの配列 theNames の中にあるかどうかを判定します。名前が theNames にあれば、FindMatch は True (-1) の値を返し、GetId は確認のメッセージを表示します。名前が配列の中になければ、FindMatch は静的変数 callCounter% を 1 増やして、False (0) の値を返します。このとき、GetId はユーザーにもう一度行うか終了するように求めるメッセージを出力します。ユーザーがもう一度操作を行うと、GetId は再度 FindMatch を呼び出して名前をチェックします。ユーザーが続けて 3 回間違った名前を入力した場合 (FindMatch を連続して 3 回呼び出した場合)、FindMatch はプログラムを終了させます。
%Include "LSCONST.LSS"
' Declare an array of Strings and initialize it with some
' names.
Dim theNames(1 to 6) As String
theNames(1) = "Alex"
theNames(2) = "Leah"
theNames(3) = "Monica"
theNames(4) = "Martin"
theNames(5) = "Elizabeth"
theNames(6) = "Don"
Function FindMatch(yourName As String) As Boolean
Static callCounter As Integer ' To count the number of
' calls to FindMatch.
Dim counter As Integer ' Loop counter.
FindMatch = FALSE
For counter% = 1 to 6
If yourName$ = theNames(counter%) Then
FindMatch = TRUE
Exit For ' Exit from the For loop now.
End If
Next
' If the user enters an invalid name,
' increment callCounter%.
If FindMatch = False Then callCounter% = callCounter% + 1
' After three consecutive invalid names, terminate the script.
If callCounter% = 3 Then
Print "Go away, friend."
End ' Terminate execution.
End If
End Function
Function GetId As String
Dim match As Boolean
Dim goAgain As Boolean
Dim pswd As String
Dim msg As String
Dim msgSet As Integer
Dim ans As Integer
match = FALSE
goAgain = TRUE
msg$ = "That's not a valid name." & _
"Would you like to try again?"
msgSet% = MB_YESNO + MB_ICONQUESTION
' Go through this While loop at least once.
While match = FALSE and goAgain = TRUE
pswd$ = InputBox$("Please enter your name.")
' Call FindMatch, passing it the name the user
' just entered (pswd$).
match = FindMatch(pswd$)
' If the name the user entered isn't in theNames,
' see if the user would like to try again or quit.
If match = False Then
ans% = MessageBox(msg$, msgSet%)
' If No, end the While loop.
If ans% = IDNO Then
goAgain = FALSE
GetID$ = "Have a nice day, " & pswd$ & "."
End If
Else
GetID$ = "Your ID is valid, " & pswd$ & "."
End If
Wend
End Function
Print GetID$
' Output: (1) The application prompts "Please enter your name."
' The user enters the name "Martin"
' The application answers "Your ID is valid, Martin."
' Output: (2)The application prompts "Please enter your name."
' The user enters the name "Fred"
' The application answers "That's not a valid name. Would you
' like to try again?"
' The user selects No
' The application answers "Have a nice day, Fred."
' Output: (3)he application prompts "Please enter your name."
' The user enters the name "Fred"
' The application answers "That's not a valid name. Would you
' like to try again?"
' The user selects Yes, then enters "Frank,"
' The application answers "That's not a valid name. Would you
' like to try again?"
' The user selects Yes, then enters "Joe":
' The application answers "Go away, friend."