クラスモジュールに関しては、ここ3年は、ライフワークになっています。
仕切りは高いですが、丁寧に読み解いていくことが大切です。
今回は、どこよりもわかりやすく解説します。
目次
クラスモジュールを解説する
こんにちは。伊川(@naonaoke)です。
最近、クラスモジュールにハマっています。
思えば、3年前くらいに、YouTubeのご視聴者様から、質問が来たのがキッカケでした。
クラスモジュールって、何が便利なの?
ネット上でも、クラスモジュールに関しては、一言では言えないが、利用するとこの上なく便利と書いてあります。
しかし、インスタンスだの、設計図だの、メンバだの・・・・・・
この時点で、仕切りが、すでに高いですね。
ここを、読み解かないことには、先に進めないです。
そんなある日、アメブロで、クラスモジュールを利用して、
Excelのユーザーフォームで、電卓を作成するコードを見つけました。
そのコードを利用して、なんとなくですが、ACCESSで計算フォームを作成しました。
この内容を今回は詳しく解説します。
このブログはこんな人にお勧め
- クラスモジュールを利用したいと考えている人
- クラスモジュールが、何かわからない人
- クラスモジュールの説明で、たい焼きの説明に飽きている人
このブログを、読み終わるころには・・・・
正直言いますが、今回の説明で、すべてを理解したと、私は思っていません。
また、私には、師匠もいないので、正しいかもわかりません。
しかし、書籍を読み、コードを眺めて作成しました。
みなさんの、理解に役立てば、幸いです。
クラスモジュールってなに?
まず、クラスモジュールにクラス(タイヤキの器)を作成する。
そして、標準モジュール(器)上でNewキーワード(材料)を使ってクラスを変数に代入すると、
の変数はクラスの設計図通りのオブジェクト(タイヤキ)となる。
すると、VBAはそのオブジェクトを操作したり、
オブジェクトに対して発生したイベントを処理できるようになるわけだ。
「インスタンス」という概念を覚えておこう。
タイヤキの型があれば、同じタイヤキをいくつも作ることができる。
同様に、クラスがあれば、そこからは同じオブジェクトをいくつも作ることが可能なのだ。
このように、ひとつのクラスからいくつでも複製されるオブジェクトのことを「インスタンス」と呼ぶ。
私が、最初に出会ったクラスモジュールの説明です。
このブログで何度も言いましたが、この説明で理解できたら天才です。
そして、やがて、クラスモジュールは、人間の設定について説明が始まります。
はっきり言いますが、その説明は、実務では利用しないと思います。
同じような処理、似たような処理を行うときに、クラスモジュールは、威力を発揮します。
人間の設定、ゲームキャラの設定では、自分で、クラスモジュールのコードを書こうと思いません。
このWithEventsを利用できるようになると、クラスモジュールは、面白くなります。
まだ、ブログでは紹介していませんけどね。
オブジェクト指向ってなんだ?
カンタンに言うと、プログラマーが、勝手にオブジェクトをつくっちゃいなよ。ってことです。
理由は、後から、便利だから
だけど、ここで挫折します。
要するに、上の図のようなことです。
完成形を一気に記載した場合ですが、エラーが発生した場合は、どの部分で、エラーが発生しているのか、特定が難しくなります。
しかし、パーツで組み合わせた場合は、エラーの特定が、用意になります。
また、数人で作業を分担することも可能でしょう。
まずは、この図を理解しましょう。
今回のサンプルで言うならば その1
この図を見て、私が思い浮かんだものは、子供の頃にテレビでよく見た合体ロボットを思い浮かべました。
左側の各機種が、航空力学を無視して、身長57m、体重550tのコンバトラーⅤを形成します。
超電磁ヨーヨー、超電磁竜巻、超電磁スピンを駆使して、悪を倒します。
コンバトラーⅤが故障したときは、故障した、5つ機種のうちの1つを修理すれば良いことになります。
合理的ですよね。
そういえば、ガンダムも、コアファイターを基軸に、上半身と、下半身に分かれます。
今回のサンプルで言うならば その2
ここで、数字が入力された瞬間に、数量と、単価のプロパティが設定されます。
Rangeと同じように扱えるようなものを、プログラマーで作成できるのがすごいですね。
このように、lngTanka、lngSuryo を経由して、保存と呼出ができるようになるのです。
今回
のサンプルで言うならば その3
lngTankaとlngSuryoを掛け算させて、
合計の値を、戻り値のlngKekkaに返す。
戻り値とは、掛け算によって計算された値です。
そして、単価、または、数量が、未入力であれば、戻り値は、 vbNullStringを返します。
インスタンスってなに?
インスタンスは、同じものではなく、区別することができます。
たい焼きのイメージが強いと、あたかも、設計図によって同じものが出来そうな気がします。
ここが重要
インスタンスは、設計図から、同じようなモノが生成されると思うが、結果が異なる場合があるのです。
65×858=55770
35×52=1820
55770と、1820では違いますよね。
多分、これは便利です。
作成されたインスタンスを、変数で管理できるということは、クラスモジュールのプロパティによって作成された、インスタンスを、
変数レベルで、自由に操作できるからです。
一般的には、インスタンスが、ハコに入れて管理すると表現されます。
しかし、この変数をネームタグと同じとイメージができれば、いいのではか?
このように考える事ができます。
何が便利って、Gokei_1~、Gokei_31まで足し算すれば、月間の売上が、アットいう間に求めることができます。
1次関数と同じこと
y=ax+bに、赤まるの値を代入すれば、正しく値は、算出されます。
クラスモジュールは、要するに、赤まるを、自由に呼び出せるかです。
ここがポイント
最近、新しい競馬のアプリを作成しています。
世界で、一番頭の良い電卓が、ACCESSと言いまいしたが、カンタンな計算なら、ACCESSに実行させます。
その計算結果をExcelへ転送するという考え方をします。
ACCESSが、クラスモジュールの代わりを行い、さらに、複雑な計算は、Excelで実行する、
練習のかねて、その計算式は、ワークシート関数を利用せず、クラスモジュールで実行するように、コードが記載できれば、一石二鳥です。
まとめ
何回かクラスモジュールの説明をしましたが、今回が、自分自身で一番しっくりきました。
後は練習するのみです。
今回も最後まで読んでいただきありがとうございました。
今回のサンプルファイルは、ありません。
わからない事を延々と考えるのは、無駄です。
- なんで作動かないの?
- もうやだ!VBAなんか嫌い!
- ネットで調べても情報がない!
必ず作動するコードが、ここにあります。