VBAはどこに書いていったらいい?知っておきたいモジュールの種類

基礎から始めるVBA VBA

シリーズ前回の記事ではVBAプログラムを書くための初期設定を行いました。

VBAプログラムを書く準備が整ったら、次はVBAにプログラムを入力していきます。

VBEを起動する

まず、VBAを書く場所であるVBEVisual Basic Editor)を起動してみましょう。

タナイ
タナイ

「開発」タブ→「コード」グループ内の「Visual Basic」をクリックするとVBEが起動します。

※または、AltF11でも起動できます。

VBE起動

VBEが起動すると以下のような画面が表示されます。

VBE画面

しかし、このままでは入力画面が見当たりませんので、どこにプログラムを書けばいいか分からないですよね。

プログラムを書くための「標準モジュール」を挿入する

プログラムを書くための場所を「モジュール」といいます。これは自分で挿入する必要があります。

VBEの画面上メニューから「挿入」→「標準モジュール」を選んでみてください。

標準モジュール挿入

文字の入力できる白いウィンドウが表示されました!

標準モジュール画面

VBEのプログラムは、いま表示された「モジュール」の中に書いてきます。

タナイ
タナイ

VBAのプログラムは階層構造になっています。

プロジェクトの階層構造

今はプロジェクト=Excelのワークブックという理解でOKです。

その中にモジュールと呼ばれる「プログラムを書くためのノート」をいくつも作ることができます。

モジュールには種類がある

ところで「挿入」のメニューの中には「ユーザーフォーム」、「クラスモジュール」という項目もあったと思います。

「標準モジュール」と何が違うのでしょうか。

タナイ
タナイ

実はモジュールには大きく分けて2つの種類があります。

モジュールの大分類
  1. オブジェクトモジュール
    • ブック、フォーム、クラスなどオブジェクトに関連したモジュール
  2. 標準モジュール
    • 特定のオブジェクトとの関連づけのないモジュール

標準モジュールもオブジェクトモジュールもVBAプログラムを書くためのキャンバス的存在です。2つの違いを具体的に見てみましょう。

オブジェクトモジュール

まずは、標準モジュールの前にオブジェクトモジュールについて見ていきます。

タナイ
タナイ

オブジェクトとは、直訳すれば「モノ」です。

ここでは、ブックやシート、ユーザーフォームなどを指すと思ってください。

VBAでは、これらのオブジェクトに関連するイベントをもとにプログラムを起動させることができます。

たとえば、ブックを開いたときにプログラムを動かすことが可能です。この例では「ブックを開く」行為がイベント(=プログラム起動のトリガー)になるわけです。

ブックモジュールでは「ブック」が「○○する」「○○の状態になった時」などをイベントとしてプログラムを実行することが可能です。

フォームモジュールでは、「ユーザーフォーム」内の「チェックボックスの変化」や「ドロップダウンリストの選択項目の変化」をイベントにしてプログラムを実行できます。

クラスモジュールは少しむずかしい

クラスモジュールになるともっと複雑です。クラスは、概念的なオブジェクトだからです。

ブックモジュールやフォームモジュールは、ブックやフォームといった画面上に見えているオブジェクトの変化をイベントとしています。

それに対し、クラスモジュールでは「プログラム上の概念」をクラスとして定義するため、その変化は画面上に見える形ではないこともあります。

タナイ
タナイ

クラスモジュールは上級者向けなので、今は「そんなものがあるんだ」程度の認識で大丈夫です。

オブジェクトモジュールにはオブジェクトが必要

オブジェクトモジュールでは対象とするオブジェクトのイベントをトリガーとしてプログラムを動作させることが可能です。

ただ、イベントを監視するためには当然ながら「オブジェクトそのもの」がなくてはなりませんよね。

そのため、オブジェクトモジュールは対象とするオブジェクトがなければ作成することができないようになっています。

タナイ
タナイ

逆に言うと、オブジェクトが削除されるとオブジェクトモジュールも同時に削除されてしまうということです。

標準モジュール

オブジェクトモジュールは、オブジェクトのイベントをトリガーにプログラムを起動させられるという機能があることを説明しました。

その反面、オブジェクトの削除時には一蓮托生で削除されてしまうモジュールは時として不便です。プログラムによってシートを削除したら、そこに書いていたプログラムまで一緒に消えてまった、ということにもなりかねません。

タナイ
タナイ

そこで標準モジュールの出番です。

標準モジュールに書いたプログラムは特定のオブジェクトに依存することなく、それ単体で存在することができます。

オブジェクトの有無を考えず自由にプログラムを書くことができるので、初めてVBAを書く場合は「標準プロシージャ」を使うのが正道でしょう。

【上級編】標準モジュールではPublic宣言ができる

タナイ
タナイ

初心者の場合、プログラムは「標準モジュール」に書けばOKということがわかっていれば、まず問題がありません。

以下では、標準モジュールにしかないメリットについて述べていますが、初心者にはむずかしい部分なので今は読み飛ばしてしまっても大丈夫です。

「プログラムによってオブジェクトを削除したらそこに書いてあるプログラムごと削除されてしまった!」ということが標準モジュールでは基本的には発生しません。

そう言うと中には、「でも、プログラムによって標準モジュール自体を削除するならオブジェクトを削除するのと同じことじゃないの?」と思う人もいるでしょう。

ですが、それは基本的には起こりません。

なぜなら、初期設定ではプログラムによって標準モジュールを削除しようとすると以下のような警告が出てプログラムが強制終了するようになっているからです。

HRESULT = 0x800A17B4 (-2146822220) "プログラミングによる Visual Basic プロジェクトへのアクセスは信頼性に欠けます"

この「プログラム実行中に削除されない」という安全性から、標準モジュールには同一プロジェクト内のどこからでも参照できる変数等(=Public構造体)を定義することができます。

仮にオブジェクトモジュールでもPublic宣言を可能としてしまうと、どこからでも参照されうる値がオブジェクトごと消えて実行中のプログラムがエラーになるということが容易に想像できることでしょう。

Publicについては、「スコープ」という概念の理解が重要になってきますので、また別の記事で解説します。

コメント

タイトルとURLをコピーしました