エクセルでVBAをいじくると、普通、コードは標準モジュールに書きます。
でも、VBエディターのタブ”挿入(I)”を見ると、クラスモジュールもあるな。
まあ、どんな時に利用すれば役立つか、これまで全く知りませんでした。
だって、今までは標準モジュールだけを設けて、コードを書きまくりました。
そんなに、複雑なプログラムを書いた分けでもないし、困ったこともない。
ただ、折にフォームコントロールボタンの追加で、モジュールが増えていく。
そのまま書き込みますが、どこにコードを書いたのか分からなくなります。
そんな時、別のモジュールにコードを移行し、不要なのは削除しました。
こうして、モジュールを十個までに収めていたのですが、ちょっと気になる。
感覚的に、プログラムが平等に水平方向に並んでいる感じがするのよ。
コールすると、別モジュールのプロシージャを呼んで実行できたりします。
つまり、プロシージャの実行を相互に連携できて実行する感じだなあ。
じゃあ、モジュールって何なのかと言えば、プログラムの整理箱みたいか。
まあ、その程度の感想にしかならないプログラムを書いていたと言うわけ。
本当は、クラスモジュールの意義を理解する前に別の目的がありました。
それは、VBAからインターネットエクスプローラーを、先ず起動させること。
次に、内容を見たら”閉じる”ボタンを押すと、次のURLに移る仕組み。
そんな、あたかもVBAが実行を待機するコードを書いてみたくなった訳。
このため、色々とサンプルコードをネットで探してみた結果、ありましたよ。
それは、”AB型の変わり者 三流プログラマー Ken3のHP”というサイト。
前々から見知ってはいましたが、今回は、タイトルに惹かれてしまったの。
”IE アプリケーションのイベントを横取りする”って、意味が目的に近いよ。
それで、書いてあったコードを読むと、クラスモジュールを利用しています。
ただ、そのコードがかなり端折っていたりして、完全起動に苦労しました。
このモジュールを使った訳ですが、問題はWithEventsのキーワードだな。
他のサイトでは、標準モジュール内は使えない設定と説明があるんだ。
基本的にクラスモジュールで、オブジェクトに対する処理や操作をします。
そうなると、クラスモジュールには、大事な役割があったということなんだ。
詳細は、そのサイトをクリックしてもらい、他に役立つ目的はないのかな。
そう考えて新たにコードを起こすと、クラスの下層にまたクラスが呼べるの。
要するに、クラスモジュールと言うのは垂直的に連携するモジュールかも。
理由は、起動するプロシージャが、クラスモジュールを変数に扱うからだ。
つまり、クラスモジュールを使うよと言う宣言(Dim)をしないと使えません。
このため、同じプロシージャを異なるクラスに書込んでも、ぶつからない。
これって住所に近くて、丁目が標準モジュールなら、クラスは番地かもね。
要するに、ちゃんと別個であると認識させてから動かすので、問題ない。
まあ、フォルダーのパスみたいな樹形図で制御されている印象がします。
ただ問題なのは、バグが発生すると、クラスモジュールを指し示すだけだ。
実行した標準モジュールのコードから示すだけなので、記述にはご注意。
というわけで、実際に作ったサンプルコードを載せるので実験して下さい。
このクラスモジュールを使うと、オブジェクト指向のプログラミングができると書いてありましたが、要するに、開発者は自分のクラスの中で自由に関数、変数を宣言できて、作ったクラスは単体で機能することが出来なくても、標準モジュールーに呼び出されて働ける、自在性のあるサブルーチン見たいな感じかもしれないと、思ったのでもありました。
※標準モジュール1と2に記述
Sub tmp()
Dim aaa As Class1
Set aaa = New Class1
aaa.tmp
MsgBox "Standard1 or 2 module : tmp procedure"
End Sub
注:Class3から昇順で標準1・2のモジュールまでメッセージが登場する。
※クラスモジュール1に記述
Sub tmp()
Dim aaa As Class2
Set aaa = New Class2
aaa.tmp
MsgBox "Class1 module : tmp procedure"
End Sub
注:メッセージボックスの表現だけ、識別でクラス番号を変えた。
※クラスモジュール2に記述
Sub tmp()
Dim aaa As Class3
Set aaa = New Class3
aaa.tmp
MsgBox "Class2 module : tmp procedure"
End Sub
※クラスモジュール3に記述
Sub tmp()
MsgBox "Class3 module : tmp procedure"
End Sub
注:すべてプロシージャと変数宣言のタイトルが同じでも起動します。
0 件のコメント:
コメントを投稿