VBAのプロジェクト・モジュール・プロシージャの違いと役割を解説

スポンサーリンク

VBAを触り始めたとき、「プロジェクト」「モジュール」「プロシージャ」という用語が出てきて混乱した経験はありませんか?

「とりあえず標準モジュールを追加して」と言われたけれど、そもそもモジュールって何なのか分からない。そんな状態でコードを書き始めると、どこに何を書けばいいのか迷い続けることになります。

この記事では、VBAの3つの構成要素であるプロジェクト・モジュール・プロシージャの違いと役割を、具体例を交えて解説します。それぞれの関係性を理解すれば、コードの整理もぐっと楽になりますよ。

プロジェクト・モジュール・プロシージャの関係

VBAの構成は「入れ子構造」になっています。会社組織に例えると、イメージしやすいです。

VBAの構成要素会社組織の例え役割
プロジェクト会社全体ワークブック1つに対して1つ存在する最上位の箱
モジュール部署(営業部、経理部など)コードをまとめるグループ。種類ごとに役割が異なる
プロシージャ担当者実際の処理内容を記述する最小単位

つまり、プロジェクトの中にモジュールがあり、モジュールの中にプロシージャがあるという階層構造です。

VBE(Visual Basic Editor)を開くと、左側の「プロジェクトエクスプローラー」でこの階層が確認できます。VBEの画面構成について詳しくは「VBEの画面の見方を図解で解説」を参考にしてください。

プロジェクトとは

プロジェクトは、VBAの構成要素の中で最も大きな「箱」です。

Excelのワークブック1つにつき、VBAプロジェクトが1つ自動的に作成されます。新しいワークブックを作ると、VBE上に「VBAProject(Book1)」のように表示されるのがプロジェクトです。

プロジェクトの特徴

  • ワークブック1つに対して1つだけ存在する
  • プロジェクト内にモジュールやプロシージャを作成していく
  • プロジェクト名は変更可能(VBEのプロパティウィンドウで変更)

プロジェクトのパスワード保護

他の人にコードを見られたくない場合は、プロジェクトにパスワードを設定できます。

設定方法は以下のとおりです。

  1. VBEのメニューから「ツール」→「VBAProject のプロパティ」を選択
  2. 「保護」タブを開く
  3. 「プロジェクトを表示用にロックする」にチェック
  4. パスワードを入力して「OK」をクリック

パスワードを設定すると、パスワードを知っている人以外はコードの閲覧・編集ができなくなります。

モジュールとは

モジュールは、プロシージャ(処理)をまとめるためのグループです。

プログラムが大きくなるほど、モジュールは増えていく傾向にあります。小さな会社は部署が少なくても回りますが、大企業になると部署が細かく分かれますよね。VBAでも同じです。

5種類のモジュールと使い分け

VBAには5種類のモジュールがあります。まずは標準モジュールだけ覚えておけば、基本的な作業は問題ありません。

モジュール用途使用頻度
標準モジュール通常のマクロを記述する場所高(最もよく使う)
ブックモジュールワークブックのイベント処理
シートモジュールワークシートのイベント処理
フォームモジュールユーザーフォームの操作処理低〜中
クラスモジュール独自のオブジェクト定義

標準モジュール

基本的にマクロはこの標準モジュールに記述します。

VBEの「挿入」メニューから「標準モジュール」を追加して使います。「マクロの記録」機能を使った場合も、コードはこの標準モジュールに記録されます。

マクロの記録について詳しくは「Excelのマクロの記録の使い方」をご覧ください。

Sub サンプルマクロ()
    MsgBox "これは標準モジュールに書いたマクロです"
End Sub

ブックモジュール

ブックモジュールには、ワークブックに対するイベント処理を記述します。

「ワークブックを開いたときに自動で処理を実行したい」といった場面で使います。プロジェクトエクスプローラーの「ThisWorkbook」をダブルクリックすると開けます。

Private Sub Workbook_Open()
    MsgBox "ファイルが開かれました"
