VBAはクラスをきちんと理解しなくても、かなりの自動化ができます。そのため、初心者にやさしい一方で、クラスの必要性を感じないため、きちんと分かっていない人も多いのではないでしょうか。クラスが使えるようになるとプログラミングの質が一皮むけてきます。丁寧に解説していきますので頑張っていきましょう。
目次
クラスを使うためのオブジェクトとメソッドの前提知識を整頓する
クラスとオブジェクトについて
オブジェクト:そこに実態のあるモノ。(例えば、Rangeオブジェクト)
確認のために、オブジェクトブラウザーを開きます。
表示⇒オブジェクトブラウザー
Rangeを検索してクリックすると、右に'Rangeのメンバー'が表示されます。
右に出てくるメンバーからおなじみのCellsをクリックすると下のキャプチャの説明が表示されます。
ついでに、もう一個くらい調べてみたいのでよく使う(?)ClearContentsをクリック。
つまり、クラスとはプロパティやFunctionプロシジャやSubプロシジャを持つ!むむむ、オブジェクトについて調べていたはずなのにいつの間にかクラスの話になっています。ここが肝心の部分です。
クラス:オブジェクトの設計図(VBAで既存のクラスはオブジェクトと同じ名前)
「二度見してもクラスって書いてある。。。Rangeってオブジェクトだったはずなのに。。。」おそらくここが一番肝でクラスとオブジェクトがこんがらがってしまう原因です。これは、エクセルでは最初から操作できるオブジェクトはクラス名と名前が同じだからです。
つまり、Rangeクラスとは、「Rangeオブジェクトというのがありますよ。そして、そのRangeオブジェクトはCellsプロパティやClearContentsというFunctionプロシジャーという関数を持っていますよ」
と言う説明書です。クラスは説明書なので実態はありません。しかしRangeクラスとRangeオブジェクトと名前が同じなので混乱してしまったのです。
メソッドとは
オブジェクトの説明書であるクラスの中にSubプロシジャやFunctionプロシジャが記述されていることがわかりました。
この、Functionプロシジャ(独自の関数)やSubプロシジャのことをメソッドと呼びます。
ここで何となくメソッドという言葉を認識していた人は理解を改めましょう。
勘違い:メソッドとはClearContentsのようにオブジェクトを操作するモノ
正解:メソッドとはオブジェクト自身が持つプロシジャ
(例、Rangeは自分自身のValueプロパティを初期化するClearContentsというメソッドを持っている)
そこで、前述の「つまり、クラスとはプロパティやFunctionプロシジャやSubプロシジャを持つ!」をより厳密に言うと、
「クラスはどのようなプロパティやメソッドを持つかを説明するオブジェクトの説明書で、そのオブジェクトのプロパティを変更したりメソッドを実行したりしている!」のが普段、私たちがやっていることです。
そして、自分独自のクラス(自分が作りたいオブジェクトがどんなプロパティとメソッド(FunctionやSubプロシジャ)を持つのか=どんな役割をさせたいのか)を定義するのがクラスモジュールです。
そして標準モジュールで「さっき書いたクラスの説明書」のオブジェクトを作ります。
標準モジュールでオブジェクトを作ると、ようやくRange(Cells(1 , 1), Cells(1, 1)).ClearContentsのように
自分で作ったオブジェクト名.メソッド名(:プロシジャとして作る)
の形で使えるようになります。Rangeはもとから使えるようにしてあるオブジェクトと言う事です。
なお、下記のコードを実行すると、A1セルにこんにちはと表示されます。
Cells(1 , 1) = "こんにちは"
ということはこれはCellsオブジェクトでしょうか。オブジェクトブラウザでCellsを検索してみます。
Cellsクラスは見当たりません。そのかうぇありWorksheetクラスのメンバーとして(=WorkSheetクラスで定義されたWorkSheetオブジェクトの)Cellsプロパティが表示されました。つまりActiveSheet.Cells(1, 1) = "こんにちは"の略です。Cellsはオブジェクトでは無くWorksheetクラスの場所を表すプロパティである事が分かりました。このあたりも理解を難しくしていると思います。
クラスモジュールはコードの書き方の解説は多いですが、オブジェクトそのものの説明があまり多くありません。クラスモジュールを使ってクラスを作るに当たり、オブジェクトとは何のことなのかというイメージを明確に持つことによって、迷い無くクラスモジュールを使う事ができるようになります。
クラスを使う為のオブジェクトとメソッドの前提知識まとめ
- オブジェクトは実態にそこにあるモノ。例えばRangeやSheets
- クラスはオブジェクトの設計図
- VBAでは既存のオブジェクトはクラス名と同じ
- メソッドはクラスが持っているSubプロシジャやFunctionプロシジャ
<関連記事>