【 2016年9月15日  サイト 移転のお知らせ 】
      AddinBox サイトを [ DION ] から [ さくら インターネット ] へ移転しました。  なお、旧サイト は 2017年10月 まで残します。
      この ページ の 移転先 URL  ⇒⇒  http://addinbox.sakura.ne.jp/Breakthrough_P-Ctrl_Arrays.htm  
 
ロゴ(青) 擬似からの脱却 ロゴ(緑)

    【コントロール配列】 は多数のコントロールを扱うフォームでは非常に便利な機能です。しかし、「VBにあってVBAにはない」
    という、VBAユーザーにとって非常に残念で羨ましい機能でもあります。この記事では、本来、VBAが持っていない 「コント
    ロール配列」 機能をイベント処理を含めて 『VB並みに扱える』 ようになる手法について解説しています。 

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

   
  [ http://www.h3.dion.ne.jp/~sakatsu/Breakthrough_P-Ctrl_Arrays_Eng.htm

「擬似からの脱却」と銘打っていても、そもそも
        「擬似」とは何を指しているの?
と聞かれるでしょうね。何なのかと言えば、それは、
        VBAで使われているコーディング手法の「擬似コントロール配列
の事です。すると次には
        じゃあ「擬似コントロール配列」って何?
となりますので、先ずは「そこから」解説を始めます。
§1 VB (Visual Basic) と VBA (Visual Basic for Application)
§2 Controls コレクション の利用 §7 クラスからフォーム内の情報を操作
§3 コレクション オブジェクトの利用 §8 擬似から先ず1歩踏み出す
§4 クラス モジュール って、何? §9 擬似の足枷
§5 クラス モジュールの利用 §10 擬似からの脱却
§6 「擬似コントロール配列」で残る問題点 §11 その他のサンプルコード
§12 Enter / Exit イベントの実装
( 初出 : §1〜5 [ 2004/5/17 ] , §6〜11 [ 2004/6/22 ] , §12 [2014/8/11] ) 
( 英訳 初出 : [ 2014/7/24 ] ) 
    ( News )
    汎用クラス Ver 2.0  ( 2014/8/11 リリース )
    Enter , Exit , BeforeUpdate , AfterUpdate がサポートされました(仕組みは§12を参照)。 

( 参 考 )
この「擬似からの脱却」以前では、『VBAでのコントロール配列』に関する情報といえば、moug
    「スキルアップ講座 : クラスモジュールを使った究極のVBAプログラミング
という記事(全7頁、内2頁でコントロール配列を解説)が唯一でした。残念ながら、moug の再編
に伴って、現在この記事は削除(2008年頃迄ありました)されていますが、Internet Archive
拾う事ができます(上記リンクはInternet Archiveによるものです) 。内容としては、ここの§1〜5
に相当します。

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

  ====================================================================
  §1  VB (Visual Basic) と VBA (Visual Basic for Application)
  ====================================================================

  フォームで同じ使い方のコントロールを複数配置する場合、VBでは当たり前のようにコント
ロール配列」という機能が利用できます。
    [ 例 ]
        曜日ボタン(日曜〜土曜の7つ)を配置して、ボタンをクリックした時に、その曜日を
        MsgBoxで表示してボタンカラーを変更する
という例を題材に考えてみます。

  先ず[cmdWeek ]という名前で CommandButton を1つ配置してから、その CommandButton
コピー&貼り付けすると、
        既に同じ名前のコントロール'cmdWeek' があります。
        コントロール配列にしますか?

というメッセージが表示されます。これに OK で応答した後、プロパティウィンドウを見ると、最初
のボタンは「cmdWeek (0)」に、今貼り付けたボタンは「cmdWeek (1)」という名前になっています。

これで”配列化”されたという事が判ります。同じ様に貼り付けを繰り返し、全部で7つのボタンを
用意します(キャプションは各々"日曜","月曜"〜"土曜"に変えます)。

  配置したボタン(7つの内のどれでも)をダブルクリックすると、コードウィンドウ内に
        Private Sub cmdWeek_Click ( Index As Integer )
        End Sub
というイベントプロシジャーのコードが挿入されます。コントロール配列にしていない場合は、
        Private Sub cmdWeek_Click ( )
と、引数が入りません。つまり、実行時に、この7つのボタンのどれをクリックしても、呼び出され
るイベントプロシジャーは「cmdWeek_Click 」という『ひとつだけ』という事です。

  その時に
        「何番目のボタンか?」という番号(0〜) が [Index] という引数
で渡されます。このイベントプロシジャー内でボタンにアクセスする場合、このIndex値を使って
        cmdWeek ( Index )
という風に記述すれば、クリックしたボタンに対してアクセスできます。
    -- 実際のプログラム例 --
        Private Sub cmdWeek_Click ( Index As Integer )
        Dim vntWeekName As Variant
          vntWeekName = Array ( "日", "月", "火", "水", "木", "金", "土" )
          MsgBox vntWeekName ( Index ) & "曜日ボタンがクリックされました(" & Index & ")"
          If ( cmdWeek ( Index ).BackColor = vbButtonFace ) Then
              cmdWeek ( Index ).BackColor = vbRed
          Else
              cmdWeek ( Index ).BackColor = vbButtonFace
          End If
        End Sub

この『ひとつの』イベントプロシジャーだけで【7つの曜日ボタン全て】をカバーしており、
    日曜ボタンをClick →「日曜ボタンがクリックされました ( 0 ) 」
    金曜ボタンをClick →「金曜ボタンがクリックされました ( 5 ) 」
と、どのボタンをクリックしても、同じ様に表示され、またクリックの度にボタンカラーが変わると
いう動きをしてくれます。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
では、VBAの場合は、どうでしょうか?

  VBAでは、元々VBのような「コントロール配列」という機能はありませんので、
        [ cmdWeek ]という名前で CommandButton を1つ配置してから、
        その CommandButton をコピー&貼り付けする

としても、貼り付けた2番目のボタンが[CommandButton1]という既定の名前になるだけです(その
まま、順次貼り付けていけば[CommandButton2] [CommandButton3]‥‥‥)。つまり、VBAでは
同じ名前での定義は出来ない】という訳です。仕方ないので、各々の名前を
        [cmdSun] [cmdMon] [cmdTue] [cmdWed] [cmdThu] [cmdFri] [cmdSat]
という風に変更します。当然、名前が違うのですからイベントプロシジャーも各々独立した別個の
ものとなります。
        Private Sub cmdSun_Click ( )
        End Sub
        Private Sub cmdMon_Click ( )
        End Sub
            :
        Private Sub cmdSat_Click ( )
        End Sub

したがって、VBAで
    [ 例 ]
        曜日ボタン(日曜〜土曜の7つ)を配置して、ボタンをクリックした時に、その曜日を
        MsgBox で表示して ボタンカラーを変更する

という処理を行なうには、VBで書いたイベントプロシジャーの中身(と同等なコード)を、日〜土の
7つのイベントプロシジャーに【同じ様に】記述してやらなければいけない、という事です。
        Private Sub cmdSun_Click ( )
            MsgBox "日曜日ボタンがクリックされました"
            If ( cmdSun.BackColor = vbButtonFace ) Then
                cmdSun.BackColor = vbRed
            Else
                cmdSun.BackColor = vbButtonFace
            End If
        End Sub
        Private Sub cmdMon_Click ( )
            MsgBox "月曜日ボタンがクリックされました"
            If ( cmdMon.BackColor = vbButtonFace ) Then
                cmdMon.BackColor = vbRed
            Else
                cmdMon.BackColor = vbButtonFace
            End If
        End Sub
      (以下省略)

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

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

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