ロゴ(青) Excel/VBA Tips ロゴ(緑)

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

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

  =======================================================================
  『擬似からの脱却』 汎用クラスモジュール [ clsBpca / clsBpca97 ] リファレンス (Ver1.4)
  =======================================================================
   
    Enter/Exit もサポートしている最新版(Ver4.0 , Excel2000以上)は こちら です。

(このクラスは Win32-API を使っていないので x64 でも動作します

この『擬似からの脱却』汎用クラス[ clsBpca / clsBpca97 ]は
    Label , TextBox , CommandButton , OptionButton , CheckBox
    ComboBox , SpinButton , ToggleButton
の8種類のコントロールをサポートしています。標準コントロールの内、「ListBox, Frame, TabStrip,
MultiPage, ScrollBar」を除外してますが、その理由は「これらのコントロールがコントロール配列に
するくらい数多く配置される事がない為」です。

イベントについては、個々のコントロールが備えているイベントの内、
    Change , Click , DblClick , KeyDown , KeyPress , KeyUp
    MouseMove , MouseDown , MouseUp , SpinDown , SpinUp , DropButtonClick
をサポートしています。使用方法は下記サンプルブックの「利用例フォーム」を参考にして下さい。
本来の「配列化」するという目的の他に、『動的に追加したコントロール』のイベント処理にも利用
できます。
    (注)   肝心要の[ Enter / Exit / BeforeUpdate / AfterUpdate ]については、そもそもクラス内で
            取得できないイベントである為、サポートしていません(したがって、アクティブなコントロール
            を強調表示、といった用途には使えません)。
              この用向きには、別途 [ clsBpcaFocus ]クラスを用意してありますが、Enter/Exit の代わりと
            して、同じコントロールに対して[ clsBpca ] と一緒に [ clsBpcaFocus ] を使用しないでください
              [ clsBpcaFocus ]は「フォーカスが来たら強調表示する」という、機能的には2次的な処理
            対応する為に作ったものです(2次的な機能なので、Enter/Exit の代替タイミングを探すという事
            でも大きな支障がない、最悪、偶に機能しないケース(フォーカス移動しても色が変わらない)が
            有っても支障が無い)。つまり、100%確実にEnter/Exit を代替できるものではありません。



[ clsBpca / clsBpca97 ] クラス定義 および サンプル ブック [ Bpca_Class_V14.zip ] (217KB)
    ( 2004/6/23 Ver1.1 )
    ( 2005/3/11 Ver1.2 )  解説文・クラスソース・サンプルソースにおいて、オブジェクト定義時での[New]指定
                                       を止めて、Initialize 時にインスタンス生成(Set ステートメント)するように修正しました。
    ( 2011/4/15 Ver1.3 )  クラスの機能変更はありません。サンプルで使っている祝日マクロを最新版へ差し替えただけです。
                                       (Item プロパティを【既定のプロパティ】にしました。記載漏れ 2014/7/22)
    ( 2014/7/22 Ver1.4 )  各プロパティで Index 引数のエラーチェック(>0)が抜けていたのを修正しました。
                                       getIndex プロパティを追加しました。
                                       サンプルで使っている祝日マクロを最新版に差し替えました(山の日 対応済)。


  アドイン化しました  [ 2005/3/8 初版 ] [ 2014/7/22 Ver 2.30 最新版で再構築 ]

   【 clsBpca 概念図 】  【 clsBpca97 概念図 】  (当初、英訳を意識してたので英語風です(笑) )

=======================================================================
  [ clsBpca / clsBpca97 ] クラス    イベント/メソッド/プロパティ一覧
=======================================================================
  アドイン化したクラスモジュールを利用する場合は下記のインポート作業は不要です。

          [イベント種別] 定数を定義した [ modBpcaConst ] を一緒にインポートする必要があります。

          Excel2000 以上では[ clsBpca ]クラスが利用できます。
          [ clsBpca ]クラスを使う場合は、一緒に[ clsBpcaCh ]クラスもインポートする必要があります。


          Excel97 では[ clsBpca97 ]クラスを使って下さい(Excel2000 以上 と Excel97 の両方で使う場合を含む)。
          [ clsBpca97 ]クラスを使う場合は、一緒に[ clsBpca97Ch ]クラスもインポートする必要があります。


          [ clsBpcaCh/clsBpca97Ch ]クラスは、各々[ clsBpca/clsBpca97 ]クラスの下位クラスです(ユーザーサイド
          で直接このクラスを使うことはありません)。

          下記で[ object ]の部分には、clsBpca/clsBpca97 クラスを定義したオブジェクト変数を記述します。
          尚、[ 2K ]表記は clsBpca 用[ 97 ]表記は clcBpca97 用無印は共通 です。

          このクラスは Win32-API を使っていないので x64 でも動作します

定  義
[ 2K ] UserForm モジュールの宣言セクション(モジュールの先頭)で、下記のように定義します。

    Private  WithEvents  object  As  clsBpca

    1UserForm内/1ブック内で、[ object ] を変えて複数定義しても構いません。

    ( object )
      任意の名前を指定して下さい。

    [ Initialize ] イベントプロシジャーにて下記のようにしてクラスのインスタンスを作成します。
        Set  object  =  New  clsBpca
    アドイン化したクラスを利用している場合は、New キーワードを使わずに下記のようにします。
           Set  object  =  CreateBpca ( )
      (CreateBpca 関数は、クラスアドイン で用意してある関数です)
 

[ 97 ] UserForm モジュールの宣言セクション(モジュールの先頭)で、下記のように定義します。
WithEvents は付けません。

    Private  object  As  clsBpca97

    1UserForm内/1ブック内で、[ object ] を変えて複数定義しても構いません。

    ( object )
      任意の名前を指定して下さい。

    [ Initialize ] イベントプロシジャーにて下記のようにしてクラスのインスタンスを作成します。
        Set  object  =  New  clsBpca97
    アドイン化したクラスを利用している場合は、New キーワードを使わずに下記のようにします。
           Set  object  =  CreateBpca97 ( )
      (CreateBpca97 関数は、クラスアドイン で用意してある関数です)
 

メソッド
object .Add    MsForms コントロール オブジェクト

    コントロール配列化するコントロールオブジェクトを[ clsBpca / clsBpca97 ]クラスに追加するメソッドです。
    [ object ]グループとして配列化するコントロール全てに対して、 Add メソッドを繰り返し、最後に Rgst メソッド
    で登録します。

    通常は、ひとつの[ object ]に登録するコントロールは、全て同じ種別(TextBox , CommandButton 等)しか
    登録できませんが、Rgst メソッドでAllType 引数に True を指定すると、異なる種別のコントロールを一緒
    に登録できます(Rgst メソッドは、Add メソッドの後に実行しますので、Add メソッドの時点では異なる種類の
    コントロールを指定してもエラーにはなりません) 。

    Add メソッドで登録した順に、コントロール番号が 1 から割り当てられます。この番号が、各種イベント/プロ
    パティ において [ Index ] として扱われます。

    ( MsForms コントロール オブジェクト )
      コントロール配列化する、コントロールオブジェクトを指定します。
 

[ 2K ] object .Rgst    Event , [ AllType ]

    Add メソッドで追加したコントロールの登録処理を行なうメソッドです。Add メソッドを繰り返した後に
    行ないます。

    AllType 引数を 省略 もしくは False 指定の場合、異なる種別のコントロールが混在していると、Rgst
    メソッドは失敗(以後、全てのメソッド/プロパティを呼び出しても何も実行されません)します。

    ( Event )
      発生させたい[イベント]について、対応する[ イベント種別コード ]の合計で指定します。
          例:  object.Rgst  BPCA_Change + BPCA_Click
      イベント種別コードの一覧は後述
    アドイン化したクラスを利用している場合、Event 引数 のデータ型を列挙型に変更して
    あります(列挙型名: BPCA2_Event )。要素名は、BPCA2_Change , BPCA2_Click といよう
    に[2]を付加した名前になっています。これにより、自動メンバ表示が利用できます。
    (Excel2000以上用の clsBpca のみ)

    ( AllType )
      異なる種別のコントロールを混在させる場合は True を指定します。
      通常は 省略( =False )します。
 

[ 97 ] object .Rgst    Caller , GrpId , Event , [ AllType ]

    Add メソッドで追加したコントロールの登録処理を行なうメソッドです。Add メソッドを繰り返した後に
    行ないます。

    AllType 引数を 省略 もしくは False 指定の場合、異なる種別のコントロールが混在していると、Rgst
    メソッドは失敗(以後、全てのメソッド/プロパティを呼び出しても何も実行されません)します。

    ( Caller )
      このコードを記述している UserForm モジュールの「UserForm 」を指定します。
      実際には、[ Me ]を指定して下さい。

    ( GrpId )
      複数のコントロール配列グループ(= 複数の[ object ])を使用する場合、そのグループを区別する
      「文字列」を指定します。1グループしか使わないならば「空文字: "" 」でも構いません。

    ( Event )
      発生させたい[イベント]について、対応する[ イベント種別コード ]の合計で指定します。
          例:  object.Rgst  BPCA_Change + BPCA_Click
      イベント種別コードの一覧は後述

    ( AllType )
      異なる種別のコントロールを混在させる場合は True を指定します。
      通常は 省略( =False )します。
 

object .Clear 

    クラスの解放などの終了処理です。
    UserForm の[Terminate ]イベントで必ず実行して下さい。


下記メソッドは、[ clsBpcaCh/clsBpca97Ch ]クラスが、発生したイベントを[ clsBpca/clsBpca97 ]クラスへ
上げる為に使うメソッドです。ユーザーサイドで使う事はありません。

    RaiseChange , RaiseClick , RaiseDblClick ,
    RaiseKeyDown , RaiseKeyPress , RaiseKeyUp ,
    RaiseMouseMove , RaiseMouseDown , RaiseMouseUp ,
    RaiseDropButtonClick , RaiseSpinDown , RiseSpinUp
 

プロパティ
object .Count    [ = Integer ]

    [ object ]グループのコントロール配列に登録されているコントロールオブジェクトの数を返します。
    値の取得のみ可能です。

    ( 値の取得 )
      Add メソッドで登録したコントロールの数を数値で返します。
      この値は「コントロール 番号」の最大値でもあります。
 

object .getIndex    ( CtrlName )  [ = Integer ]  

    [ object ]グループのコントロール配列に登録されているコントロールオブジェクトの中から、
    コントロール名に対する Index の値(コレクション内で登録されている位置番号) を返します。
    値の取得のみ可能です。

    ( CtrlName )
      コントロール名を指定します。

    ( 値の取得 )
      コントロール名から、各プロパティで必要な Index の値を返します。
      未登録名の場合は [ -1 ] を返します。
 

object .EnableEvents    ( Index ) [ = Boolean ]

    [ object ]グループのコントロール配列内で、Index で指定したコントロールについて、イベント発生の
    可否を制御します。
    値の設定と取得が可能です。

    一時的に、イベントの発生を抑止したい場合には、その処理の直前で[ False ]を設定し、処理終了後に
    [ True ]で再設定します。

    例えば、Change イベントの処理内で、同一グループの他のコントロールの値を変更したい場合(当然、
    通常なら、その際に、変更したコントロールに対して Change イベントが発生します)などに利用します。
    他のコントロールの値を変更する前に、そのコントロールの EnableEvents を Flase に設定し、値変更後
    に、True に戻すことで、値を変更した際に、そのコントロールの Change を抑止できます。

    ( Index )
      コントロール番号(Add メソッドで追加した順に1 からの連番)を指定します。

    ( 値の設定 )
      指定のコントロールについて、イベント発生可否を、True / False で設定します。
      False を設定した後には、必ず True に戻す処理も加えておいて下さい。

    ( 値の取得 )
      指定のコントロールについて、現在のイベント発生可否状態が、True / False で返ります
 

object .EventState    [ = Variant ( Array 関数配列 ) ]

    [ object ]グループに対して、Rgst メソッドで指定した『イベント種別』を Array 関数による
    Variant 配列で返します。
    1 以降の添字には、各イベント発生指示の有無が True/False で入っています。
    値の取得のみ可能です。

    ( 値の取得 )
      [ 0 ] は Long型、[ 1 〜 12 ] は Boolean型

      [ 0 ]には、 Rgst メソッドの Event 引数で指定した数値が入っています。

      [ 1 〜 12 ]には下記イベントの発生指示有無が True/False で入っています。
      [ 1 ] Change , [ 2 ] Click , [ 3 ] DblClick
      [ 4 ] KeyDown , [ 5 ] KeyPress , [ 6 ] KeyUp
      [ 7 ] MouseMove , [ 8 ] MouseDown , [ 9 ] MouseUp
      [ 10 ] DropBtnClick , [ 11 ] SpinDown , [ 12 ] SpinUp
 

object .Item    ( Index ) [ = Object ]

    [ object ]グループを構成する コントロールオブジェクトを返します。
    値の取得のみ可能です。
    (補) [値の取得のみ]とは、そのコントロールオブジェクトへの参照の事であり、そのコントロールの
            「各種プロパティ値を更新できない」 という意味ではありません。

    UserForm モジュール側で、コントロールを配列として操作する場合に利用します。
    Item プロパティの後にピリオドを挟んで、個々のオブジェクトのプロパティを記述できます。
        例:  object .Item( 1 ).Value

    このプロパティは汎用の[Object 型]なので、コーディング時にプロパティ/メソッドの自動メンバ表示
    が機能しません。自動メンバ表示が必要な場合は、次の[ ItmXxx ]プロパティを使って下さい。

    自動メンバ表示が機能しないとは言っても、手入力でプロパティ等を記述する事はできます(ただし、
    実行時に、そのコントロールが備えていないプロパティであれば、実行時エラーになるでしょう)。

    ( Index )
      コントロール番号(Add メソッドで追加した順に1 からの連番)を指定します。

    ( 値の取得 )
      Index に指定した番号のコントロールオブジェクトを汎用の [ Object 型 ]で返します。
      番号が「1〜コントロール数」の範囲外の場合は、[ Nothing ]が返ります。

    Item プロパティ は 【既定のプロパティ】 として定義されているので、[ .Item ] を省略して
           object ( 1 ).Value
    という風に記述する事ができます。
 

object .ItmLbl    ( Index ) [ = MsForms.Label ]
object .ItmCmd    ( Index ) [ = MsForms.CommandButton ]
object .ItmTxt    ( Index ) [ = MsForms.TextBox ]
object .ItmChk    ( Index ) [ = MsForms.CheckBox ]
object .ItmOpt    ( Index ) [ = MsForms.OptionButton ]
object .ItmTgl    ( Index ) [ = MsForms.ToggleButton ]
object .ItmCbo    ( Index ) [ = MsForms.ComboBox ]
object .ItmSpn    ( Index ) [ = MsForms.SpinButton ]

    [ object ]グループを構成する コントロールオブジェクトを返します。
    値の取得のみ可能です。
    (補) [値の取得のみ]とは、そのコントロールオブジェクトへの参照の事であり、そのコントロールの
            「各種プロパティ値を更新できない」 という意味ではありません。

    UserForm モジュール側で、コントロールを配列として操作する場合に利用します。
    個々のコントロールオブジェクト型ですので、コーディング時に自動メンバ表示が機能します。

    ( Index )
      コントロール番号(Add メソッドで追加した順番に1 からの連番)を指定します。

    ( 値の取得 )
      Index に指定した番号のコントロールオブジェクトをMsForms の [ 各コントロール型 ]で返します。
      番号が「1〜コントロール数」の範囲外の場合、および、登録されているコントロールと種別が一致しない
      場合は[ Nothing ]が返ります。

      Rgst メソッドで[AllType := True ]とした場合は、先ず、Item プロパティによって Object型で受け取り、
      TypeName関数で「コントロール型」を判定してから使うようにして下さい。
 

イベント
Private Sub object_Change ( ByVal Index As Integer )
Private Sub object_Click ( ByVal Index As Integer )
Private Sub object_DblClick ( ByVal Index As Integer, ByVal Cancel As MSForms.ReturnBoolean )
Private Sub object_KeyDown ( ByVal Index As Integer, _
                                ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer )
Private Sub object_KeyPress ( ByVal Index As Integer, ByVal KeyAscii As MSForms.ReturnInteger )
Private Sub object_KeyUp ( ByVal Index As Integer, _
                                ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer )
Private Sub object_MouseMove ( ByVal Index As Integer, ByVal Button As Integer, _
                                ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single )
Private Sub object_MouseDown ( ByVal Index As Integer, ByVal Button As Integer, _
                                ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single )
Private Sub object_MouseUp ( ByVal Index As Integer, ByVal Button As Integer, _
                                ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single )
Private Sub object_DropButtonClick ( ByVal Index As Integer )
Private Sub object_SpinDown ( ByVal Index As Integer )
Private Sub object_SpinUp ( ByVal Index As Integer )

    [ object ]に登録した各コントロールのイベントは全て、これらひとつのイベントプロシジャーで処理されます。

    各イベントの引数は、通常の MsForms コントロールのイベント引数の
           ByVal  Index  As  Integer
    を追加したパターンになっています。

    ( Index )
      イベントが発生したコントロールの番号(Add メソッドで登録した順に1から割当てられます)が返ります。
      番号は[ object ]単位で割当てられます。
      イベントが発生したコントロールにアクセスするには、[ Index ]の番号を引数にして Item または ItmXxx
      プロパティ を利用します。

    [ Enter , Exit , BeforeUpdate , AfterUpdate ] の各イベントは、このクラスでは処理できません。

    この[ clsBpca/clsBpca97 ]クラスで処理しているイベントについては、個々のコントロールの通常の
         イベントプロシジャーを記述しないで下さい。重複実行になってしまいます。


    1)  利用側でイベントプロシジャーを用意しても、[ Rgst メソッド ]で指定していないイベントは
          発生しません(イベント種別コード)。
    2)  [ Rgst メソッド ]で指定していても、利用側でイベントプロシジャーを用意していなければ
          機能しません。
    3)  [ Rgst メソッド ]で指定していても、そのコントロールに本来備わっていないイベントは
          発生しません。
    4)  [ BPCA_All ]を指定して、必要なイベントのみ、利用側でプロシジャーを用意するという
          コーディングでも構いませんが、余計な負荷を掛けない為にも、必要なイベントのみ
          [ Rgstメソッド ]に指定して使って下さい。


