7.プログラム単位(サブルーチン)


7-1 サブルーチンプロシージャの宣言

 関数プロシージャは値を返すことができる.同じように,まとまった処理を行う文としてサブルーチンプロシージャがある.ただし,このプロシージャが関数プロシージャと異なるのは,値を返さないことである.したがって,引数をとおして値のやりとりを行うことになる.
  (構文)
  [Private | Public | Friend] [Static] Subサブルーチン名 [(仮引数,仮引数,…)]
   プロシージャ本体
  End Sub
 サブルーチンプロシージャの構文において,Public,Private,Friend,Staticは省略可能で関数プロシージャで説明した内容と同じ意味があり,以下のとおりである.
Publicすべてのモジュールのすべてのプロシージャから参照を可能にする
Privateプロシージャを記述したモジュール以外からアクセスできないようにする
Friendプロジェクト全体から参照できるがオブジェクトのインスタンスのコントローラからは参照できない
Staticプロシージャ内のローカル変数の値を保持する
 以下のプログラム例は度をラジアンに変換した値を得るための処理をサブルーチンプロシージャと関数プロシージャを用いてプログラムした例である.
 (サブルーチン・プログラム例)
Sub DegToRad(deg As Single, rad As Single)
 Dim pai As Single
 pai = 3.141593
 rad = deg / 180# * pai
End Sub
 (関数・プログラム例)  
Function DegToRad(Deg As Single) As Single
 Dim pai As Single
 pai = 3.141593
 DegToRad = Deg / 180# * pai
End Function
 関数プロシージャでは関数名を用いて値を返したが,サブルーチンプロシージャでは引数を用いて値を渡さなければならないため,度をラジアンに変換した結果である変数radが引数並びに記載されている.

7-2 サブルーチンプロシージャの呼び出し

 サブルー チンプロシージャを呼び出す方法として2つの方法がある.一つはCall文を用いる方法で,もう一つはサブルーチンプロシージャを指定する方法である.前者の場合,引数並びの前後に()を設けるが,後者の場合は()無しで指定する.
  (呼び出し方法)
 Call DegToRad( deg, rad )
または
 DegToRad deg, rad
 また,呼び出し側の引数とサブルーチン側の引数の名前は一致している必要はなく型の整合性さえとれていればよいのは,関数の場合と同じである.引数が複数の場合も同様で,名前ではなく並び順で対応関係がとられる.
  (引数の対応関係)
実引数( A,B,C,D )
     ↓ ↓ ↓ ↓
仮引数( B,D,A,C )

プログラム例7-1:度をラジアンに変換した値を得るための処理をサブルーチンプロシージャで作成する.呼び出しは,Call文を用いて行う.

7-3 サブルーチンの配列データ引き渡し

 引数により配列データをサブルーチンプロシージャに引き渡す場合,先頭アドレスを渡すことで対応関係を確保している.仮引数は,関数の場合と同様に,以下の例のように,配列の要素数を指定せず()のみを付ければよい.
  (引数が配列の場合)
仮引数→(配列名() as type, …)

プログラム例7-2:1次元配列Aを10倍してBに代入するプログラムを作成する.

プログラム例7-2は,配列サイズが3であるため,サブルーチンプロシージャ内でのループを3回に限定しているが,どのような配列サイズに対してもこのプロシージャが適用できるように汎用性を高めるためには,この「For 1 To 3」の部分を「For i = LBound(A, 1) To UBound(A, 1)」とする.ここで,LBound(A, 1) は配列Aの1次元目における下限要素番号で,UBound(A, 1)は上限要素番号を検出している.
 (汎用性を高めた場合)
Sub Add(A() As Integer, B() As Integer)
 Dim i As Integer
 For i = LBound(A, 1) To UBound(A, 1)
  B(i) = A(i) * 10
 Next i
End Sub
 配列が2次元になっても基本的な考え方は同じである.

プログラム例7-3:プログラム例7-2を2次元に拡張したプログラムを作成する.

プログラム例7-4:行列の加減
プログラム例5-7で示される行列の加算プロラムを汎用化してみる.

(注)サブルーチンの省略可能な引数
 関数と同様に,仮引数の前にoptionalが付いている場合,呼び出し時に省略することができる.「Optional x As Integer = 1」とした場合,呼び出し時に省略されるとxのデフォルト値が1になる.

プログラム例7-5:Optionalを用いた簡単なプログラム例を作成する.