SubとFunctionを使った例題

SubプロシージャとFunctionプロシージャを使った例題を考えてみましょう。複数の人の身長と体重を表にして、理想体重を計算するマクロです。理想体重は、「(身長/100)x(身長/100)x22」で計算出来ます。計算の部分はFunctionプロシージャにまかせましょう。図5は設定表のシートです。

図5:例題のシート

ボタンを押すと、理想体重を計算します。リスト7をみてください。

[リスト7]理想体重の計算(risou.xlsm)

'マクロメインルーチン
Sub risou()     '(1)
    y = 3
    Do While Cells(y, 2) <> ""
        keisan y    '(2)
        y = y + 1
    Loop
End Sub

'Subプロシージャ
Sub keisan(ByVal y)     '(3)
    a = Cells(y, 3)
    Cells(y, 5) = taizyuu(a)    '(4)
End Sub

'Functionプロシージャ
Function taizyuu(ByVal a)   '(5)
    taizyuu = (a / 100) * (a / 100) * 22  '(6)
End Function

(1)のSubプロシージャは引数がないので、マクロになります。メインルーチンです。Do Whileを使って表に書かれているすべての人の理想体重の計算を行います。

(2)はDo Whileループの中でSubプロシージャkeisanを呼んでいます。引数にはy(行番号)を設定しています。 (3)のSubプロシージャでは身長の値を読み込んで、(4)でFunctionプロシージャに渡しています。引数の渡し方は「値渡し」ByValを使用しました。各プロシージャの対応を図6に示します。

図6:マクロの図

サブルーチンを2段の入れ子にしました。後で見やすい形であれば、入れ子を何段にしてもかまいません。 例題はマクロ命令で作成しましたが、(5)を使って直接セルに書くこともできます。=sum()などと同じ要領です。ただし多くのFunctionプロシージャをシートに書くと動きが遅くなります。どちらを使って作成するかはその時の処理の流れで決まってくると思います。

引数が複数ある例題

今までの例題は引数が1個でした。複数の引数を設定する事もできます。それぞれ、ByRef/ByValどちらを使用してもかまいません。 ID、PASSを持っていいる会員の表があるとして、ID、PASSを入力して会員を検索し、検索した会員の身長から理想体重を計算するマクロを考えてみましょう。以下作成したシートの図です。

図7:例題のシート図

リスト8をみてください。

[リスト8]ID/PASS検索(search.xlsm)

Sub Search()        '(1)
    ID = Cells(15, 7)
    pass = Cells(15, 9)
    name = ""
    height = ""
    weight = ""     
    S_IdPass ID, pass, name, height, weight  '(2)サブルーチンコール
    Cells(19, 7) = name     '値設定
    Cells(20, 7) = height
    Cells(21, 7) = weight
End Sub

Sub S_IdPass(ByVal ID, ByVal pass, ByRef name, ByRef height, ByRef weight) '(3)
    name = ""
    height = ""
    weight = ""
    Cells(17, 7) = ID
    Cells(18, 7) = pass
    y = 4
    Do While Cells(y, 2) <> ""      '(4)検索
        If (Cells(y, 2) = ID) And (Cells(y, 5) = pass) Then
            name = Cells(y, 3)
            height = Cells(y, 4)
            weight = (height / 100) * (height / 100) * 22
            Exit Do
        End If
        y = y + 1
    Loop
End Sub

(1)のSearch()がマクロになります。(3)はサブルーチンです。引数は5個用意しました。ByValが2個、ByRefが3個です。それぞれ変数を設定して、(2)で呼んでいます。 (4)で検索を行い見つかった時は標準体重を計算して、もらった引数にセットしています。氏名と身長と標準体重の変数はByRefの引数で渡し、サブルーチン側でセットされたデータをメインルーチン側で表示しています。 作成したいマクロの形により、渡しかたを、ByValにするか、ByRefにするかを決めていきます。渡す個数も自由です。これが正解というのは、ありません。自由に作成してみてください。

まとめ

Subプロシージャも、Functionプロシージャも、処理全体の見通しを良くするための、大切なプロシージャです。次回は変数について説明したいと思います。

WINGSプロジェクト 横塚利津子著/山田祥寛監修
<WINGSプロジェクトについて>テクニカル執筆プロジェクト(代表山田祥寛)。海外記事の翻訳から、主にWeb開発分野の書籍・雑誌/Web記事の執筆、講演等を幅広く手がける。2009年4月時点での登録メンバは30 名で、現在も一緒に執筆をできる有志を募集中。