(補) clsBpca97 クラスの場合、正確に言えば「イベントプロシジャー」ではありません。
        下記の『イベント通知受領プロシジャー』 から Call される「普通のサブプロシジャー」です。

 

イベント通知 受領プロシジャー( clsBpca97 のみ)
[ 97 ]
clsBpca97 クラスの場合、利用側のUserForm モジュール内に、下記のプロシジャーを用意する必要が
あります。


プロシジャー名は 固定 です(clsBpca97 と Event の間のアンダーバーは、2つ並べます)。複数の
UserForm で利用する場合は、各々のUserForm モジュール内に1つずつ用意する必要があります。

イベントが発生した際に、UserForm側が[ clsBpa97 ]クラスからイベント発生の通知を受け取る為の
窓口ルーチンです。ここから、[ GrpId , EventId ] の内容によって、各イベント処理ルーチン(上記)へ
分岐していきます。

下記のプロシジャー名で [ Ctrl ]部分は任意です。 GrpId で指定した文字列 または そのグループの
object の名前などにすると良いでしょう。実際のコントロール名にすると、本物のイベントプロシジャー
とバッティングしますので注意して下さい。

Public Sub clsBpca97__Event _
    ( ByVal GrpId As String, ByVal EventId As Long, ByVal Index As Integer, _
      ByVal Cancel As MSForms.ReturnBoolean, _
      ByVal KeyCode_Ascii As MSForms.ReturnInteger, _
      ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single )

    Select Case GrpId
        Case "xxxx"    ' Rgst メソッドで指定した GrpId 文字列
            Select Case EventId
                Case BPCA_Change
                    Call Ctrl_Change ( Index )
                Case BPCA_Click
                    Call Ctrl_Click ( Index )
                Case BPCA_DblClick
                    Call Ctrl_DblClick ( Index , Cancel )
                Case BPCA_KeyDown
                    Call Ctrl_KeyDown ( Index , KeyCode_Ascii , Shift )
                Case BPCA_KeyPress
                    Call Ctrl_KeyPress ( Index , KeyCode_Ascii )
                Case BPCA_KeyUp
                    Call Ctrl_KeyUp ( Index , KeyCode_Ascii , Shift )
                Case BPCA_MouseMove
                    Call Ctrl_MouseMove ( Index , Button , Shift , X , Y )
                Case BPCA_MouseDown
                    Call Ctrl_MouseDown ( Index , Button , Shift , X , Y )
                Case BPCA_MouseUp
                    Call Ctrl_MouseUp ( Index , Button , Shift , X , Y )
                Case BPCA_DropBtnClick
                    Call Ctrl_DropButtonClick ( Index )
                Case BPCA_SpinDown
                    Call Ctrl_SpinDown ( Index )
                Case BPCA_SpinUp
                    Call Ctrl_SpinUp ( Index )
                Case Else
            End Select

        Case "yyyy"
            Select  EventId
                Case  ‥‥‥
                Case  ‥‥‥
                Case Else
            End Select

        Case Else
    End Select
