目的別にモジュールを分割する方法!処理単位で整理して見やすくするテクニック
生徒
「先生、VBAでマクロを作っていたら、コードがどんどん長くなって自分でもどこに何を書いたか分からなくなってしまいました…。」
先生
「それは成長の証ですね!でも、一つの場所に全てを書き込むのは、大きな箱に洋服も書類も食器も全部詰め込むようなものなんです。」
生徒
「あ、まさにそんな感じです!どうすればスッキリ整理できますか?」
先生
「『モジュール分割』というテクニックを使いましょう。目的ごとに部屋を分ける感覚で整理すると、劇的に見やすくなりますよ!」
1. モジュール分割とは?
Excel VBAにおける「モジュール分割」とは、プログラムを機能や目的ごとに、複数の「標準モジュール」へ分けて管理することを指します。パソコンを触り始めたばかりの方に分かりやすく例えると、デスクトップにある大量のファイルを、種類ごとに「フォルダ」へ分けて入れる作業に似ています。
VBAのコード(プログラムの命令文)が数百行、数千行と増えていくと、後で修正したい場所を探すだけで一苦労です。そこで、あらかじめ「計算用の部屋」「印刷用の部屋」「データ保存用の部屋」というように分けておくことで、どこに何があるか一目で分かるようにします。この「部屋」がVBAではモジュールと呼ばれます。
2. なぜ分割が必要?整理するメリット
プログラムを分割して整理することには、見た目が綺麗になること以外にも重要なメリットが3つあります。
- 保守性(ほしゅせい)の向上: 「保守」とは、後でプログラムを直したり点検したりすることです。部屋が分かれていれば、印刷の設定を直したい時に「印刷モジュール」だけを見れば良いので、他の場所を間違えて消してしまうリスクが減ります。
- 再利用(さいりよう)が楽: 一度作った「消費税計算のプログラム」を別のExcelファイルでも使いたい時、専用のモジュールに分かれていれば、その部屋ごとコピーするだけで済みます。
- チーム開発のしやすさ: もし他の人と一緒にマクロを作る場合、「私はこのモジュールを担当するね」と分担作業がスムーズになります。
プログラミング未経験の方は、まず「将来の自分が困らないための掃除」だと思って取り組んでみてください。
3. 理想的な分割の基準:機能・処理単位
では、どのように分割すれば良いのでしょうか?おすすめは「機能・処理単位」で分けることです。例えば、業務でよくある「売上データを集計してレポートを作るマクロ」なら、以下のように分割してみましょう。
| モジュール名 | 役割・入れる内容 |
|---|---|
| mdlMain | マクロ全体の実行順序を決める「司令塔」 |
| mdlImport | 他のファイルからデータを取り込む処理 |
| mdlCalc | 合計や平均などの計算を行う処理 |
| mdlFormat | セルの色を変えたり、罫線を引いたりする見た目の処理 |
| mdlCommon | どのプログラムからも使われる共通の便利な道具 |
このように、「何をするための命令か」で名前を付けて分けるのがコツです。
4. 実践!司令塔と実務担当を分ける書き方
実際にプログラムを書いてみましょう。まずは「メイン(司令塔)」と「実際の作業(実務担当)」を分ける基本の形です。これを行うだけで、コードの読みやすさが格段に上がります。
【モジュール1:mdlMain】
' 全体の流れを管理するメインのプログラム
Sub StartProcess()
' ステップ1:準備
Call ClearOldData
' ステップ2:実行
Call InputHello
MsgBox "全ての処理が終わりました!"
End Sub
【モジュール2:mdlTasks】
' 古いデータを消す実務担当
Sub ClearOldData()
Range("A1").ClearContents
End Sub
' 挨拶を入力する実務担当
Sub InputHello()
Range("A1").Value = "こんにちは、VBAの世界へ!"
End Sub
このように、Call という命令を使って他の場所にあるプログラムを呼び出すことで、メインのプログラムを見ただけで「どんな順番で何が起きるか」が分かるようになります。
5. 汎用的なパーツを「共通モジュール」にまとめる
どのマクロでも使うような「お決まりの処理」はありませんか?例えば、「特定のセルの文字を太字にする」とか「確認メッセージを出す」といった処理です。これらを「共通モジュール(mdlCommon)」にまとめておくと便利です。
料理に例えると、どんな料理にも使う「だし」や「ソース」をあらかじめ作り置きしておくようなものです。一度作っておけば、他のマクロを作る時も Call するだけで使い回せます。
' mdlCommon:どんな時でも使える共通パーツ
Sub SetHeaderStyle(targetRange As Range)
' 指定された範囲の背景を青、文字を白にする
With targetRange
.Interior.Color = vbBlue
.Font.Color = vbWhite
.Font.Bold = True
End With
End Sub
このパーツを一つ作っておけば、売上表でも住所録でも、好きな場所でヘッダーのデザインを一瞬で整えることができます。
6. 分割したモジュールを呼び出す際のルール
モジュールを分割すると、「別のモジュールにあるプログラムを本当に呼び出せるの?」と不安になるかもしれません。基本的には Sub の前に Public(パブリック:公開という意味)と書くか、何も書かなければ、他のモジュールから呼び出すことが可能です。
逆に、そのモジュールの中でしか使わない、外から見られたくないプログラムには Private(プライベート:非公開という意味)と付けます。これは、家の「リビング」は誰でも入れるけれど、「寝室」は家族しか入らせない、という区別に似ています。
初心者のうちは、基本的には Sub だけで大丈夫ですが、大規模な開発ではこの区別が重要になってきます。
7. VBE(編集画面)でモジュールを整理・改名する方法
VBAの編集画面(VBE)で新しいモジュールを作るには、上のメニューの「挿入」から「標準モジュール」を選びます。すると「Module1」という名前が付きますが、これだと中身が分かりません。
名前を変えるには、左側の「プロジェクトエクスプローラー」で変更したいモジュールを選び、その下の「プロパティウィンドウ」にある「(オブジェクト名)」という場所を書き換えます。パソコンのファイル名を変えるのと同じ感覚で、mdl集計 のように役割を名前にしてあげましょう。
※日本語でも名前は付けられますが、プログラミングの世界では将来のトラブルを防ぐために mdlCalc のように半角英数字で付けるのが一般的です。
8. 整理整頓のタイミングと注意点
モジュールを分けるタイミングは、マクロを作り始める前でも、作った後でも構いません。おすすめは、「一つのモジュールが画面に入り切らなくなったら」です。何回もスクロールしないと下のコードが見えないようなら、それは分割のサインです。
ただし、細かく分けすぎると、今度は「どこに何があるか」が逆に分かりづらくなります。まずは「大きく3つ(メイン・実務・共通)」くらいに分けることからスタートし、自分が管理しやすい量を探ってみてください。
また、分割した際は Call で正しく繋がっているか、実行テスト(F5キーを押して動かしてみること)を忘れずに行いましょう。小まめに動かして確認するのが、エラーを最小限にする秘訣です。
9. 実際の実行結果のイメージ
モジュールを分割して実行しても、Excelのシート上での動きは一つのマクロとして動かした時と全く変わりません。しかし、マクロを実行した際の安心感や、エラーが起きた時の解決スピードは格段に上がります。
【実行結果のイメージ】
1. ボタンをクリック
2. 「データをクリアしました」というメッセージが出る
3. セルに新しいデータが入力される
4. 指定した範囲が綺麗なデザインに整えられる
5. 最後に「完了」の合図が出る
このように、裏側では複数のモジュールが連携して動いていますが、使う人(ユーザー)にとっては一つのスムーズな機能として提供されます。これがプログラミングにおける「美しい設計」の第一歩です。