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

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

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

  ====================================================================
  §2  Controls コレクション の利用
  ====================================================================

(前節より‥‥‥)
      これでは、コーディング量が増えるばかりで、全く効率的ではありませんね。  ┐('〜`;)┌

  そこで、VBAの場合に広く用いられているのが
        【 Controls コレクション
というものを利用する方法です。  φ(..) メモメモ

  Controls コレクションによる オブジェクト参照
 
 [ object. ] Controls("オブジェクトの名前")
 
という風に 『括弧内に【文字列】でオブジェクト名を記述する』 という方法で行ないます。

  object には、参照しようとしているコントロールが載っている[UserForm オブジェクト]名を記
述します。自分自身の Userform モジュール内で記述しているコードならば、代わりに
 
 Me.Controls(xxx)
 
と、Me キーワードで置き換えても構いません( object を省略した場合は、Me が指定された
ものと解釈されます)。
      (補) UserForm の他に、[ Frame , MultiPage ] といったコントロールも、object の部分に記述
              できます。これらの3つ は、特に 『 コンテナ 』 と呼ばれる種類のコントロールです。

  今回の例ならば、Controls を使った書き方は
 
 Controls("cmdSun").BackColor = vbRed
 Controls("cmdMon").BackColor = vbRed
 
といったものになります。

ただし、このままでは、先程と何ら変わりませんので、先ずコマンドボタンの名前を「代表名 + 通番」
というパターンに統一して変更します。
 
 cmdSun cmdWeek1
 cmdMon cmdWeek2
      :
 cmdSat cmdWeek7
 
そうすれば、最後の「通番」の部分を変数にする事で
 
 Controls("cmdWeek" & 通番)
 
という書き方ができます。これで、ループ処理等にも載せる事が可能になり、よりコーディングを簡
素化できます。
 
 Dim No As Integer
 For No = 1 To 7
   Controls("cmdWeek" & No).BackColor = vbRed
 Next No
 

  これで、7つのボタンへのアクセスを【ひとつにまとめる】コーディングが出来るようになりました
ので、先程のものを Controls コレクションを利用して手直ししてみます。先程のイベントプロシ
ジャーについては、下記の共通サブルーチン
 
 Private Sub cmdWeek_Click_Sub(ByVal Index As Integer)
   Dim vntWeekName As Variant

   ' Array関数のインデックスはゼロから始まるので、1から対応付けするには、
   ' 先頭に[空文字]要素をひとつ追加します
   vntWeekName = Array("", "", "", "", "", "", "", "")

   MsgBox vntWeekName(Index) & "曜日ボタンがクリックされました(" & Index & ")"
   If (Controls("cmdWeek" & Index).BackColor = vbButtonFace) Then
     Controls("cmdWeek" & Index).BackColor = vbRed
   Else
     Controls("cmdWeek" & Index).BackColor = vbButtonFace
   End If
 End Sub
 
を用意してやると、
 
 Private Sub cmdWeek1_Click()
   Call cmdWeek_Click_Sub(1)
 End Sub

 Private Sub cmdWeek2_Click()
   Call cmdWeek_Click_Sub(2)
 End Sub
      :
      :
 Private Sub cmdWeek7_Click()
   Call cmdWeek_Click_Sub(7)
 End Sub
 
という風にコーディング量が格段に少なくなります。  o(^o^)o

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

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

[ 前頁 , 次頁 , §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.