ゆんの業務改善ブログ

①生産性向上 ②業務改善 ③自動化 について情報発信しています。VBAプログラムは本当の初心者から他のアプリケーションを呼び出して使う上級者的な使い方まで幅広いレベルで解説していきます。

VBAのクラスを使う① クラスを使うためのオブジェクトとメソッドの前提知識

VBAはクラスをきちんと理解しなくても、かなりの自動化ができます。そのため、初心者にやさしい一方で、クラスの必要性を感じないため、きちんと分かっていない人も多いのではないでしょうか。クラスが使えるようになるとプログラミングの質が一皮むけてきます。丁寧に解説していきますので頑張っていきましょう。

目次

クラスを使うためのオブジェクトとメソッドの前提知識を整頓する

クラスとオブジェクトについて

オブジェクト:そこに実態のあるモノ。(例えば、Rangeオブジェクト)

確認のために、オブジェクトブラウザーを開きます。

表示⇒オブジェクトブラウザー

f:id:mutable_yun:20190910205253p:plain
オブジェクトブラウザー

Rangeを検索してクリックすると、右に'Rangeのメンバー'が表示されます。
f:id:mutable_yun:20190910210054p:plain

右に出てくるメンバーからおなじみのCellsをクリックすると下のキャプチャの説明が表示されます。

f:id:mutable_yun:20190910210451p:plain
Rangeオブジェクトのメンバー、Cellsはプロパティ

ついでに、もう一個くらい調べてみたいのでよく使う(?)ClearContentsをクリック。

f:id:mutable_yun:20190910211718p:plain
ClearContentsはFunctionプロシジャだった!

つまり、クラスとはプロパティや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を検索してみます。

f:id:mutable_yun:20190910214125p:plain
Cellsで検索

Cellsクラスは見当たりません。そのかうぇありWorksheetクラスのメンバーとして(=WorkSheetクラスで定義されたWorkSheetオブジェクトの)Cellsプロパティが表示されました。つまりActiveSheet.Cells(1, 1) = "こんにちは"の略です。Cellsはオブジェクトでは無くWorksheetクラスの場所を表すプロパティである事が分かりました。このあたりも理解を難しくしていると思います。

クラスモジュールはコードの書き方の解説は多いですが、オブジェクトそのものの説明があまり多くありません。クラスモジュールを使ってクラスを作るに当たり、オブジェクトとは何のことなのかというイメージを明確に持つことによって、迷い無くクラスモジュールを使う事ができるようになります。

クラスを使う為のオブジェクトとメソッドの前提知識まとめ

  • オブジェクトは実態にそこにあるモノ。例えばRangeやSheets
  • クラスはオブジェクトの設計図
  • VBAでは既存のオブジェクトはクラス名と同じ
  • メソッドはクラスが持っているSubプロシジャやFunctionプロシジャ

<関連記事>