プロシージャと関数

From Apache OpenOffice Wiki
Jump to: navigation, search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
doc OOo
Book.png


プロシージャと関数こそは、プログラム構造の中心的な役割を担うものです。これらを利用することで、複雑なプログラムを個々のタスクごとにブロック化することができます。

プロシージャ

プロシージャは、プログラム内の特定の処理を実行するユニットのことですが、戻り値を返すことはありません。構文は次のようになります。

Sub Test
  ' ... here is the actual code of the procedure
End Sub

このサンプルコードでは Test という名前のプロシージャを定義していますが、このプロシージャによる処理は、プログラム内の任意の位置から実行させることができます。プロシージャを呼び出すには、次のようにプログラム内の該当行にプロシージャ名を記述するだけです。

関数

関数も、プロシージャと同様に、特定のプログラムブロックを 1 つのユニットとしてまとめたものです。プロシージャとの相違点として、関数は戻り値を返すという点があります。

Function Test
  ' ... here is the actual code of the function
  Test = 123
End Function

戻り値は、簡単な代入を使用して割り当てます。この代入は、関数の末尾で実行する必要はなく、関数内の任意の位置で行えます。

上記のようにして定義した関数は、プログラム内の任意の位置から呼び出すことができます。

Dim A
A = Test

このコードは、変数 A を宣言してから、関数 Test の戻り値をその中に代入しています。

戻り値として返す値は、関数内で何回も書き換えることが可能です。通常の変数への代入操作と同様に、次のサンプルでも実際に返される関数の戻り値は、最後に代入した値となります。

Function Test
  Test = 12
  ' ... 
  Test = 123
End Function

このサンプルコードの場合、関数の戻り値は 123 となります。

戻り値の代入を行わなかった場合、その関数からは zero 値が返されます (数値関数の場合は 0 、文字列関数の場合は空白文字列)。

関数の戻り値のデータ型は、任意の種類を指定できます。この場合のデータ型宣言は、通常の変数宣言と同様の手順で行えます。

Function Test As Integer
  ' ... here is the actual code of the function
End Function

プロシージャと関数の強制終了

Apache OpenOffice Basic では、Exit Sub および Exit Function コマンドを使用して、実行途中のプロシージャや関数を強制終了させることができ、エラーの処理などに便利です。これらのコマンドは、プロシージャや関数を強制終了させてから、これらを呼び出した行にまでプログラムの実行行を戻します。

次のサンプルコードでは、変数 ErrorOccured の値が True になった場合に、プロシージャを強制終了します。

Sub Test
  Dim ErrorOccured As Boolean
  ' ...
  If ErrorOccured Then
    Exit Sub
  End If
  ' ...
End Sub

パラメータの渡し方

関数やプロシージャには、1 つまたは複数のパラメータ (引数) を渡すことができます。パラメータは、関数やプロシージャの名前の後に、かっこで囲んで指定する必要があります。次の例では、整数値 A と文字列 B をパラメータとして予想するプロシージャを定義しています。

Sub Test (A As Integer, B As String)
  ' ...
End Sub

通常、Apache OpenOffice Basic では、パラメータの渡し方は参照 です。この場合、呼び出したプロシージャや関数が終了しても、これらの変数値に対して行われた変更はそのまま維持されます。

Sub Test 
  Dim A As Integer
  A = 10
  ChangeValue(A)
  ' The parameter A now has the value 20
End Sub

Sub ChangeValue(TheValue As Integer)
  TheValue = 20
End Sub

この例では、値 ATest 関数で定義されており、それがパラメータとして ChangeValue 関数に渡されます。その後、値は 20 に変更されて TheValue に渡されますが、これは関数が終了しても維持されます。

またパラメータに対する変更をオリジナルの変数の内容に反映させたくない場合は、パラメータを値渡しで与えることも可能です。パラメータを値で渡すよう指定するには、関数ヘッダで変数宣言の前にキーワード ByVal を指定する必要があります。

前の例では、関数 ChangeValue を置き換えた場合、上位の変数 A はこの変更による影響を受けません。関数 ChangeValue を呼び出した後も、変数 A の値は 10 のままです。

Sub ChangeValue(ByVal TheValue As Integer)
  TheValue = 20
End Sub
Documentation note.png Apache OpenOffice におけるプロシージャや関数へのパラメータの渡し方は、基本的に VBA と同じです。標準でパラメータは、参照渡しとして与えられます。パラメータを値として渡すには、ByVal キーワードを使用します。VBA では、キーワード ByRef を使用して、強制的に参照でパラメータを渡すこともできます。Apache OpenOffice Basic では参照渡しが既に標準的な方法なので、Apache OpenOffice Basic はこのキーワードを認識しますが無視します。

オプションパラメータ

関数やプロシージャを呼び出す際には、必要なパラメータをすべて指定する必要があります。

Apache OpenOffice Basic では、パラメータをオプションとして定義できます。つまり、対応する値が呼び出しに含まれない場合、Apache OpenOffice Basic は空のパラメータを渡します。次の例では、パラメータ A は必須ですが、パラメータ B はオプションです。

Sub Test(A As Integer, Optional B As Integer)
  ' ...
End Sub

IsMissing 関数を使うと、呼び出し時にパラメータが指定されているかをチェックできます。

Sub Test(A As Integer, Optional B As Integer)
  Dim B_Local As Integer
  ' Check whether B parameter is actually present         
  If Not IsMissing (B) Then   
    B_Local = B      ' B parameter present
  Else
    B_Local = 0      ' B parameter missing -> default value 0
  End If
  ' ... Start the actual function
End Sub

上記のサンプルコードでは、まずパラメータ B に値が指定されているかをチェックしてから、チェック結果に応じて、局所変数 B_Local に渡す値を変えています。対応するパラメータが存在しない場合、B_Local には、渡されたパラメータではなく、デフォルト値 (この例では 0) が代入されます。

Documentation note.png VBA のキーワード ParamArray は、Apache OpenOffice Basic ではサポートされていません。

再帰処理

再帰処理とは、関数やプロシージャが処理中に自分自身を呼び出すことで、特定の終了条件を満たすまで、このような処理を実行し続けます。たとえば再帰関数の場合、終了条件が満たされた段階で、戻り値を返します。

次のサンプルコードは再帰関数の使用例で、42-423.14 の各数値の階乗を再帰処理で求めています。

Sub Main
  Msgbox CalculateFactorial(  42 )    ' Displays 1,40500611775288E+51
  Msgbox CalculateFactorial( -42 )    ' Displays "Invalid number for factorial!"
  Msgbox CalculateFactorial( 3.14 )   ' Displays "Invalid number for factorial!"
End Sub 

Function CalculateFactorial( Number )
  If Number < 0 Or Number <> Int( Number ) Then
    CalculateFactorial = "Invalid number for factorial!"
  ElseIf Number = 0 Then
    CalculateFactorial = 1
  Else
    ' This is the recursive call:
    CalculateFactorial = Number * CalculateFactorial( Number - 1 )
  Endif
End Function

上記のサンプルコードでは、数値 42 の階乗を計算する際に、関数 CalculateFactorial を再帰的に呼び出し、基本条件 0! = 1 になった時点で処理を終了しています。

Documentation note.png 再帰回数のレベルは、ソフトウェアのプラットフォームごとに異なります。Windows の場合、再帰回数のレベルは 5800 です。Solaris および Linux の場合、再帰回数のレベルは、スタックサイズの計算結果を基に計算されます。


Content on this page is licensed under the Public Documentation License (PDL).


Personal tools