だれかのなにかに役立てるウェブ制作者YoTaの趣味ブログ

Excel VBA 標準モジュールとクラスモジュールの違い

標準モジュールとクラスモジュールの二つにはそれぞれに違いがあり、結論としては、基本は標準モジュールを使用すればOKで、オブジェクト指向の設計をする場合はクラスモジュールを利用する、という感じです。詳しくは下記にまとめてみました。

Excel VBA 標準モジュールとクラスモジュールの違い

最初は戸惑います

ExcelのVBEにおいて、VBAを記述する際、ワークシート・ワークブックなどのモジュールに書き込まず、基本的には標準モジュールを設置して記述します。

ただ、新規にモジュールを追加しようとすると、標準モジュールとクラスモジュールの二種類が出てきて、ちょっと迷ってしまいます。

vba_mj1

VBAでは基本的に標準モジュールを使えばOK

VBAの記述では、基本的に標準モジュールを使うと覚えてOKです。エクセルの操作をあれこれ実現したいだけであれば、標準モジュールに記述すれば、ほとんど可能だからです。

標準モジュールの要点
・標準モジュールで定義したフィールドおよびメソッドはクラススコープとなる
・標準モジュールではオブジェクト生成、newによるインスタンスはできない。(クラスモジュールを利用してのオブジェクト生成、newによるインスタンスは可能です。)

要するに、オブジェクト指向の設計が必要でなく、単にエクセル作業をマクロで自動化したいなどのニーズであれば、定数・ユーティリティを作成するだけですので、標準モジュールの利用だけでコト足りるということです。(javaでいうところのmain void~みたいな感じです。)

クラスモジュールはオブジェクト指向設計の実現に利用する

オブジェクト指向の設計をしない場合、クラスモジュールを使う必要がありません。VBAでは、Workbook、Worksheet、Rangeの三種のオブジェクトが用意されていますが、これ以外に、新たにオブジェクトの概念を追加しようとする場合、クラスモジュールを利用する必要があります。

クラスモジュールの要点
・クラスモジュールではオブジェクト生成(newによるインスタンス)ができる
・クラスモジュールで定義したフィールドおよびメソッドはインスタンススコープとなる(オブジェクトごとに持つ値)
・その他、あれこれVBAならではの制限アリ

Javaなどを使っている人であれば、VBAのマクロ作成時にオブジェクト指向の感じで作っていくと扱いやすいのかなと思います。逆にオブジェクト指向をよく分からない人は、クラスモジュールを利用せず、体当たり的に標準モジュールにコード記述していけば良いかと思います。

とはいえ、コンストラクタの引数が取れなかったり、継承クラスが非推奨だったりの制限があるので、こだわってオブジェクト指向の設計をしたいのであれば、いっそjava側で実装してしまったほうが良いのでは・・・とも思ってしまいますが、まあケースバイケースなのかと思います。

ワークシート・ワークブックなどのモジュールでなく、標準モジュールを使う理由

ワークシート・ワークブックなどのモジュールに書き込むと、エラーが発生した時、コードのどこに問題があったか調べることができません。対して、標準モジュールに書き込んだ場合、デバッグ時、エラーが出た時に該当するコードの箇所がカンタンに追跡できます。これだけでも標準モジュールを使った方が便利なことは分かるかと思います。

また、ワークシートなどに書き込んでしまうと、シートの切り換えなどで不都合が起きかねないので、やはり概念上、上位のポジションにある標準モジュールで管理したほうが良いように思います。

まとめ

VBAでは基本、標準モジュールと覚えておけばOKかと思います。正しく知識を得たい人は、いったんオブジェクト指向を学んでからVBAの勉強をすると効率的だと思います。

ページ上部に戻る