End Sub


    ( GrpId )
      UserForm上で、複数のグループが有る場合でも、この窓口ルーチンは『唯1つ』です。どのグループ
      に対する通知なのかが返りますので、この[GrpId ]によって、各グループのイベント処理ルーチン へ
      振り分けて下さい。

    ( EventId )
      どのイベントが発生したのかが、下記のイベント種別の値で返りますので、この[EventId ]によって、
      各イベント処理ルーチン へ振り分けて下さい。
      なお、上記のように全てのイベントを記述する必要はありません。必要なイベント( Rgst メソッドで指定
      したイベント)のみ記述して下さい。

    ( Index )
      イベントが発生したコントロールの番号(Rgst メソッドで登録した順に、1から設定します)が返ります。
      そのまま、各コントロールのイベント処理ルーチンへ引き継いで下さい。

    ( Cancel , KeyCode_Ascii , Button , Shift , X , Y )
      イベントが発生した実際のコントロールから引き継いだ「イベントデータ」です。そのまま、各コントロール
      のイベント処理ルーチンへ引き継いで下さい。

 

利用 方法
[ 2K ]














[ 2K ]




















[ 2K ]

下記は『擬似からの脱却』での「曜日ボタン」サンプルのコードです。これや、サンプルブックの他のコードに
倣ってコーディングして下さい。

  Private WithEvents WeekBtn As clsBpca

  Private Sub UserForm_Initialize ( )
      Set WeekBtn = New clsBpca
      With WeekBtn
          .Add  cmdSun
          .Add  cmdMon
          .Add  cmdTue
          .Add  cmdWed
          .Add  cmdThu
          .Add  cmdFri
          .Add  cmdSat
          .Rgst  BPCA_Click
      End With
  End Sub

  Private Sub UserForm_Terminate ( )
      WeekBtn.Clear        ' クラス解放【必須】
      Set WeekBtn = Nothing
  End Sub

  Private Sub WeekBtn_Click ( ByVal Index As Integer )
  Dim vntWeekName As Variant
  Dim i As Integer
      vntWeekName = Array ( "", "日", "月", "火", "水", "木", "金", "土" )
      If (WeekBtn.ItmCmd ( Index ).BackColor = vbButtonFace ) Then
          For i = 1 To 7
              If ( i = Index ) Then
                  WeekBtn.ItmCmd ( i ).BackColor = &HCCFFFF    '薄黄
              Else
                  WeekBtn.ItmCmd ( i ).BackColor = vbButtonFace
              End If
          Next i
      Else
          WeekBtn.ItmCmd ( Index ).BackColor = vbButtonFace
      End If
      MsgBox vntWeekName ( Index ) & "曜日ボタンがクリックされました(" & Index & ")"
  End Sub

   上記のように、Add メソッドで追加する前に[ New キーワード ]付きの Set ステートメントで、 object に
    対して[ clsBpca ]クラスを設定する必要があります。

    各イベントプロシジャーの扱いは、通常のコントロールの場合と同じです。引数の先頭に加えられている
    [ Index ]を使って、[ Item ] もしくは[ ItmXxx ]プロパティにより個々のコントロールオブジェクトを操作
    して下さい。その他は、実際の利用例として『 Bpca_Class.xls 』のサンプルを参考にして下さい。
 

