はじめに

マクロの作成にはSubプロシージャを使い、「Sub 呼び出し名()・・・End Sub」の中(・・・の所)に書くという説明をしてきました。プロシージャとは、させたい一連の作業の中の最小単位を言います。 マクロの処理がだんだん大きくなって、Subプロシージャが長くなってしまうと、後から修正や追加を行いたくなったとき、自分で書いた処理なのに、当時どんな意図で作成したかわからなくなってしまうことが、よくあります。

一つの処理を一つのプロシージャにまとめ、メインの処理のところで、作成したプロシージャを呼べれば、メインの処理がすっきりとまとまり、後で見ても、何をやっているマクロかひと目でわかるようになります。一般にメインの処理を書いているところをメインルーチン、メインルーチンから呼び出される処理をまとめたものをサブルーチンと呼んでいます。VBAの場合、ユーザーが呼び出すマクロ名を書いたプロシージャがメインルーチンになります。 今回サブルーチンの書き方に注目して説明して行きたいと思います。

ゼロからはじめるVBA - 基本編
ゼロからはじめるVBA - VBA事始め編
ゼロからはじめるVBA - セル操作編
ゼロからはじめるVBA - 条件による分岐編
ゼロからはじめるVBA - 繰り返し処理編
ゼロからはじめるVBA - ユーザーフォーム編
ゼロからはじめるVBA - マクロの記録を使った例題編
ゼロからはじめるVBA - 数値関数編
ゼロからはじめるVBA- 文字列関数編(1)
ゼロからはじめるVBA - 文字列関数編(2)
ゼロからはじめるVBA - 日付/時刻関数編
ゼロからはじめるVBA - その他の関数編

サブルーチンの書き方は、Subプロシージャ、Functionプロシージャの2種類があります。Subプロシージャは値を返さないプロシージャ、Functionプロシージャは値を返すプロシージャです。プロシージャの呼び出し方が違います。下図のようになります。

図1:プロシージャの呼び方

Subプロシージャは直接名前を呼びます。Functionプロシージャは値を返すので変数で受け取る形になります。詳しく見ていきましょう。

値を返さないプロシージャ

まず、Subプロシージャについて説明します。書き方は以下のリスト1をみてください。

[リスト1]Subプロシージャの書き方

Sub 呼び出し名(引数)
  ・・・ここに処理を書きます
End Sub

書き方はメインルーチンと似ています。メインルーチンは呼び出し名のあとの()には何も書いてありませんでした。今回は、呼び出し名(引数)と書いてあります。作成したサブルーチンに、ある値を渡して処理をさせたいとき引数に、渡す値を設定することができます。メインルーチンと同じく、引数がないものでも大丈夫です。

マクロといわれるプロシージャはSubプロシージャの引数が無いものです。内容は同じものと考えて良いと思います。

メインルーチンからサブルーチンを呼ぶ

あるセルに数値を入れてボタンを押すと、入力した数値の二乗の値をセルに表示する例題を考えてみましょう。以下は作成した例題のシートの図です。

図2:例題シート図

セルB2に数値を入れてボタンを押すとセルB4に二乗の値が表示されます。リスト2をみてください。

以下説明するリストはsample.lzhの中に収録しています。サンプルとしてご活用ください。

[リスト2]サブルーチンを呼ぶ例題(Sub_rei1.xlsm)

Sub Main()  '(1)
    a = Cells(2, 2)
    Zizyou a    '(2)
End Sub

Sub Zizyou(b)   '(3)
    Cells(4, 2) = b * b
End Sub

(1)がメインルーチン、(3)がサブルーチンです。サブルーチンの呼び方は(2)のようにサブルーチン名を書き、引数をセットします。今回変数名aに入力値が入っているので、変数名aを指定しました。

(2)の引数は変数名a、(3)のサブルーチンで指定している引数は変数名bです。渡す側の変数名と受け取る側の変数名は違ってもよいことになっています。メインルーチンは変数名aを用意し、サブルーチン側は変数名bを指定して引き渡します。サブルーチンは変数名bにセットしてある値を二乗して、セルB4に答えを書き込みます。サブルーチンの処理はこれで完結となります。

今回の例題は二乗計算のみのサブルーチンでしたが、もう少し複雑な計算式の場合や、あちこちで同じ処理をしなくてはいけない時など、サブルーチンにして、複数個所で呼び出すことができれば、後のメンテナンスが楽になると思います。