Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


36898 / 76738 ←次へ | 前へ→

【45015】Re:隠しメソッド/プロパティの作り方 再投稿
発言  ichinose  - 06/12/10(日) 8:44 -

引用なし
パスワード
   おはようございます。
>この方法は、目からうろこ状態でした、レイトバインディング
>による手法で、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をアドインとして登録して
運用することが多いです。

検討して見てください

0 hits

【44997】隠しメソッド/プロパティの作り方 TOSHI 06/12/9(土) 12:57 質問
【45005】Re:隠しメソッド/プロパティの作り方 ichinose 06/12/9(土) 20:29 発言
【45010】Re:隠しメソッド/プロパティの作り方 TOSHI 06/12/9(土) 23:14 質問
【45015】Re:隠しメソッド/プロパティの作り方 再投... ichinose 06/12/10(日) 8:44 発言
【45020】Re:隠しメソッド/プロパティの作り方 再投... TOSHI 06/12/10(日) 11:42 お礼
【45022】隠しメソッド/プロパティの作り方 再質問 TOSHI 06/12/10(日) 12:38 質問
【45031】Re:隠しメソッド/プロパティの作り方 再質... ichinose 06/12/10(日) 16:40 発言
【45036】ありがとうございました TOSHI 06/12/10(日) 18:38 お礼

36898 / 76738 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free