[ 97 ]














[ 97 ]




















[ 97 ]




















[ 97 ]

下記は『擬似からの脱却』での「曜日ボタン」サンプルのコードです。これや、サンプルブックの他のコードに
倣ってコーディングして下さい。

  Private WeekBtn As clsBpca97

  Private Sub UserForm_Initialize ( )
      Set WeekBtn = New clsBpca97
      With WeekBtn
          .Add  cmdSun
          .Add  cmdMon
          .Add  cmdTue
          .Add  cmdWed
          .Add  cmdThu
          .Add  cmdFri
          .Add  cmdSat
          .Rgst  Me.Name,  "WeekBtn",  BPCA_Click
      End With
  End Sub

  Private Sub UserForm_Terminate ( )
      WeekBtn.Clear        ' クラス解放【必須】
      Set WeekBtn = Nothing
  End Sub

  Private Sub WeekBtn_Click ( ByVal Index As Integer )
  Dim vntWeekName As Variant
  Dim i As Integer
      vntWeekName = Array ( "", "日", "月", "火", "水", "木", "金", "土" )
      If (WeekBtn.ItmCmd ( Index ).BackColor = vbButtonFace ) Then
          For i = 1 To 7
              If ( i = Index ) Then
                  WeekBtn.ItmCmd ( i ).BackColor = &HCCFFFF    '薄黄
              Else
                  WeekBtn.ItmCmd ( i ).BackColor = vbButtonFace
              End If
          Next i
      Else
          WeekBtn.ItmCmd ( Index ).BackColor = vbButtonFace
      End If
      MsgBox vntWeekName ( Index ) & "曜日ボタンがクリックされました(" & Index & ")"
  End Sub

  '===================================================================
  '===== イベント通知受領プロシジャー(Public) ==========================
  '===================================================================
  '[clsBpca97]クラスでは、[clsBpca97]クラスに登録したコントロールの
  'イベントは、全てのグループが、この
  '      通知受領プロシジャー  [clsBpca97__Event]  <名称固定>
  'を通して送られてくる。
  '[GrpId]によって、所定のグループ別のイベントプロシジャーに分岐させる。
  '(通知受領プロシジャーは、名前の重複を防ぐ為に敢えてアンダーバーを2つ繋げている)


  Public Sub clsBpca97__Event _
        ( ByVal GrpId As String, ByVal EventId As Long, ByVal Index As Integer, _
          ByVal Cancel As MSForms.ReturnBoolean, _
          ByVal KeyCode_Ascii As MSForms.ReturnInteger, _
          ByVal Button As Integer, _
          ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single )

      Select Case GrpId
          '『擬似からの脱却』解説で使った曜日ボタン
          Case "WeekBtn"
              Select Case EventId
                  Case BPCA_Click
                      Call WeekBtn_Click ( Index )
                  Case Else
              End Select
  '        Case "xxxx"
  '            Select Case EventId
  '                Case ‥‥‥
  '                Case ‥‥‥
  '                Case Else
  '            End select

          Case Else
      End Select
  End Sub



   上記のように、Add メソッドで追加する前に[ New キーワード ]付きの Set ステートメントで、 object に
    対して[ clsBpca ]クラスを設定する必要があります。

    各イベントプロシジャーの扱いは、通常のコントロールの場合と同じです。引数の先頭に加えられている
    [ Index ]を使って、[ Item ] もしくは[ ItmXxx ]プロパティにより個々のコントロールオブジェクトを操作
    して下さい。その他は、実際の利用例として『 Bpca_Class.xls 』のサンプルを参考にして下さい。
 




