VBAを触り始めたとき、「プロジェクト」「モジュール」「プロシージャ」という用語が出てきて混乱した経験はありませんか?
「とりあえず標準モジュールを追加して」と言われたけれど、そもそもモジュールって何なのか分からない。そんな状態でコードを書き始めると、どこに何を書けばいいのか迷い続けることになります。
この記事では、VBAの3つの構成要素であるプロジェクト・モジュール・プロシージャの違いと役割を、具体例を交えて解説します。それぞれの関係性を理解すれば、コードの整理もぐっと楽になりますよ。
プロジェクト・モジュール・プロシージャの関係
VBAの構成は「入れ子構造」になっています。会社組織に例えると、イメージしやすいです。
| VBAの構成要素 | 会社組織の例え | 役割 |
|---|---|---|
| プロジェクト | 会社全体 | ワークブック1つに対して1つ存在する最上位の箱 |
| モジュール | 部署(営業部、経理部など) | コードをまとめるグループ。種類ごとに役割が異なる |
| プロシージャ | 担当者 | 実際の処理内容を記述する最小単位 |
つまり、プロジェクトの中にモジュールがあり、モジュールの中にプロシージャがあるという階層構造です。
VBE(Visual Basic Editor)を開くと、左側の「プロジェクトエクスプローラー」でこの階層が確認できます。VBEの画面構成について詳しくは「VBEの画面の見方を図解で解説」を参考にしてください。
プロジェクトとは
プロジェクトは、VBAの構成要素の中で最も大きな「箱」です。
Excelのワークブック1つにつき、VBAプロジェクトが1つ自動的に作成されます。新しいワークブックを作ると、VBE上に「VBAProject(Book1)」のように表示されるのがプロジェクトです。
プロジェクトの特徴
- ワークブック1つに対して1つだけ存在する
- プロジェクト内にモジュールやプロシージャを作成していく
- プロジェクト名は変更可能(VBEのプロパティウィンドウで変更)
プロジェクトのパスワード保護
他の人にコードを見られたくない場合は、プロジェクトにパスワードを設定できます。
設定方法は以下のとおりです。
- VBEのメニューから「ツール」→「VBAProject のプロパティ」を選択
- 「保護」タブを開く
- 「プロジェクトを表示用にロックする」にチェック
- パスワードを入力して「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の学習を進める方は、次のステップとして以下の記事も参考にしてみてください。
- VBAとマクロの違いを知りたい方: 「Excel VBAとマクロの違いとは?初心者向けにわかりやすく解説」
- VBAで使うファイル形式を知りたい方: 「Excel VBAのファイル形式|.xlsxと.xlsmの違いを解説」
- VBAの変数について学びたい方: 「VBAの変数の使い方とルールについて解説」
