プログラミングにおけるメインルーチンとサブルーチンについて
ExcelVBAでは全体を制御するメインプログラムをSubプロシージャに記述し、1つ1つのまとまった処理は部品化して別のSubプロシージャまたはFunctionプロシージャ(自作関数)に記述します。
メインプログラムをメインルーチン、部品化したプログラムをサブルーチンと呼びます。
そしてメインルーチンからサブルーチンを呼び出し全体の処理の流れを制御します。
Subプロシージャ
全体を制御するメインの処理(メインルーチン)を記述する。
また、1つ1つの処理の塊を部品化したサブルーチンを記述する。
Sub プロシージャ名()
処理
End Sub
処理の途中で抜けたい(中断する)場合は「Exit Sub」
別のモジュールのSubプロシージャを呼び出して処理する方法
Call モジュール名.プロシージャ名
同じモジュール内であれば「Call プロシージャ名」のみでOK
「Private Sub プロシージャ名」で指定すると
1.マクロの一覧には表示されない
2.別のモジュールからのプロシージャ呼び出しが不可能になる
Subプロシージャは、Privateを指定しない場合はすべてPublicとなります。
※イベントプロシージャを除いて、すべてのプロシージャは既定ではパブリック
Functionプロシージャ
引数を指定することで様々な処理結果が得られる自作関数を記述する。
また、1つ1つのまとまった処理を部品化し、サブルーチンとして利用する。
Function プロシージャ名(ByVal 引数名1 As データ型,ByVal 引数名2 As データ型,・・・) As 戻り値のデータ型
処理
プロシージャ名 = 戻り値
End Function
※戻り値にオブジェクトを指定する場合は「Set プロシージャ名 = オブジェクト」となることに注意
「ByVal」と「ByRef」の違いについて
ByVal
値渡し
Functionプロシージャ内に引数の値を渡すためだけに使用される。
(Functionプロシージャ内のみ利用可能なローカル変数)
ByRef
参照渡し
値を渡すだけでなく、その引数に指定した変数の値が変わった場合、変更後の値を取得する。
(変数の値が変更される)
※何も指定しない場合は「ByRef」(参照渡し)になる
引数、戻り値に配列を指定する方法
引数名の後に「()」を付ける
例: Function プロシージャ名(配列名() As データ型) As 戻り値のデータ型()
※引数に配列を指定する場合は全て参照渡し(ByRef)になる
理由:引数に配列を指定する場合は入れ物を渡しているためで、値を渡すようにはなっていない
Functionを呼び出す方法
戻り値なしの場合
Call Functionプロシージャ名 (他のSubプロシージャを呼び出す際も使用する)
※プロシージャ名のみでも呼び出しは可能だが、明示的に「Call」とした方がよい
戻り値ありの場合
変数名 = Functionプロシージャ名
引数ありの場合はプロシージャ名(引数1,引数2,・・)のように指定する
サブルーチンとしての考え方
メインルーチンから別のプロシージャを呼び出すことはサブルーチンを呼び出すという意味となる。
サブルーチンを呼び出す際には引数(変数)を渡すことが可能。
Sub プロシージャ名(変数名1 As データ型,変数名2 As データ型,・・)
処理内容
End Sub
呼び出す際は
プロシージャ名 変数名1,変数名2,・・
Callを使う場合は()が必要
Call プロシージャ名(変数名1,変数名2,・・)
最後に
今回はプログラムのメインとなるSubプロシージャとFunctionプロシージャ、メインルーチンとサブルーチンについての備忘録となりました。
次回はよく使うメソッドとプロパティ、各種ステートメント、構文などを記録していきます。
コメント