関数が操作できる値

関数が操作できる値は、次のとおりです。

次の節では、モジュールレベルの変数、アプリケーションが関数を呼び出すときに引数として渡す値、関数がそれ自身で使用するために定義する変数を関数が処理する方法を説明します。

モジュールレベルの変数

関数は、同じ名前でローカル変数を定義しない限り、モジュールレベルで定義された変数にアクセスできます。

以下に例を示します。

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."