|
【 定 義 】 |
[ 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
』のサンプルを参考にして下さい。
|