====================================================
    イベント発生指示コード ( modBpcaConst )
====================================================
          [ clsBpca ] [ clsBpca97 ] クラスを使用するには、[イベント種別] 定数を定義した[ modBpcaConst ] を
                一緒にインポートする必要があります。定義されている内容は下記になります。

Public Const BPCA_Change As Long = 1
Public Const BPCA_Click As Long = 2
Public Const BPCA_DblClick As Long = 4
Public Const BPCA_KeyDown As Long = 8
Public Const BPCA_KeyPress As Long = 16
Public Const BPCA_KeyUp As Long = 32
Public Const BPCA_MouseMove As Long = 64
Public Const BPCA_MouseDown As Long = 128
Public Const BPCA_MouseUp As Long = 256
Public Const BPCA_DropBtnClick As Long = 512
Public Const BPCA_SpinDown As Long = 1024
Public Const BPCA_SpinUp As Long = 2048

Public Const BPCA_All As Long = &HFFF&
'[ 1]bit目(ON)
'[ 2]
'[ 3]
'[ 4]
'[ 5]
'[ 6]
'[ 7]
'[ 8]
'[ 9]
'[10]
'[11]
'[12]

'(4095 , 12bit)

Public Const BPCA_KeyDU As Long = BPCA_KeyDown + BPCA_KeyUp
Public Const BPCA_KeyDPU As Long = BPCA_KeyDown + BPCA_KeyPress + BPCA_KeyUp
Public Const BPCA_MouseDU As Long = BPCA_MouseDown + BPCA_MouseUp
Public Const BPCA_MouseMDU As Long = BPCA_MouseMove + BPCA_MouseDown + BPCA_MouseUp
Public Const BPCA_SpinDU As Long = BPCA_SpinDown + BPCA_SpinUp

