ブログの説明

学校に通わないで学んだことを記しています。間違っているところが何かありましたらご指摘下さると幸いです。コメントに対する返信が遅れる可能性があります。その場合は申し訳ありません。

このブログではサイドバーに広告を表示しています。このブログ内の投稿記事を検索するには右上の拡大鏡のアイコンを、アーカイブやラベル付けから投稿記事を閲覧するには左上の三重線のアイコンをクリックして下さい。

数式の表示にはMathJaxを利用させていただいています。数式の表示のためにJavaScriptが有効である必要があります。そうでない場合、訳の分からないLatexのコードが表示されます。幾何学図形やチャートの表示にはHTML5 CanvasやGoogle Chartを使用しています。その表示のためにもJavaScriptが有効である必要があります。

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

条件分岐や繰り返しの処理を行うための制御構文についてはまたの機会に。

コメント

このブログの人気の投稿

LATEXで数式:指数と順列などで使う添数・添字

10の補数と9の補数と2の補数と1の補数

Visual Studio 2019にはC++のためのフォームデザイナーがない件