VBAオジサンのらくがき帳

#10 Subプロシージャと Functionプロシージャ

2021-03-13 00:00:00

これまでマクロを作るときにはSubとEnd Subの間に、コードを記述していくことを見てきました。このSubからEnd SubのまとまりのことをSubプロシージャといいます。一連の処理をまとめたもののことと考えてもらえればいいと思います。

Subプロシージャは直接マクロとして利用される場合もありますが、他のSubプロシージャやFunctionプロシージャ(後述)から呼び出して使うこともできます。それによって、複数のプロシージャで共通して使われている処理を1つにまとめたり、行数が多くなりすぎたプロシージャを分割して見やすくしたりすることが可能です。

次の例を見てもらえればわかりやすいと思います。

例1 SubProcA、SubProcBで共通に使われる処理をSubProcCに定義する。

Sub SubProcA()
    '独自処理A
    SubProcC
End Sub

Sub SubProcB()
    '独自処理B
    SubProcC
End Sub

Sub SubProcC()
    '共通処理
End Sub

例2 SubProcAの処理を分割して、SubProcBとSubProcCに詳細処理を移す。

Sub SubProcA()
    SubProcB
    SubProcC
End Sub

Sub SubProcB()
    '詳細処理B
End Sub

Sub SubProcC()
    '詳細処理C
End Sub

例のようにコード中に他のプロシージャ名をいれることで、プロシージャの呼び出しを行うことができます。Callステートメントを用いて書く方法もありますが、そのときにはプロシージャ名のあとに()が必要となります。

マクロで自動化したい処理は、単純な処理でなければ、すべて一つのSubプロシージャの中に記述するのではなく、他のプロシージャなどに分割して組み立てるようにしたいです。

呼び出されるプロシージャで処理に必要な情報などを渡すためには、下のようにプロシージャに受け取る値(パラメータ)を設定します。これにより呼び出し側から、引数(ひきすう)を受け取って処理に使うことができます。

Sub SelectCell(addr As String)
    Range(addr).Select
End Sub

下のように引数を指定してサブプロシージャを呼び出すとA1セルが選択されます。

SelectCell "A1"

Subプロシージャとよくにた似た仕組みで、Functionプロシージャというものがあります。サブプロシージャとの違いは、計算結果などの値を呼び出した処理に返すかどうかです。例えば、数字のxとyを足して結果を返すFunctionプロシージャは下のように書くことができます。返す値はプロシージャ名に対して設定します。

Function AddTwoValues(x As Integer, y As Integer)
    AddTwoValues = x + y
End Function