VBAを触り始めたとき、「プロジェクト」「モジュール」「プロシージャ」という用語に戸惑った経験はありませんか。
「とりあえず標準モジュールを追加して」と言われたものの、そもそもモジュールが何なのか分からない。そんな状態でコードを書き始めると、どこに何を書けばいいのか迷い続けることになります。
この記事では、VBAの3つの構成要素であるプロジェクト・モジュール・プロシージャの違いと役割を、会社組織の比喩や具体的なコード例を交えて解説します。それぞれの関係性を理解すれば、コードの整理がぐっと楽になりますよ。
VBAのプロジェクト・モジュール・プロシージャとは?3要素の関係
VBAの構成は「入れ子構造(階層構造)」になっています。会社組織に例えると、一気にイメージしやすくなります。
| VBAの構成要素 | 会社組織の例え | 役割 |
|---|---|---|
| プロジェクト | 会社全体 | ワークブック1つに対して1つ存在する最上位の箱 |
| モジュール | 部署(営業部・経理部など) | コードをまとめるグループ。種類ごとに役割が異なる |
| プロシージャ | 担当者 | 実際の処理内容を記述する最小単位 |
つまり、プロジェクトの中にモジュールがあり、モジュールの中にプロシージャがあるという3階層の関係です。
イメージとしては、次のような入れ子で覚えておくと混乱しません。
VBAProject(プロジェクト)
├── 標準モジュール(Module1)
│ ├── Sub マクロA
│ └── Sub マクロB
├── ThisWorkbook(ブックモジュール)
│ └── Workbook_Open
└── Sheet1(シートモジュール)
└── Worksheet_Change
会社で言えば、会社(プロジェクト)の中に部署(モジュール)があり、部署の中に担当者(プロシージャ)がいる構図です。担当者が実際の仕事をするように、プロシージャが実際の処理を行います。
この3階層は、VBE(Visual Basic Editor)の左側にある「プロジェクトエクスプローラー」で目で見て確認できます。VBEの画面構成について詳しくは「VBEの画面の見方を図解で解説」を参考にしてください。
なお、VBAとマクロの言葉の違いがあいまいな方は、先に「Excel VBAとマクロの違い」を読んでおくと理解がスムーズです。
プロジェクトとは|VBAの最上位の箱
プロジェクトは、VBAの構成要素の中で最も大きな「箱」です。すべてのモジュールとプロシージャは、このプロジェクトの中に収まります。
Excelのワークブック1つにつき、VBAプロジェクトが1つ自動的に作成されます。新しいワークブックを作ると、VBE上に「VBAProject (Book1)」のように表示されるのがプロジェクトです。自分でわざわざ作る必要はありません。
プロジェクトの3つの特徴
プロジェクトには次のような特徴があります。
- ワークブック1つに対して1つだけ存在する
- プロジェクトの中にモジュールやプロシージャを作成していく
- プロジェクト名はあとから変更できる(VBEのプロパティウィンドウで設定)
複数のExcelファイルを同時に開いている場合は、ファイルの数だけプロジェクトが存在します。プロジェクトエクスプローラーに「VBAProject (売上集計.xlsm)」「VBAProject (在庫管理.xlsm)」のように、ファイルごとに並んで表示されます。
プロジェクトのパスワード保護
ほかの人にコードを見られたくない場合は、プロジェクトにパスワードを設定できます。
設定手順は次のとおりです。
- VBEのメニューから「ツール」→「VBAProject のプロパティ」を選択する
- 「保護」タブを開く
- 「プロジェクトを表示用にロックする」にチェックを入れる
- パスワードを入力して「OK」をクリックする
- ファイルを保存して閉じ、もう一度開くとロックが有効になる
パスワードを設定すると、パスワードを知らない人はコードの閲覧・編集ができなくなります。
ただし、VBAのパスワード保護は簡易的な閲覧防止レベルです。解除ツールも存在するため、機密性の高い情報を完全に守る手段ではない点だけ覚えておきましょう。
モジュールとは|コードをまとめる5種類のグループ
モジュールは、プロシージャ(処理)をまとめるためのグループです。会社組織で言えば「部署」にあたります。
プログラムが大きくなるほど、モジュールは増えていきます。小さな会社は部署が少なくても回りますが、大企業になると部署が細かく分かれますよね。VBAでも同じで、規模に応じてモジュールを分けて整理していきます。
5種類のモジュールと使い分け
VBAには5種類のモジュールがあります。まずは「標準モジュール」だけ覚えておけば、基本的な作業は問題ありません。残りは、必要になったときに見返せば十分です。
| モジュール | 主な用途 | 使用頻度 |
|---|---|---|
| 標準モジュール | 通常のマクロを記述する場所 | 高(最もよく使う) |
| ブックモジュール | ワークブックのイベント処理 | 中 |
| シートモジュール | ワークシートのイベント処理 | 中 |
| フォームモジュール | ユーザーフォームの操作処理 | 低〜中 |
| クラスモジュール | 独自のオブジェクト定義 | 低 |
なお、ブックモジュールとシートモジュールは、内部的には「ドキュメントモジュール」という同じ仲間に分類されます。ただ初心者のうちは、別々のモジュールとして覚えたほうが用途を区別しやすいです。
標準モジュール|まずはここに書けばOK
基本的にマクロは、この標準モジュールに記述します。
VBEの「挿入」メニューから「標準モジュール」を追加して使います。追加すると、プロジェクトエクスプローラーに「Module1」が表示されます。
「マクロの記録」機能を使った場合も、生成されたコードはこの標準モジュールに自動で記録されます。マクロの記録について詳しくは「Excelのマクロの記録の使い方」をご覧ください。
Sub サンプルマクロ()
MsgBox "これは標準モジュールに書いたマクロです"
End Sub
標準モジュールに書いたSubプロシージャは、Excelの「マクロ」ダイアログ(Alt+F8)に一覧表示されます。そこから選んで実行できるので、初心者はまず標準モジュールを使えば困りません。
ブックモジュール|ブックを開いたときに動かす
ブックモジュールには、ワークブックに対するイベント処理を記述します。
「ワークブックを開いたときに自動で処理を実行したい」といった場面で使います。プロジェクトエクスプローラーの「ThisWorkbook」をダブルクリックすると開けます。
Private Sub Workbook_Open()
MsgBox "ファイルが開かれました"
End Sub
このコードを記述すると、ファイルを開くたびにメッセージが表示されます。ほかにも、保存前に処理を走らせる Workbook_BeforeSave などのイベントが用意されています。
シートモジュール|セルの変更に反応させる
シートモジュールには、特定のワークシートに対するイベント処理を記述します。
「セルの値が変更されたら自動で処理を実行したい」といった場面で使います。プロジェクトエクスプローラーの「Sheet1」などをダブルクリックすると開けます。
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$1" Then
MsgBox "A1セルが変更されました"
End If
End Sub
シートモジュールはシートごとに用意されています。Sheet1に書いたイベントはSheet1でしか動かない点に注意しましょう。
フォームモジュール|入力画面の操作を制御する
フォームモジュールは、ユーザーフォームの操作を記述する場所です。
ユーザーフォームとは、独立したウィンドウを表示して、ボタンやテキストボックスなどのコントロールを配置できる機能です。「ボタンをクリックしたらこの処理を実行する」といった操作を、フォームモジュールに記述します。
Private Sub CommandButton1_Click()
MsgBox "ボタンがクリックされました"
End Sub
入力フォームを作って、データ入力の手間を減らしたいときに活躍します。
クラスモジュール|独自の部品を作る上級者向け
クラスモジュールは、独自のオブジェクト(データと処理をまとめた部品)を定義するためのモジュールです。
「オブジェクト指向プログラミング」という考え方を使いたい場合に活用します。業務効率化レベルのマクロ開発では使う機会は少ないですが、大規模なプログラムで同じ構造のデータを繰り返し扱う場合に便利です。
まずは存在を知っておく程度で問題ありません。必要になったタイミングで学習すれば十分です。
プロシージャとは|処理を実行する3種類の最小単位
プロシージャは、実際の処理内容を記述する最小単位です。モジュールの中にプロシージャを書いて、はじめてマクロが動作します。会社組織で言えば「担当者」にあたります。
3種類のプロシージャと使い分け
VBAのプロシージャには3つの種類があります。
| プロシージャ | 特徴 | 使用頻度 |
|---|---|---|
| Subプロシージャ | 処理を実行する。戻り値なし | 高(最もよく使う) |
| Functionプロシージャ | 処理を実行して結果を返す。戻り値あり | 中 |
| Propertyプロシージャ | クラスモジュールでプロパティを定義する | 低 |
Subプロシージャ|マクロの基本形
基本的にマクロは、このSubプロシージャで作成します。
Sub で始まり End Sub で終わるのが特徴です。処理を実行するだけで、結果(戻り値)を返しません。
Sub 挨拶する()
MsgBox "こんにちは!"
End Sub
マクロの実行は、VBEでF5キーを押すか、Excelの「マクロ」ダイアログ(Alt+F8)から選んで実行します。なお、Alt+F8の一覧に表示されるのは、引数のないPublicなSubプロシージャだけです。
Functionプロシージャ|結果を返したいとき
Functionプロシージャは、処理を実行した結果を呼び出し元に返せます。この「返す値」のことを戻り値といいます。
たとえば「消費税を計算する」という処理を作る場合、計算結果を戻り値として返せると便利ですよね。
Function 税込計算(金額 As Long) As Long
'--- 金額に1.1を掛けて税込価格を返す ---
税込計算 = 金額 * 1.1
End Function
Sub テスト()
Dim 結果 As Long '計算結果を入れる変数
結果 = 税込計算(1000) '税込計算を呼び出す(結果は1100)
MsgBox "税込金額は " & 結果 & " 円です"
End Sub
Functionプロシージャは、同じ計算を何度も繰り返す場面で特に役立ちます。処理を1つにまとめておけば、金額を変えるだけで使い回せます。
さらに、Functionプロシージャは「ユーザー定義関数(UDF)」としてワークシートのセルから呼び出すこともできます。セルに =税込計算(A1) のように入力すれば、自作した関数をSUMやIFと同じ感覚で使えます。
Propertyプロシージャ|クラスとセットで使う
Propertyプロシージャは、クラスモジュールとセットで使うプロシージャです。
クラスモジュールで定義したオブジェクトのプロパティ(属性)を取得・設定するときに使います。Property Get(取得)と Property Let(設定)を組み合わせて記述します。
業務効率化レベルでは使う場面はほとんどありません。ここでは存在だけ覚えておけば十分です。
Sub・Functionの使い分けと呼び出し方
SubとFunctionで迷ったら、次の基準で判断すると分かりやすいです。
- 処理を実行するだけでよい → Subプロシージャ
- 計算結果や判定結果を呼び出し元に返したい → Functionプロシージャ
最初のうちはSubだけで十分対応できます。「結果を返したい」と感じたタイミングでFunctionを覚えれば問題ありません。
呼び出し方にも、SubとFunctionで覚えておきたい違いがあります。
- Subを呼ぶとき:引数はカッコで囲まずに書きます(例:
処理A 引数1, 引数2)。Callを付けて呼ぶ場合だけカッコで囲みます(例:Call 処理A(引数1, 引数2))。 - Functionを呼ぶとき:戻り値を受け取る場合は、引数を必ずカッコで囲みます(例:
結果 = 税込計算(1000))。
なお、Subにカッコを付けて呼ぶと、エラーになったり意図しない動作をしたりすることがあります。とくに引数が1つのときに不要なカッコで囲むと、その値は「値渡し(コピー)」として渡され、呼び出し先で書き換えても呼び出し元の変数には反映されません。「Subはカッコなし、Functionの戻り値を受け取るときはカッコあり」と覚えておくと、初心者がつまずきやすいポイントを避けられます。
VBEで階層を確認する手順(プロジェクトエクスプローラー)
ここまでの3階層は、VBEを開けば実際に目で見て確認できます。手順を順番に見ていきましょう。
手順1:VBEを起動する
Excelの画面で Alt+F11 を押すと、VBE(Visual Basic Editor)が起動します。
リボンから開く場合は、「開発」タブ →「Visual Basic」をクリックします。もし「開発」タブが表示されていない場合は、次の手順で追加します。
- 「ファイル」→「オプション」を開く
- 「リボンのユーザー設定」を選ぶ
- 右側の一覧で「開発」にチェックを入れる
- 「OK」をクリックする
開発タブの表示について詳しくは「Excel VBA 開発タブを表示する方法」を参考にしてください。
手順2:プロジェクトエクスプローラーを表示する
VBEの左上にあるツリー表示が「プロジェクトエクスプローラー」です。ここにプロジェクト・モジュールの階層が一覧表示されます。
もし表示されていない場合は、「表示」メニュー →「プロジェクトエクスプローラー」をクリックします。ショートカットの Ctrl+R でも表示できます。
手順3:標準モジュールを挿入する
コードを書く場所として、標準モジュールを追加します。
- VBEのメニューから「挿入」→「標準モジュール」を選ぶ
- プロジェクトエクスプローラーに「Module1」が追加される
- Module1をダブルクリックするとコードウィンドウが開く
このコードウィンドウにSubプロシージャを書けば、マクロを作る準備は完了です。「VBAProject(プロジェクト)→ Module1(モジュール)→ Sub(プロシージャ)」という階層が、実際に手元で再現できます。
実務でのコード整理術|モジュールの分け方
マクロが増えてくると、すべてを1つの標準モジュールに詰め込むと読みにくくなります。会社で言えば、全員が同じ部署にいて誰が何の担当か分からない状態です。
そこで、機能ごとにモジュールを分けて整理するのがおすすめです。
機能ごとにモジュールを分ける
たとえば、次のように役割でモジュールを分けると、あとから修正箇所をすぐに見つけられます。
| モジュール名の例 | まとめる処理 |
|---|---|
| mod_集計 | 売上集計・データ集計のマクロ |
| mod_印刷 | 帳票の印刷・PDF出力のマクロ |
| mod_共通 | 複数のマクロから呼び出す共通処理 |
モジュール名は、プロジェクトエクスプローラーでモジュールを選び、プロパティウィンドウの「(オブジェクト名)」から変更できます。
共通処理はFunctionにまとめる
複数のマクロで同じ処理を繰り返す場合は、その処理をFunctionプロシージャにまとめておくと便利です。1か所を直せば、呼び出している全マクロに修正が反映されます。
整理のコツは「迷ったら標準モジュールにSubで書く。同じ処理を2回以上書きそうになったらFunctionにまとめる」という流れです。最初から完璧に分ける必要はありません。
VBAをこれから体系的に学ぶ方は、学習の順番をまとめた「Excel VBA学習ロードマップ」もあわせてご覧ください。
よくある質問(FAQ)
Q. マクロの記録で作ったコードはどこに入りますか?
「マクロの記録」で生成されたコードは、自動的に新しい標準モジュール(Module1など)に格納されます。記録後にVBEを開き、プロジェクトエクスプローラーの標準モジュールを確認すると、記録された内容を見られます。
Q. モジュールはいくつ作ればよいですか?
決まりはありません。最初は標準モジュール1つで十分です。マクロが増えて読みにくくなってきたら、機能ごとにモジュールを分けていきましょう。
Q. シートモジュールに書いたマクロが「マクロ」ダイアログに出てきません
シートモジュールやブックモジュールのイベントプロシージャは、既定で Private です。Alt+F8のマクロ一覧には、Publicで引数のないSubプロシージャだけが表示されます。そのため、イベントプロシージャは一覧に出てきません。これは正常な動作です。
Q. SubとFunctionはどちらを使えばよいですか?
処理を実行するだけならSub、計算結果や判定結果を返したいならFunctionを使います。初心者のうちはSubだけで十分です。呼び出すときは、Subはカッコなし、Functionの戻り値を受け取るときはカッコありと覚えておきましょう。
Q. プロジェクト名は変更してもよいですか?
変更できます。ただし、初心者のうちは既定の「VBAProject」のままで問題ありません。複数のプロジェクトを扱うようになって、見分けがつきにくくなったら変更を検討しましょう。
まとめ
VBAのプロジェクト・モジュール・プロシージャの関係をおさらいしましょう。
| 構成要素 | 役割 | ポイント |
|---|---|---|
| プロジェクト | 最上位の箱 | ワークブック1つに1つ |
| モジュール | コードのグループ | まずは標準モジュールを使う |
| プロシージャ | 処理の最小単位 | まずはSubプロシージャを使う |
最初のうちは「標準モジュールにSubプロシージャを書く」という組み合わせだけで、十分に対応できます。
モジュールやプロシージャを機能ごとに分けて整理する習慣をつけておくと、プログラムが大きくなったときにも修正箇所をすぐに見つけられるようになります。会社組織の比喩を思い出しながら、少しずつ階層構造に慣れていきましょう。
VBAの学習を進める方は、次のステップとして以下の記事も参考にしてみてください。
- 初めてマクロを作る手順を知りたい方:「Excel VBAマクロ入門」
- VBAとマクロの違いを知りたい方:「Excel VBAとマクロの違い」
- VBAで使うファイル形式を知りたい方:「Excel VBAのファイル形式|.xlsxと.xlsmの違いを解説」
- VBAの変数について学びたい方:「VBAの変数の使い方とルールについて解説」
- 条件分岐を学びたい方:「VBA If文の使い方」
- 繰り返し処理を学びたい方:「VBA For~Next文の使い方」