Public Const BPCA_Except_MouseM As Long = BPCA_All - BPCA_MouseMove


  アドイン化したクラスを利用している場合、clsBpca (Excel2000 以上用) については同じ値で
    列挙型の定義もしてあります。

  Public Enum BPCA2_Event
      BPCA2_Change = BPCA_Change
      BPCA2_Click = BPCA_Click
      BPCA2_DblClick = BPCA_DblClick
      BPCA2_KeyDown = BPCA_KeyDown
      BPCA2_KeyPress = BPCA_KeyPress
      BPCA2_KeyUp = BPCA_KeyUp
      BPCA2_MouseMove = BPCA_MouseMove
      BPCA2_MouseDown = BPCA_MouseDown
      BPCA2_MouseUp = BPCA_MouseUp
      BPCA2_DropBtnClick = BPCA_DropBtnClick
      BPCA2_SpinDown = BPCA_SpinDown
      BPCA2_SpinUp = BPCA_SpinUp
      BPCA2_All = BPCA_All
      BPCA2_KeyDU = BPCA_KeyDU
      BPCA2_KeyDPU = BPCA_KeyDPU
      BPCA2_MouseDU = BPCA_MouseDU
      BPCA2_MouseMDU = BPCA_MouseMDU
      BPCA2_SpinDU = BPCA_SpinDU
      BPCA2_Except_MouseM = BPCA_Except_MouseM
  End Enum




  ====================================================================
  『擬似からの脱却』 汎用クラスモジュール [ clsBpca / clsBpca97 ] リファレンス
  ====================================================================

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