Excel VBA質問箱 IV

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

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


6257 / 13646 ツリー ←次へ | 前へ→

【46358】クラスモジュールにモジュール名を入れない方法 kobasan 07/1/31(水) 19:14 質問[未読]
【46364】Re:クラスモジュールにモジュール名を入れ... neptune 07/1/31(水) 22:05 発言[未読]
【46365】Re:クラスモジュールにモジュール名を入れ... ichinose 07/1/31(水) 22:27 発言[未読]
【46368】Re:クラスモジュールにモジュール名を入れ... kobasan 07/2/1(木) 0:41 お礼[未読]
【46367】Re:クラスモジュールにモジュール名を入れ... kobasan 07/2/1(木) 0:20 お礼[未読]

【46358】クラスモジュールにモジュール名を入れな...
質問  kobasan  - 07/1/31(水) 19:14 -

引用なし
パスワード
   ユーザーフォームとクラスモジュールの場合、下記の
 .Caller = Me
のようにすれば、UserForm1 をクラスモジュールに渡すことができます。

Private ChckBox(1 To 3) As New Class1

Private Sub UserForm_Initialize()
Dim i As Long
  For i = 1 To 3
    With ChckBox(i)
      .Item = Me.Controls("CheckBox" & i)
      .Caller = Me
    End With
  Next i
End Sub

Public Sub test()
    MsgBox "OK"
End Sub

'クラスモジュールClass1
Private MyCaller As Object 'UserForm用の変数
Private WithEvents MyCtrl As MSForms.CheckBox

Public Property Let Caller(NewCaller As Object)
   Set MyCaller = NewCaller
End Property

Private Sub MyCtrl_Click()
  Call MyCaller.test
End Sub


標準モジュールとクラスモジュールの場合、
    .Caller = Module1
では、Module1 をクラスモジュールに渡すことはできませんでした。
それで、今のところ下記のように、直接Module1を指定して
  Module1.test
で動かしています。

'クラスモジュールClass1
Private WithEvents Sht As Worksheet
・・・・
Private Sub Sht_SelectionChange(ByVal Target As Range)
  Module1.test
End Sub

'■標準モジュール
Sub Set_SheetEvent()
Dim clsSheet As Class1
  With Workbooks("TestBook")
    Set clsSheet = New Class1
    Set clsSheet.Sheet = .Sheets("Sheet1")
  End With
  Set clsSheet = Nothing
  Workbooks("TestBook").Activate
Public Sub test()
  MsgBox "OK"
End Sub

クラスモジュールには、直接モジュール名などを入れないようにするのが望ましいというのが頭にあります。
クラスモジュールに Module1 を書き込まないようにする方法があれば、よろしくお願いします。

【46364】Re:クラスモジュールにモジュール名を入...
発言  neptune  - 07/1/31(水) 22:05 -

引用なし
パスワード
   ▼kobasan さん:
こんにちは

回答にはなりませんが、
>クラスモジュールに Module1 を書き込まないようにする方法があれば、よろしくお願いします。
やったことないのであるかないかは知りませんが、クラスモジュールから
標準モジュールのプロシージャは呼ばない造りにするのがカプセル化と
言う意味ではベターではないでしょうか?

私はそのように心がけています。

【46365】Re:クラスモジュールにモジュール名を入...
発言  ichinose  - 07/1/31(水) 22:27 -

引用なし
パスワード
   こんばんは。

application.Runメソッドを使う方法ではいかがですか?
但し、この場合クラスのプロパティとして

cls.Caller="module1.test"

としなければなりませんけどね!!


>
>回答にはなりませんが、
>>クラスモジュールに Module1 を書き込まないようにする方法があれば、よろしくお願いします。
>やったことないのであるかないかは知りませんが、クラスモジュールから
>標準モジュールのプロシージャは呼ばない造りにするのがカプセル化と
>言う意味ではベターではないでしょうか?
これは、私も賛成です。提示されたクラスとユーザーフォームの関係も

クラスモジュールとフォームの結合度が強いですよね!!

クラスを使って、イベントプロシジャーはフォーム側に記述できるように
考えてはいかがですか?

【46367】Re:クラスモジュールにモジュール名を入...
お礼  kobasan  - 07/2/1(木) 0:20 -

引用なし
パスワード
   ▼neptune さん こんばんは。

>やったことないのであるかないかは知りませんが、クラスモジュールから
>標準モジュールのプロシージャは呼ばない造りにするのがカプセル化と
>言う意味ではベターではないでしょうか?

私も、なるべく「クラスモジュールから標準モジュールのプロシージャは呼ばない造り」にしようとしていますが、時には、RaiseEven風にして最小限のクラスモジュールと標準モジュールへキックバックする方法も結構使っています。その方がわかりやすかったり、コードを書きやすいときもあったりするので。

今回の私の言っていることは、Module1は書きたくないけど標準モジュールのブロージャtestは使いたいというのは、若干矛盾しているかもしれませんね。
大変参考になりました。
ありがとうございました。

【46368】Re:クラスモジュールにモジュール名を入...
お礼  kobasan  - 07/2/1(木) 0:41 -

引用なし
パスワード
   ▼ichinose さん こんばんは。
>
>application.Runメソッドを使う方法ではいかがですか?
>但し、この場合クラスのプロパティとして
>
>cls.Caller="module1.test"
>

これてを使って、クラスモジュールのModule1を消すことができました。
  Module1.test
の代わりに

  Application.Run ("test")

で動かすことができました。

>>>クラスモジュールに Module1 を書き込まないようにする方法があれば、よろしくお願いします。
>>やったことないのであるかないかは知りませんが、クラスモジュールから
>>標準モジュールのプロシージャは呼ばない造りにするのがカプセル化と
>>言う意味ではベターではないでしょうか?

私としては、カプセル化と標準モジュールへのキックバックはケースバイケースでつかいたいですね。

>これは、私も賛成です。提示されたクラスとユーザーフォームの関係も
>クラスモジュールとフォームの結合度が強いですよね!!

これは、参考になりました。

>
>クラスを使って、イベントプロシジャーはフォーム側に記述できるように
>考えてはいかがですか?

今回の質問の発端は、シートモジュールのイベントをクラスで発生させて、データBookとマクロBookを分離させる作業中に発生した疑問でした。フォームは比較のために引用しましただけで、今回の質問の本意は、標準モジュールとクラスモジュールの関係がメインでした。

回答くださりありがとうございました。大変参考になり、勉強になりました。
今後もよろしくお願いします。

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