注意事項
- Java用語(?)が混じっているかも。
- そんなに理解している訳じゃない。
- モジュール=クラスとして読んで。
1、クラスメソッドとインスタンスメソッド、クラスフィールドとインスタンスフィールドとは
2、インスタンスメソッドとインスタンスフィールドの実装方法
3、クラスメソッドとクラスフィールドの実装方法
4、クラスモジュールについて
5、フォームモジュールについて
6、標準モジュールについて
7、参考文献
1−1、インスタンスメソッドとは
オブジェクトに対して何らかの操作をするメソッドの事です。
使用例(赤字の部分):
Sub test()
Dim r As Range
Set r =
ActiveSheet.Range("A1")
Call
r.Activate '
変数rが指し示しているオブジェクトに対してActivateメソッドを実行する
End Sub
1−2、クラスメソッドとは
以下のようなものを作るときはクラスメソッドになると思う。
- ただの関数。(例えばVBAだと、Math.Sin関数、Strings.Left関数、_HiddenModule.Array関数のよう
なもの)
- あるクラスのオブジェクトすべてに対して操作を行うメソッド。
1−3、インスタンスフィールドとは
オブジェクトの属性値。
通常、アクセス範囲をPrivateにして宣言する。インスタンスフィールドに対して参照や更新をさせたい時はProperty
Get/Let/Setプロシージャを使う。
1−4、クラスフィールドとは
以下のようなものを作るときはクラスフィールドになると思う。
- 数学定数。(例えばJavaだと、Java.langパッケージのMath.PIやMath.E。)
- メソッドの引数や返り値に使うような定数のリスト。(例えばVBAだと、xlやmsoから始まる定数。)
- クラスの属性。(例えば、あるクラスのオブジェクトの数を記憶するフィールドなど。)
VBAではクラスモジュール、フォームモジュールに定義したメソッド・フィールドはすべてインスタンスメソッド・インスタンスフィールドとなる。
標準モジュールに定義したメソッド・フィールドはすべてクラスメソッド・クラスフィールドと見なしていい、とだるまは考えている。
※Javaであればメソッド・フィールドを宣言するときにstatic修飾子をつければ、そのメソッド・フィールドはクラスメソッド・ク
ラスフィールドとなるけど、VBAでStaticをつけてもクラスメソッド、クラスフィールドにはならない。非常に困る。
クラスを作れる。
だるまは、クラス名は"cls"を頭に付けたものとするようにしている。(昔はそうでは無かったけど、今はそうしている。)
主な特徴:
- このモジュール内で定義したメソッド・フィールドはすべてインスタンスメソッド・インスタンスフィールドとなる。
で、クラスメソッド・クラスフィールドが欲しい場合はどうするかだけど、、、だるまは以下のようにしている。
クラス名が"clsXXXX"のクラスにクラスメソッド・クラスフィールドが欲しい場合、名前が"mdlXXXX"となるような標準モジュールを作り、
そこにクラスメソッド・クラスフィールドを実装する。アクセス修飾子(Public,Private)は必要に応じて変える。
- 引数ありのコンストラクタを作れない。
ダイアログを作りたいときに作るクラスで、多分MSFormsライブラリのUserFormクラスを継承していると思う。
だるまは、クラス名は"frm"を頭に付けたものとするようにしている。(昔はそうでは無かったけど、忘れていなければ今はそうしている。)
主な特徴:
- このモジュール内で定義したメソッド・フィールドはすべてインスタンスメソッド・インスタンスフィールドとなる。
で、クラスメソッド・クラスフィールドが欲しい場合はどうするかだけど、、、だるまは以下のようにしている。
クラス名が"frmXXXX"のクラスにクラスメソッド・クラスフィールドが欲しい場合、名前が"mdlXXXX"となるような標準モジュールを作り、
そこにクラスメソッド・クラスフィールドを実装する。アクセス修飾子(Public,Private)は必要に応じて変える。
- 引数ありのコンストラクタを作れない。
- クラス名が"YYY"というフォームモジュールを作ると"YYY"というグローバル変数が出来上がる。
だるまは、クラス名は"mdl"か"utl"を頭に付けたものとするようにしている。(昔はそうでは無かったけど、忘れていなければ今はそうしてい
る。)
クラスモジュールとフォームモジュールはクラスメソッド・クラスフィールドが作れないので、だるまは標準モジュールで実装することにしている。
主な特徴:
- このモジュール内で定義したメソッド・フィールドはすべてクラスメソッド・クラスフィールドと見なしていいと思う。
- このクラスのオブジェクトは作れない。モジュール内でMeキーワード(自分自身を指し示す)が使えない。
- ユーティリティクラスを作る為のもの。
- ここで定義したフィールド(モジュールレベルの変数)はエクセルが起動中の間、ずっと有効という気がする。
(クラスフィールドだから)
リンクしている箇所は別ウインドウが開きます
- CavalierLab http:
//homepage1.nifty.com/CavalierLab/index.html (リンクした日:2005/1/30)
クラスモジュール講座 http:
//homepage1.nifty.com/CavalierLab/lab/vb/clsmdl/ (リンクした日:2005/1/30)