End Sub

このコードを記述すると、ファイルを開くたびにメッセージが表示されます。

シートモジュール

シートモジュールには、特定のワークシートに対するイベント処理を記述します。

「セルの値が変更されたら自動で処理を実行したい」といった場面で使います。プロジェクトエクスプローラーの「Sheet1」などをダブルクリックすると開けます。

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$A$1" Then
        MsgBox "A1セルが変更されました"
    End If
End Sub

フォームモジュール

フォームモジュールは、ユーザーフォームの操作を記述する場所です。

ユーザーフォームとは、独立したウィンドウを表示して、ボタンやテキストボックスなどのコントロールを配置できる機能です。「ボタンをクリックしたらこの処理を実行する」といった操作を、フォームモジュールに記述します。

Private Sub CommandButton1_Click()
    MsgBox "ボタンがクリックされました"
End Sub

クラスモジュール

クラスモジュールは、独自のオブジェクト(データと処理をまとめた部品)を定義するためのモジュールです。

「オブジェクト指向プログラミング」という考え方を使いたい場合に活用します。業務効率化レベルのマクロ開発では使う機会は少ないですが、大規模なプログラムで同じ構造のデータを繰り返し扱う場合に便利です。

まずは存在を知っておく程度で問題ありません。必要になったタイミングで学習すれば十分です。

プロシージャとは

プロシージャは、実際の処理内容を記述する最小単位です。モジュールの中にプロシージャを書いて、はじめてマクロが動作します。

3種類のプロシージャと使い分け

VBAのプロシージャには3つの種類があります。

プロシージャ特徴使用頻度
Subプロシージャ処理を実行する。戻り値なし高(最もよく使う)
Functionプロシージャ処理を実行して結果を返す。戻り値あり
Propertyプロシージャクラスモジュールでプロパティを定義する

Subプロシージャ

基本的にマクロはこのSubプロシージャで作成します。

Sub で始まり End Sub で終わるのが特徴です。処理を実行するだけで、結果(戻り値)を返しません。

Sub 挨拶する()
    MsgBox "こんにちは!"
End Sub

マクロの実行は、VBEでF5キーを押すか、Excelの「マクロ」ダイアログから選択して実行します。

Functionプロシージャ

Functionプロシージャは、処理を実行した結果を呼び出し元に返すことができます。この「返す値」のことを戻り値といいます。

たとえば「消費税を計算する」という処理を作る場合、計算結果を戻り値として返せると便利ですよね。

Function 税込計算(金額 As Long) As Long
    税込計算 = 金額 * 1.1
End Function

Sub テスト()
    Dim 結果 As Long
    結果 = 税込計算(1000) '結果は1100になる
    MsgBox "税込金額は " & 結果 & " 円です"
End Sub

Functionプロシージャは、同じ計算を何度も繰り返す場面で特に役立ちます。処理を1つにまとめておけば、金額を変えるだけで使い回せます。

Propertyプロシージャ

Propertyプロシージャは、クラスモジュールとセットで使うプロシージャです。

クラスモジュールで定義したオブジェクトのプロパティ(属性)を取得・設定するときに使います。業務効率化レベルでは使用する場面はほとんどないため、ここでは存在だけ覚えておけば十分です。

まとめ

VBAのプロジェクト・モジュール・プロシージャの関係をおさらいしましょう。

構成要素役割ポイント
プロジェクト最上位の箱ワークブック1つに1つ
モジュールコードのグループまずは標準モジュールを使う
プロシージャ処理の最小単位まずはSubプロシージャを使う

最初のうちは「標準モジュールにSubプロシージャを書く」という組み合わせだけで十分に対応できます。

モジュールやプロシージャを機能ごとに分けて整理する習慣をつけておくと、プログラムが大きくなったときにも修正箇所をすぐに見つけられるようになります。

VBAの学習を進める方は、次のステップとして以下の記事も参考にしてみてください。

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