【 擬似からの脱却 】 [ Breakthrough in the Pseudo-Control
Arrays ]
[ clsBpca の 軌跡 ] [ 前頁 , 次頁 , §1 , §2 , §3 , §4 , §5 , §6 , §7 , §8 , §9 , §10 , §11 , §12 ]
[ 汎用クラス , トグルラベル クラス , Focus クラス , クラス アドイン , カレンダークラス ] [ 質問はメールへ ]
====================================================================
§9 擬似の足枷
====================================================================
(前節より‥‥‥)
ところで、Excel2000から「RaiseEvent 」という命令がサポートされているのを知っていますか?
前節では、呼び元のUserForm参照を[Object 型]でクラスへ引き継いでおき、クラスモジュールの
イベントルーチンから
|
Call MyCaller.RaiseClick(MyIndex) (補) MyCaller は[ Object 型 ]のUserForm参照
|
という風に、UserForm1内のサブルーチンを指定し、これをCallする事で、ユーザーフォームモジュール内
に「イベントルーチンもどき」を実現しました。
ところで、Excel2000 から は
クラスモジュールからカスタムイベントを発生させる
事が出来るようになりました。「もどき」ではなく正真正銘の『イベント』です。
カスタムイベントの生成は下記のようにして行ないます。
=== クラスモジュール ===
(1) 宣言セクション(モジュールの先頭)で
カスタムイベントの「イベント名」 および 「引数リスト」
を定義します。
イベント名の名前は任意ですが、クリックを処理するイベントですから、やはり、イベント名は「Click 」
にします。引数は普通のサブプロシジャーと同様に記述します。前節の「もどき」と同じように、ここ
では[ Index ]だけですので、イベント宣言は下記のようになります。
|
Public Event Click(ByVal Index As Integer)
|
(2) 定義したカスタムイベントを実際に発生させる為には「RaiseEvent 」ステートメントを使います。
|
Private WithEvents MyCtrl As MSForms.CommandButton
Private Sub MyCtrl_Click() ← 上のWithEvents付き[ MyCtrl ]に対するClick イベントプロシジャー
RaiseEvent Click(MyIndex) ← このクラスのカスタムイベント『 Click 』を発生させる
End Sub
|
(3) このようにイベント定義をしてあると、このクラスを利用する側のUserFormでは
・クラスオブジェクト定義の際に[WithEvents]を付ける
・『クラスオブジェクト名+アンダーバー+カスタムイベント名』という名前の
サブプロシジャーを用意する
とする事により、クラス内でカスタムイベントが生成(RaiseEvent)された瞬間に、VBAシステムを
経由して下記のサブプロシジャー(即ち、イベントプロシジャー)が呼び出されます。
|
Private WithEvents cmdWeekBtn As clsWeekCmd
Private Sub cmdWeekBtn_Click(ByVal Index As Integer)
〜 曜日表示の処理 〜
End Sub
|
(補) ここで、仮に クリックイベント の 【イベント名】 を Click ではなく ABC で定義
Public Event ABC ( ByVal Index As Integer )
(当然、 RaiseEvent
ステートメント も RaiseEvent ABC ( MyIndex ) になります)
していると、利用側の UserForm 内で記述する
クリックイベント の プロシジャー 名は
Private
Sub cmdWeekBtn_ABC ( ByVal Index As Integer )
となります(参照 : §5 「イベント名の解説」 部分)。
ここまで来ると、極々普通のコマンドボタンのクリックイベントと同じですね。
o(^o^)o ヤッター♪
ところで、最初に書いたように、この機能は「Excel2000(1999/6 リリース) からサポート」されてい
ます。だとしたら、
何故、誰も使わないのでしょう?
何故、どこの解説本/HPにも書いていないのでしょう?
私が、この「擬似からの脱却」を書いているのは 2004/5 です。
まさか、5年もの間、誰も気付かなかった? そんな馬鹿な (oT▽T)ノ彡
と思いませんか? (・・? 確かに‥‥
上で「このように書けばカスタムイベントを作れる」と書きましたが、実のところ‥‥‥
擬似コントロール配列手法では、『このように書く』事が出来ない為に、
「RaiseEvent」が使えない
のです。もう少し正確に言えば、
クラス側には「RaiseEvent」を書けるけれども、
UserForm側で「WithEvents」宣言が書けない
ので『使えない』のです。 (-"-#) 何でやねん!
WithEventsのヘルプには
ActiveX オブジェクトによって起動されるイベントに対応する為のオブジェクト変数である
ことを指定するキーワードです。クラス モジュール内でのみ有効です。
キーワード WithEvents を使用して任意の数の変数を個別に宣言できます。
ただし、キーワード WithEvents では、配列は作成できません。
また、キーワード New をキーワード WithEvents と共に使用することはできません。
とあります。 (ToT) そっ、そんな〜〜
仮に無理に使おうとしても、イベントプロシジャー名
『 クラスオブジェクト名 + アンダーバー
+ カスタムイベント名 』
を作ろうとした時に
cmdWeekBtn(1)_Click
となりますが、このような名前は実際的に作れないし(カッコは名前に使えない)、もし仮にカッコ
が使えたとしても、その時には、"(1)"は名前の一部であって、配列の添え字という解釈にはなり
ませんから‥‥という事を考えれば、[WithEvents ]が配列では使えないという理由が判るでしょう。
つまり、擬似コントロール【配列】である以上、[ RaiseEvent : WithEvents
]のセットを使った非常
に便利な機能(カスタムイベント)とは『完璧に縁が無い』という事です。
これが、今まで、
誰も使わない、どこの解説本/HPにも書いていない
理由です(こういうのもある、と書いたところで、使えないのでは意味無いですからね)。
次節では、この「足枷」を取り除いて、VB並みの「コントロール配列」記述を利用できるようにする
手法について解説します。
====================================================================
次節 : §10 擬似からの脱却
====================================================================
[ 前頁 , 次頁 , §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. |