Mutable_Yunの業務改善ブログ

業務改善や生産性向上のブログです。自動化の手段として、VBAやRPAの勉強に役立つ解説をしています。

VBA 上級者から初段へ② 標準モジュールの役割と理想的な処理の流れ

<分かりやすいように文言修正&誤字修正&脚注追加 2019/11/02>

VBAで上級者から初段にステップアップするシリーズの2回目です。初段から二段へのステップアップも視野に入れて、コーディングの流れを意識したプログラミングを身に付けていきましょう。

この記事は上級です。
レベルについてはExcel VBAの実力(レベル)を定義してみる 初心者~三段をご参照ください。

目次

モジュールの種類の整理

上級者になって今更かよ、と思うかもしれませんが、まずはモジュールの種類と役割をおさらいしていきましょう。これまでお世話になってきた標準モジュールは最後に見て行きます。

シートモジュールとブックモジュール

まずはシートモジュールとブックモジュールです。これらはオブジェクトにくっついているモジュールで主にイベントに使うんでしたね。その本当の役割は何でしょうか?それは、そのオブジェクト特有のプロシジャを記述する事です。例えば複数のシートがあったとして、あるシートを編集するときだけはパスワードの入力が必要、と言った具合です。

フォームモジュール

ユーザーフォームの挙動を記述するのがフォームモジュールです。このモジュールに記述されたプロシジャーは他のモジュールに記述されたプロシジャから変数を受け取ることができません。あくまでユーザーフォームの挙動を制御するために使いましょう。と言っても挙動そのものを書くと言うよりは、挙動が記述されているプロシジャを呼び出す設計にするのがよりよいでしょう。

クラスモジュール

クラスモジュールは初段から二段へのステップアップで触れますので、ここでは簡単な概念の説明に留めます。クラスモジュールとはクラスを自作するためのモジュールです。これまで何度もシートを削除したりコピーしたりしてきましたよね。あのシートはオブジェクトです。オブジェクトとはモノのことです。Sheets.Addというのはシートコレクションというシートの集まりというモノ(=オブジェクト)が持っているAddというメソッドを使っています。メソッドとはプロシジャのことです。SubプロシジャとかFunctionプロシジャと同じです。

クラスというのはオブジェクトがどんなメソッドやプロパティを持っているか記述してあるものです。SheetsはAddというプロシジャを持っていて、それを実行するとこうなりますよ、と言う事です。そのクラスを自分で作るために記述する場所がクラスモジュールです。
より詳細な解説は下記リンクをご参照下さい。

標準モジュール

標準モジュールはこれらのモジュールを呼び出すなどプログラム全体の流れを制御するのが本来の使い方です。これまでは余り深く考えずにプログラムの中身を標準モジュールに記述していましたが、今後は標準モジュールの役割は処理の流れをコントロールする役割だと言うことを意識してプログラムを作成しましょう。処理は塊ごとに作っておいて、それを順に呼び出していくイメージです。このイメージが掴めると初段以降、オブジェクト指向を意識したプログラミングが可能になります。メンテナンス性も大幅に向上します。

標準モジュールで処理の流れを制御する

それぞれのモジュールの役割が整理できたので、標準モジュールの役割と処理の流れについて深掘りしていきます。それぞれのモジュールの役割と処理の流れを図示するとこのようになります。イメージとしては、売上管理と受注処理というの2種類の処理を行うの機能を持ったツールの場合です。

役割をきっちり理解した標準モジュールの設計のイメージ図
役割をきっちり理解した標準モジュールの設計のイメージ図

この図はフローチャートではありません。メインの標準モジュールが、作業の塊の標準モジュールを呼び出し、その標準モジュール内に細かく分けた処理の塊を順に呼び出していくイメージ図です。一つの作業群を一つの標準モジュールにまとめ、それぞれの作業群の処理を一つのプロシジャーにまとめて記述します。この図の内容について、事項で詳しく解説していきます。

具体的な標準モジュールの作成方法

標準モジュールはメインのものを一つだけ作ります。図で黄色くハイライトしたメインの標準モジュールの部分です。例えば、売上管理という作業と受注処理という作業のツールを作成する場合、下記の3つの標準モジュールを作ります。

  1. 流れを制御するためのメインの標準モジュール
  2. 売上管理の作業の流れをコントロールする標準モジュール
  3. 受注処理の作業の流れをコントロールする標準モジュール

標準モジュールはむやみに作ってはいけません。一つの作業の流れは一つの標準モジュールにまとめます。エクセルマクロブックが持っている機能の数+1の標準モジュールが存在するようにします。+1はどの標準モジュールを呼び出すかを決める元締め的な標準モジュールです。

売上管理の作業のための標準モジュールから受注処理の為の標準モジュール内のプロシジャを呼び出す事はしません。このため、それぞれの標準モジュール冒頭の流れをコントロールするプロシジャ以外はすべてPrivateでプロシジャを定義します。各標準モジュールの冒頭の部分だけ、メインの標準モジュールから呼び出されるようにPublicにしておきます。

そしてブックを開くなど、各標準モジュールの機能で共通の作業はクラスモジュールで作成しておき、それを各標準モジュールで使うようにします。注意点は、クラスはプロシジャを呼び出すわけではないと言う事です。クラスという動作の手順書利用して、その標準モジュール内で新しくオブジェクトを生成します。そしてそのオブジェクトを利用すると言うイメージです。このあたりは初段の講座で解説します。

まとめ

処理の流れをきちんと設計すると、複数の機能を持ったツールを作成出来るようになります。
ポイントをまとめると下記の通りです。

  • 標準モジュールは流れを制御するためのもの
  • メインの標準モジュールと機能ごとの標準モジュールを作る
  • 一つの機能は一つの標準モジュールにまとめる
  • メインの標準モジュールからそれぞれの標準モジュールを呼び出す以外は、標準モジュールから別の標準モジュールを呼び出さないようにする

これらを意識して、スパゲッティ*1と言われない、複雑な作業もすっきりとしたコードで書けるようにしていきましょう。ここができるかどうかが上級者と初段の大きな違いです。頑張っていきましょう!

*1:どのCallがどのプロシジャを呼び出しているのか分かりづらく、処理の流れがあっちに行ったりこっちに行ったりするプログラムを、絡まっているイメージから、スパゲッティプログラムと言います