|
▼ハナ さん:
こんばんは。
>>このコードは、本来はまだ問題点があります(モジュール間の結合度が強すぎる)
>同じプロジェクト内で別のUserFormでコマンドボタンコントロールを配列化していますが、そのEvent処理を別のクラスモジュールでやらせてます。
>そのへんを統合することができる・・の問題でしょうか。
Userformのコントロールのイベントプロシジャーをクラスモジュール内に記述することが
このクラスモジュールとUserformの結合度(関わり度合い)を強くしているということです。
結合度が強いとそのまま再利用すことが困難になります。
クラスの中の記述されているコントロールのイベントプロシジャーは、特定のUserform内にあるコントロールに関するコードが入っているのですから、特定のUserformとの関わりが強すぎるのです。
Userformが変わるたびにクラスのコードも変えなければなりません。
クラスって、オブジェクトの設計図ですよね?
ExcelのWorkbookやWorksheetというオブジェクトの中のコードを毎回変更しなければ使えなかったら、VBAでは使えませんよね?
本来は、クラスモジュール内に記述しているTextboxのイベントプロシジャーは、
Userform内に記述されるべきなのです。
これを可能にしたアドインを角田さんが紹介しています。
www.h3.dion.ne.jp/~sakatsu/Breakthrough_P-Ctrl_Arrays.htm
(擬似からの脱却)
これが「本来はまだ問題点があります」と申し上げた理由なのです。
が、汎用的にコントロール配列を実現するためのオブジェクトの作成は、結構大変ですから
これは取りあえずは、現行コードで良しとしましょう!!
又は、上記URLにあるアドインを利用してください。
>Private Sub myTxt_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
> Call Syori_FromTextBox(Txt)
>End Sub
>
>>>************************************************************
>>>標準モジュール
>>>Public Sub Syori_FromTextBox(objTextBox As MSForms.TextBox)
>>> objTextBox.Text = "OK"
>>>End Sub
クラスとユーザーフォームとの結合度の強さを上記のように認めたとしても、更にこの標準モジュールでユーザーフォームのコントロールに関わるコードを記述するのは私は、疑問に感じます。
クラス、Userform、標準の各モジュールの結合度が強くなってしまいます。
仕様書に記述する場合には、「このクラスの利用に当たっては、標準モジュールに以下のプロシジャーの記述が必須となります。」なんていう但し書きが必要になってしまいます。
一般的なオブジェクトにはないですよね!!
クラスとユーザーフォームとの結合度の強さを上記のように認めた場合、標準モジュールのプロシジャーは、クラス内に記述するか、Userform内に記述してクラスから呼び出すかのどちらかだと思いますよ!! 時間があったら、検討してしてみてください。
クラスモジュールに
Private Sub myTxt_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
myTxt.Parent.Syori_FromTextBox myTxt
End Sub
Userform1のモジュールに
>>Public Sub Syori_FromTextBox(objTextBox As MSForms.TextBox)
>> objTextBox.Text = "OK"
>>End Sub
|
|