LibreOffice Basic サブルーチン 函数 引数
サブルーチンと函数
サブルーチンと函数は、一つのまとまった処理を行う一連のステートメントに名前を付けて部品化する仕組み。サブルーチンのことをプロシージャと呼んだり、サブルーチンと函数を両方まとめてプロシージャと呼ぶことがある。函数が呼び出し元に返す値を持つのに対してサブルーチンは呼び出し元に返す値を持たないという違いがある。
サブルーチンはSub サブルーチン名
によって始まり、End Sub
によって終わる。その間に一連の処理を行うステートメントを置く。サブルーチン名はそのサブルーチンを呼び出すために用いられる。
REM **** BASIC **** '変数を明示的に宣言して使う Option Explicit Sub Main 'サブルーチンHelloWorldを呼び出す HelloWorld End Sub 'Hello, World!を出力するサブルーチン Sub HelloWorld MsgBox "Hellow, World!" End Sub
一方、函数はFunction 函数名
によって始まり、End Function
によって終わる。その間に一連の処理を行うステートメントを置く。函数名と同じ名前の変数に値を代入すれば、その値が返り値となって呼び出し元に返される。函数名はその函数を呼び出すときに使われる。
REM **** BASIC **** '変数を明示的に宣言して使う Option Explicit Sub Main 'Kyooという関数を呼び出して返り値を出力 MsgBox(Kyoo) End Sub '今日の日付を返す函数 Function Kyoo Kyoo = date() End Function
モジュールの冒頭にOption Explicitを宣言していても、値を返すための変数、つまり函数と同じ名前の変数は、宣言する必要なく使うことができるようだ。函数の中に函数名と同じ名前の変数が複数ある場合には、もっとも終わりの行にあるものが返り値となる。
サブルーチン名と函数名には変数名と同じ命名規則が適用される。つまり、英字で始まり、それ以降は英字か数字かアンダースコアを使うことができ、スペースを含む場合には角括弧で名前全体をはさむ必要がある。
引数
サブルーチンや函数によっては、なんらかの値や値がある場所を示す情報を渡して処理させたいことがある。それらを受け取るためにサブルーチンや函数とともに宣言する変数が仮引数。仮引数は、サブルーチン名や函数名の直後に丸括弧ではさんで変数名とそのデータ型を指定することで利用することができる。データ型が無指定だとVariant型になる。カンマで区切って複数の仮引数を指定することができる。
引数はパラメータとも呼ばれている。
次のコードでは、メインのルーチンからHelloというサブルーチンを呼び出すときに文字列"Julia"を引数として渡している。Helloというサブルーチンでは、その文字列の値を受け取るための変数namaeをString型で定義してあるので、その値を受け取って処理する。
REM **** BASIC **** '変数を明示的に宣言して使う Option Explicit Sub Main 'サブルーチンを引数を与えて呼び出す Hello("Julia") End Sub 'String型の引数を一つ持つサブルーチン Sub Hello(namae As String) MsgBox "Hello, " & namae End Sub
次のコードでは、メインのルーチンで身長と体重の入力を促し、その値を引数にしてボディマス指数を計算する函数funBmiを呼び出し、その返り値をメッセージボックスに出力している。呼び出された函数のほうでは、身長と体重の引数がSingle型の変数として定義されており、身長と体重の値を受け取ってボディマス指数を計算し、その計算結果を呼び出し元に返している。
REM **** BMIを計算 **** '変数を明示的に宣言して使う Option Explicit Sub Main '局所変数をSingle型で宣言 Dim height As Single Dim weight As Single Dim bmiValue As Single '入力 height = InputBox("あなたの身長(cm)を入力してください") weight = InputBox("あなたの体重(kg)を入力してください") '身長と体重を引数に函数を呼び出してその返り値を代入 bmiValue = funBmi(height,weight) '出力 MsgBox "あなたのボディマス指数は" & bmiValue & "です" End Sub 'Single型の引数を2つ持つ函数 Function funBmi(height As Single, weight As Single) '身長と体重からBMIを計算した値を返す funBmi = weight / (height/100)^2 End Function
引数が複数ある場合にはカンマで区切る。その順番は定義したときの順番と同じ。
身長と体重の入力時に何も入力しないと0と認識され、0除算ができないというエラーが生じる。これを避ける方法についてはまたの機会に。
サブルーチンや函数の適用範囲
マイクロソフトのVBAでは、SubプロシージャやFunctionプロシージャの先頭にPublicかPrivateを置くことによって変数のみならずプロシージャにも適用範囲を指定することができる。しかしLibreOffice Basicでは、Option Compatibleをモジュールの冒頭でたとえ宣言していたとしても、この機能を使うことができない。したがってPrivateと指定していてもすべてPublicとして認識され、他のモジュールから自由に呼び出せてしまう。
Privateという修飾子を有効にするには、Privateと指定したサブルーチンや函数を呼び出すその前にCompatibilityMode(True)
を置く必要がある。こうすることで他のモジュールからPrivateのサブルーチンやPrivateの函数を呼び出すことができなくなる。
REM **** BASIC **** '変数を明示的に宣言して使う Option Explicit 'VBA拡張 Option Compatible Sub Main CompatibilityMode(True) 'これが必要 Hello("Julia") End Sub 'このモジュール内限定のサブルーチン Private Sub Hello(namae As String) MsgBox "Hello, " & namae End Sub
条件分岐や繰り返しの処理を行うための制御構文についてはまたの機会に。
コメント
コメントを投稿