Excel(エクセル)マクロ(VBA)モジュールとは・プロシージャとは

VBAを扱っていくとモジュールやらプロシージャやら日常生活ではおよそ使わない言葉が出てきます。そこで、ここではモジュールとプロシージャについてご説明させていただきます。

※モジュールには標準モジュールとブックモジュール・シートモジュール・フォームモジュール・クラスモジュールなどが存在しますが、ここでいうモジュールとは標準モジュールのことを指します。標準モジュール以外のモジュールについては今後記載していきたいと思います。

モジュールとは

モジュールとはVBAのプログラムを入力する場所と考えてください。

ボリュームの大きいプログラムになるとこのモジュールがいくつもあるものがあります。

モジュールを一つだけ作成し、すべてのコードをその中に記載することももちろん可能ですが、いくつかのモジュールを作成してそれぞれ使い分ける場面もたくさんあります。なぜそんなことをするのか、モジュールを分けるメリットを下記に紹介します。

モジュールを分けるメリット

モジュールを分けた場合以下のようなメリットがあります。

メリット1、システムの中で異なる機能を作る場合にコードを切り離すことができる

一つのシステムの中に組み込まれている機能は必ずしも一つの機能とは限りません。全く異なる機能を合体させて一つのシステムを構築していることが多いのです。

例えば、

  • モジュール1:WEB上のデータをエクセルに取り込んでくる機能
  • モジュール2:データを加工する機能
  • モジュール3:作成されたデータをcsv化して保存する機能

からなるシステムAがあったとします。

次に全く違うシステムBを作ろうとした際にそのシステムBがデータをcsv化して保存する機能が欲しかった場合、「そういえばシステムAを作った時にデータをcsv化して保存する機能があったな、あれを応用しよう」となればシステムAをモジュール3をシステムBにコピーしてくるだけでcsv化する機能はもう完成してしまいます。

これがモジュール1つに入っているとどこからどこまでがcsv保存するためのコードなのか、システムAをしっかり読み込まないといけなくなりますし、データの範囲が不完全だとエラーが発生し、しかもなぜエラーが発生しているのか判別が難しくなってしまいます。

そのため異なる機能を作る場合はなるべくモジュールを分けて作るようにしましょう。

メリット2、コードが読みやすくなる

メリット1にもつながりますが、複数の異なる機能を作る場合に1つのモジュールの中に2つ以上の機能のコードが混じっているとモジュールが長ーくなってしまい、非常に読みづらいコードになります。

機能が完全に切り離せる場合はモジュール自体分けた方がとても読みやすいコードになります。

モジュールの作り方

モジュールの新規作成方法です。

まずExcelのツールバーの「開発」タブから表示されるリボンの「コードの表示」をクリック

※「開発」タブがない場合は「初めてのExcel(エクセル)マクロ(VBA)の作り方」を参照

そして下の画面で挿入ボタンの右側の▼印をクリックし、「標準モジュール」をクリック

すると下のように、「Module1」が作成されます。

右側に新しく出てきた画面がモジュールのウィンドウです。

これで新しく「Module1」というモジュールを作成することができました。

プロシージャとは

プロシージャとは一つの命令文と考えてください。

例えば下記のようなSubとEndsubで囲まれた範囲のことです。

プロシージャを分けるメリット

メリット1、コードの中で同じことを繰り返す場合コードを短く読みやすくできる


Sub 実行()
    If a = b Then
        Call 処理1

    Else
        Call 処理1
        Call 処理2
    End If
End Sub
'--------------------------------------------------------
Sub 処理1()
    '処理1のコードをここに記載する
End Sub
'--------------------------------------------------------
Sub 処理2()
    '処理2のコードをここに記載する
End Sub

例えば上記ようなコードがあった場合

a=bの時は処理1のみ実行する

a=bではなかった場合は処理1と処理2を続けて実行する

としたい場合、処理1の内容を2度記述する必要がありますが、プロシージャを分けてあれば処理1の内容を何度も記述する必要がありません。また、処理1の内容を修正するときも処理1のプロシージャを修正するだけで修正が終わりますので修正漏れもありません。

メリット2、コードの使いまわしがしやすい


Sub 実行1()
        Call 処理1
        Call 処理2
End Sub
'--------------------------------------------------------
Sub 実行2()
    If a = b Then
        Call 処理1

    Else
        Call 処理1
        Call 処理2
    End If
End Sub
'--------------------------------------------------------
Sub 処理1()
    '処理1のコードをここに記載する
End Sub
'--------------------------------------------------------
Sub 処理2()
    '処理2のコードをここに記載する
End Sub

上のように内容のよく似たコード「実行1」と「実行2」があったとします。

メリット3、修正する部分を最小限にできる


Sub 実行1()
        Call 処理1
        Call 処理2
End Sub
'--------------------------------------------------------
Sub 実行2()
    If a = b Then
        Call 処理1

    Else
        Call 処理1
        Call 処理2
    End If
End Sub
'--------------------------------------------------------
Sub 処理1()
    '処理1のコードをここに記載する
End Sub
'--------------------------------------------------------
Sub 処理2()
    '処理2のコードをここに記載する
End Sub

上のように複数のプロシージャにまたがって登場してくるプロシージャ「処理1」を修正したいとします。

プロシージャを分けずそのまま記述されていたら修正する箇所が3か所になりますが、プロシージャを分けて記載してあれば「処理1」のプロシージャを修正するだけですべてのプロシージャを修正することができるので修正漏れが発生しません。

プロシージャを分けるデメリット

変数が自動では引き継げない

プロシージャを分けるとそのままでは変数の中の引数を引き継ぐことができません。

その場合次のプロシージャに引数を渡す必要があります。

その方法はこちらで解説しています。

プロシージャ間での引数の渡し方 ByRef,ByVal Excel(エクセル)マクロ(VBA)

プロシージャの作り方

プロシージャはまず「Sub プロシージャタイトル(任意の文字)」 と入力します。


sub 実行

ここまで入力した(カーソルが実行の右にある状態)ところで「エンター」キーを押すと


Sub 実行()

End Sub

自動的に上のような形に調整してくれます。

あとはこの「Sub」と「End Sub」の間にコードを記述していきます。

次のプロシージャを作成する場合は「End Sub」の下にカーソルがある状態でまた

「Sub プロシージャタイトル(任意の文字)」 と入力し、「エンター」キーを押すことで作成できます。


Sub 実行()

End Sub

Sub 処理1()

End Sub

コメント

タイトルとURLをコピーしました