|
おはようございます。
>この方法は、目からうろこ状態でした、レイトバインディング
>による手法で、clsにタイプライブラリ情報を持たせない手法なんですね。
まっ、そういうことです。
>贅沢な希望なのですが、わたしの方の希望としましては、
>2つ有ります。
> 1.Fucn2からClass1のPrivate関数をCallしたい
> 2.できれば1つのClassで実現したい
なるほど・・・、ちょっと考え方を変えてみませんか?
(以下に記述する内容はExcel2000以降のバージョンで実現出来ます)
「上記のふたつ条件をどうして満たしたいのか」
という基本を押さえましょう!!
> 2.できれば1つのClassで実現したい
これは、隠蔽化が前回の私のコードでは出来ていないですからネ!!
Class2のインタンスを作成すれば、
「隠し.」以下のメンバーも見えてしまいますからね
結論から言えばクラスを二つにするということは変えられません。
が、しかし、隠蔽化することはできます。
隠蔽化を実現するためにクラスモジュールを特定のプロジェクトに
記述し、このプロジェクトを使って隠蔽化します。
> 1.Fucn2からClass1のPrivate関数をCallしたい
これも プロジェクトの外からは、Private関数なるものが
呼び出し出来ないようにすれば良いですね!!
まず、新規ブックに対して以下の操作を行なって下さい。
クラスモジュールを二つ作成します。
Class1
Class1を作成したら、プロジェクトエクスプローラーにて作成した
Class1を選択してください。この状態でF4キーを押してClass1の
プロパティウインドーを表示させて下さい。
このClass1のプロパティに「Instancing」というプロパティがあります。
既定値が「1-Private」になっていますから、
これを「2-PublicNotCreatable」に変更してください。
これでClass1の設定は出来ました。
Class1のコードです。
Option Explicit
Private cls As Class2
'==================================================
Public Sub Func1()
MsgBox "Func1!"
End Sub
'==================================================
Property Get Raw() As Object
Set Raw = cls
End Property
'==================================================
Private Sub Class_Initialize()
Set cls = New Class2
cls.set_parent = Me
End Sub
'==================================================
Private Sub Class_Terminate()
Set cls = Nothing
End Sub
'==================================================
Friend Sub Func2Private()
'↑ここがポイント
MsgBox "Func2Private!"
End Sub
次にClass2です。こちらのプロパティは、既定値のままでよいです。
変更しないで下さい。
Class2のコードです。
'=================================================
Option Explicit
Private parent As Class1
'=================================================
Property Let set_parent(obj As Object)
Set parent = obj
End Property
'=================================================
Public Sub Func2()
parent.Func2Private
End Sub
最後にThisworkbookのモジュールに
'=================================================
Option Explicit
Function set_class1() As Class1
Set set_class1 = New Class1
End Function
上記の設定でプロジェクトとして、隠蔽化します。
プロジェクトエクスプローラーにて、このブックを選択して下さい。
選択した状態で 右クリック---「VBAProjectのプロパティ」を
クリックして「プロジェクトプロパティ」というダイアログを表示させます。
「全般」タブの「プロジェクト名」にユニークな名前を付けます。
ここでは、「test_project」と命名して、OKをクリックして下さい。
一度、このブックを保存します。
保存ブック名は何でも良いですが、適当なフォルダにTest1.xlsという名前で
保存してください。
クラスモジュールはこのtest_projectを介して使用するようにします。
上記のブックは閉じないで下さい。
別に新たに新規ブックを作成します。Book2とします(既定名)。
プロジェクトエクスプローラーにて、このブックを選択して下さい。
選択した状態で 「ツール」---「参照設定」をクリックして
「参照設定」というダイアログを表示させます。
一覧にさっき命名した「test_project」がありますから、チェックを入れて
OKをクリックします。
このBook2の標準モジュールに
以下のコードをコピーではなく、実際にキーパンチしてみて下さい。
(コメントは除いて・・・)
'=========================================================
Option Explicit
Sub test()
Dim クラス As test_project.Class1
' test_project. の時点でClass1は見えるが
' class2は見えない
Set クラス = test_project.ThisWorkbook.set_class1
With クラス
.Func1 'Func1は、メンバーとして見えるが、
' Func2Privateは見えない
.Raw.Func2 '.Rawは、メンバーとして見えるが、
' .Raw. でFunc2は見えない
End With
Set クラス = Nothing
End Sub
いかがですか?
test_projectというプロジェクトとして、隠蔽化することにより、
TOSHI さんが掲げた条件を結果として
満たしていませんか?
尚、私は、このtest_projectをアドインとして登録して
運用することが多いです。
検討して見てください
|
|