ロゴ(青) 擬似からの脱却 ロゴ(緑)

  【 擬似からの脱却 】  [ Breakthrough in the Pseudo-Control Arrays ]

[ clsBpca の 軌跡 ] [ 前頁 , 次頁 , §1 , §2 , §3 , §4 , §5 , §6 , §7 , §8 , §9 , §10 , §11 , §12 ]
[ 汎用クラス , トグルラベル クラス , Focus クラス , クラス アドイン , カレンダークラス ] [ 質問はメール]

  ====================================================================
  §3  コレクション オブジェクトの利用
  ====================================================================

2006/5/29 解説文に、オブジェクト定義時での[New]指定 が残っていました。
                Initialize 時にインスタンス生成(Set ステートメント)するように修正しました。


(前節より‥‥‥)
      でも、[ cmdSun ] [ cmdMon ] ‥‥という名前の方が良いんだけど、それは無理なの?  (;_;)

  Controls コレクションを使う代わりに、曜日ボタン専用のコレクションを作って配列のように使う
方法もありますので、それを使えば出来ます。  o(^-^○

  先ず、モジュール先頭の「宣言セクション」にて、[ Private ]レベルのコレクションオブジェクト
定義します。そして、Initialize イベントの中で、曜日ボタンをコレクションに登録します。
 
 Private colWeekBtn As Collection

 Private UserForm_Initialize()
   Set colWeekBtn = New Collection    ' インスタンスの生成
   With colWeekBtn
     .Add cmdSun
     .Add cmdMon
     .Add cmdTue
         :
     .Add cmdSat
   End With
 End Sub
 
このように、コレクションでは「Add メソッドにより追加していく」という方法を採りますので、通番が
付いていなくて、ループ処理に適さない名前のものであっても、さして手間取らずにコーディング
する事ができます。

[ cmdWeek + 番号 ]という名前のままならば
 
 Private colWeekBtn As Collection

 Private UserForm_Initialize()
   Dim i As Integer
   Set colWeekBtn = New Collection    ' インスタンスの生成

   For i = 1 To 7
     colWeekBtn.Add Controls("cmdWeek" & i)
   Next i
 End Sub
 
という風に、ループ処理の中で[ Add ]する使い方ができます。

  コレクション内に登録されたオブジェクトは『登録した順に1から振られる番号』で参照できます。
そうすると、先の共通サブの部分は
 
 Private Sub cmdWeek_Click_Sub(ByVal Index As Integer)
   Dim vntWeekName As Variant
   vntWeekName = Array("", "", "", "", "", "", "", "")

   MsgBox vntWeekName(Index) & "曜日ボタンがクリックされました(" & Index & ")"
   If (colWeekBtn(Index).BackColor = vbButtonFace) Then
     colWeekBtn(Index).BackColor = vbRed
   Else
     colWeekBtn(Index).BackColor = vbButtonFace
   End If
 End Sub
 
という書き方になります。

  イベントプロシジャー側のコーディングは、[cmdSun]であっても[cmdWeek1]であっても、前節
で書いたコードと同じです。
 
 > Private Sub cmdSun_Click()      もしくは  Private Sub cmdWeek1_Click()
 >     Call cmdWeek_Click_Sub(1)
 > End Sub
 >
 > Private Sub cmdMon_Click()
 >     Call cmdWeek_Click_Sub(2)
 > End Sub
 >     :
 >     :
 > Private Sub cmdSat_Click()
 >     Call cmdWeek_Click_Sub(7)
 > End Sub
 

  [ Collection ]は「複数のオブジェクトをまとめる集合体」ですので、Addメソッドの繰り返しで
何個でもオブジェクトを追加できます。配列(動的配列を除く)のように上限は有りません。なお、
何個入っているかは、Count プロパティで取得します。

  [ Collection ]の代わりに、特定のオブジェクト(今回はCommandButton )を配列宣言しても
同じ様にコーディングできます。この場合は、[Add ]ではなく、[Set ]ステートメントで代入を行
ないます。
 
 Private cmdWeekBtn(1 To 7) As MsForms.CommandButton


 Private UserForm_Initialize()
   Set cmdWeekBtn(1) = cmdSun
   Set cmdWeekBtn(2) = cmdMon
               :
               :
   Set cmdWeekBtn(7) = cmdSat
 End Sub

もしくは、

 Private UserForm_Initialize()
   Dim i As Integer
   For i = 1 To 7
     Set cmdWeekBtn(i) = Controls("cmdWeek" & i)
   Next i
 End Sub



 Private Sub cmdWeek_Click_Sub(ByVal Index As Integer)
   Dim vntWeekName As Variant
   vntWeekName = Array("", "", "", "", "", "", "", "")

   MsgBox vntWeekName(Index) & "曜日ボタンがクリックされました(" & Index & ")"
   If (cmdWeekBtn(Index).BackColor = vbButtonFace) Then
     cmdWeekBtn(Index).BackColor = vbRed
   Else
     cmdWeekBtn(Index).BackColor = vbButtonFace
   End If
 End Sub
 


色々な方法がありますので、その時その時で、一番具合の良い方法を採って下さい。  ヾ(^v^)k

それは良いけど、クリックイベントの方はどうなの? まとめる方法は無いの?  (・・?

  ====================================================================
  次節 : §4  クラスモジュールって、何?
  ====================================================================

[ 前頁 , 次頁 , §1 , §2 , §3 , §4 , §5 , §6 , §7 , §8 , §9 , §10 , §11 , §12 ]
[ 汎用クラス , トグルラベル クラス , Focus クラス , クラス アドイン , カレンダークラス ] [ 質問はメール]


[ Home へ戻る ]

ロゴ(ゴールド) ロゴ(ゴールド)

角田 桂一 Mail:addinbox@h4.dion.ne.jp CopyRight(C) 2004 Allrights Reserved.