Subプロシージャ

広告

Subプロシージャは今まで使ってきたとおりマクロとして呼び出すため使いました。

Sub テスト()
    Dim sum As Integer
    Dim i As Integer

    sum = 0

    For i = 1 To 10
        sum = sum + i
    Next i

    Range("A1").Value = sum
End Sub

例えば上記はとても簡単なSubプロシージャですが、目的としては現在のワークシートのセル(A:1)に、1から10までを合計した値を表示するためのものです。このようにSubプロシージャはある目的を行うために記述されたプログラムの集合のようなものです。

ここでSubプロシージャ内に記述したプログラムの中で繰り返し使われるような部分などを別のSubプロシージャに分けることができます。例えば次のプログラムを見てください。

Sub テスト()
    Dim sum As Integer
    Dim i As Integer

    sum = 0

    For i = 1 To 10
        sum = sum + i
    Next i

    Range("A1").Value = sum

    Range("A2").Value = Range("A1").Value * 2
    Range("A3").Value = Range("A2").Value * 2
End Sub

このプログラムは1から10までを加えた値をまずセル(A:1)に表示します。その後でセル(A:2)にはセル(A:1)の値を2倍したものを表示し、セル(A:3)にはセル(A:2)の値を2倍したものを表示するものです。(あまりプログラムの内容に意味はありません)。

このサンプルプログラムを次のように記述することが出来ます。

Sub テスト()
    Dim sum As Integer
    Dim i As Integer

    sum = 0

    For i = 1 To 10
        sum = sum + i
    Next i

    Range("A1").Value = sum

    otherCellSet
End Sub

Sub otherCellSet()
    Range("A2").Value = Range("A1").Value * 2
    Range("A3").Value = Range("A2").Value * 2
End Sub

今度の場合は、セル(A:2)とセル(A:3)に値をセットする部分を別の目的を行うための1つのまとまりとして別のSubプロシージャに独立させています。そしてこの別に作成したSubプロシージャを元のSubプロシージャ内から呼び出しています。

別のプロシージャを呼び出すときは、呼び出すプロシージャ名を記述するだけです。

「テスト」プロシージャはマクロとしてユーザーから直接呼び出されるために作成していますが、「otherCellSet」プロシージャは「テスト」プロシージャから呼び出されるために作成しています。もちろん「otherCellSet」プロシージャと「テスト」プロシージャは構成的に違いはありませんので「otherCellSet」プロシージャもユーザーから直接呼び出すことも可能です。

このようにプロシージャ内から別のプロシージャを呼び出すことも可能です。

別のプロシージャに分けるメリット

別のプロシージャに分けるメリットはいくつかあります。

1つ目は同一のプロシージャ内で同じ処理が何度も発生する場合です。例えばある複雑な計算を何度もする場合、同じコードを何度も記述する代わりに計算だけをするプロシージャを用意しておき、必要に応じて呼び出すようにすれば1度プロシージャを記述するだけで済みます。(別のページで実際に試してみます)。

2つ目は1つのプロシージャ内にあまりにも多くのプログラムが記述されていると分かりにくくなってしまうため、個々の目的別にプロシージャを分けることで、この部分は何を目的としたプログラムなのかということが明確になることです。

3つ目は複数のプロシージャで同じことをするプログラムがあった場合、共通のプログラムを記述した汎用的なプロシージャを1つ用意して、各プロシージャから呼び出すことで全体のコード量を削減することも出来ますし、新規にプログラムを作成する場合に既に用意してある小さな目的別のプロシージャを利用することで開発期間が短くすることができます。

ここでは複数のプロシージャから共通して利用される汎用プログラムのサンプルを試してみます。

testsub1.bas

Sub テスト()

    Dim sum As Integer
    Dim i As Integer

    sum = 0

    For i = 1 To 10
        sum = sum + i
    Next i

    Range("A1").Value = sum

    otherCellSet

End Sub

Sub テスト2()

    Dim multiply As Integer
    Dim i As Integer

    multiply = 1

    For i = 1 To 5
        multiply = multiply * i
    Next i

    Range("A1").Value = multiply

    otherCellSet

End Sub

Sub otherCellSet()

    Range("A2").Value = Range("A1").Value * 2
    Range("A3").Value = Range("A2").Value * 2

End Sub

上記にはユーザーから呼び出される「テスト」プロシージャと「テスト2」プロシージャがあり、そしてこの2つのプロシージャから呼び出される「otherCellSet」プロシージャがあります。

まず「テスト」プロシージャをマクロとして呼び出してみます。

汎用プロシージャ

「テスト」プロシージャではまず1から10までを加えた数をセル(A:1)に表示し、その後で「otherCellSet」プロシージャを呼び出しセル(A:2)とセル(A:3)に値を表示しています。

次に「テスト2」プロシージャをマクロとして呼び出してみます。

汎用プロシージャ

「テスト2」プロシージャではまず1から5までを掛け算した数をセル(A:1)に表示し、その後で「otherCellSet」プロシージャを呼び出しセル(A:2)とセル(A:3)に値を表示しています。

このように共通して利用されるプログラムは別のプロシージャとして分離してうえで、色々なプロシージャから呼び出す事が出来ます。

ちなみに同じモジュールに複数のプロシージャを記入する場合には、続けて記述して頂ければ結構です。複数のプロシージャを1つのモジュールに記述すると自動的にプロシージャとプロシージャの間には横線が表示されるようになります。

汎用プロシージャ

別のプロシージャを呼び出した時の処理の流れ

他のプロシージャを呼び出した時の処理の流れがどうなるのかを確認しておきます。次のサンプルで見ていきます。

Sub テスト()
    Range("A1").Value = "東京都"

    sample

    Range("A3").Value = "福岡県"
End Sub

Sub sample()
    Range("A2").Value = "大阪府"
End Sub

上記のサンプルは、まず「Range("A1").Value = "東京都"」が実行されます。

そして「sample」プロシージャが呼び出されますのでいったん「sample」プロシージャへ処理が移り「Range("A2").Value = "大阪府"」が実行されます。

「sample」プロシージャ内の処理が全て終わると元々プロシージャを呼び出した「sample」と書かれた行の次の行へ処理が移りますので「Range("A3").Value = "福岡県"」が実行されます。

このように別のプロシージャを呼び出した場合、いったん呼び出したプロシージャへ処理が移りますが、そのプロシージャ内の処理が全て終わると、元のプロシージャ内で別のプロシージャを呼び出した行の次の行へ処理が移ります。

Excel VBA入門の他の記事を見てみる

( Written by Tatsuo Ikura )

関連記事 (一部広告含む)