2013
6
04

ExcelVBAでControlオブジェクトのChangeイベントを一括制御する方法

コントロールオブジェクトがたくさんあったとして、それの Change イベント、全部ベタで書かなきゃいけないの…?と思って調べてみたら、とっても便利な方法があったのでシェアさせて頂きます。


コントロールの変数制御

過去に、コントロールオブジェクト自体の制御については書いたことがありました。

TextBox1, TextBox2, TextBox3 のような数値の部分を変数で制御すると、For~Nextなどで回せるようになって、ベタ打ちするよりずっと楽になるなーと思って重宝していたんですが。

Changeイベントを楽にできないものか…

今回、TextBox から内容が変わったときに走る、いわゆる Change イベントを全ての TextBox に実装したかったのですが、TextBox の数が多くて「これ全部に Change イベント書くのか…」とげんなりして、なんかスマートにできないかなーと調べてみたらこんな記事が。

できるのか!!すごい!参考にさせて頂いて実装してみたらすっごく省コードで出来ちゃいました!nishi6さんに、この場にて厚く御礼申し上げます。

せっかくなので、私が組んだほうのコードも載せておこうと思います。(ほとんど同じになっちゃってますが…。)変数名などは同じにさせて頂きますね。一応解説も私なりに書いてみましたが、元の説明が完璧でしたのでそちらも是非ご参照ください。

コード

Class1

まず、[挿入]→[クラスモジュール]。Class1に以下を書きます。

1行目のWithEventsでイベントを拾うことができるので、TextBox 型で宣言しておきます。

4~7行目は、変数myTextはどの TextBox を参照するのか、ということを定義します。

9~15行目が、実際に処理を行う Change イベントです。このコードでは変更のあった TextBox の中身が空なら背景を灰色、そうでなければ白にしています。

本来はこのような書き方をしますが、.Controlsは省略できるので、

このような形で書いています。

変数myIndexは Integer(整数型)なので、条件分けすれば TextBox の 1~10 はこの処理、11~20 はこの処理のように分岐させることもできます!

UserForm1

次に、対象のTextBoxがおいてあるユーザーフォームへ。

ユーザーフォームが呼び出されたとき、先程の4~7行目に書いた S_setText 関数を呼び出して、変数myTextが参照する TextBox をそれぞれ定義します。

以上のコードだけで、TextBox がいくつあっても全部の Change イベントを一括で制御できちゃいます。素敵だ!

チェックボックスでもできちゃう!

ちょこっと書き換えれば、CheckBox の Change イベントにも。

Class1

UserForm1

同じ感じにすれば、他のイベントやコントロールでもできそうですね!

ただ、WithEvents は Enter, Exit, BeforeUpdate, AfterUpdate など、コントロールのフォーカス移動時に発生するイベントは検知できないみたいですのでご注意を。

でもすごく便利ですね。興奮してしまいましたw

追記:やってみて分かったのですが、TextBox に関しては Change イベントって使いにくいですね…! 一文字変わる毎に走ってしまうので、使い方によっては無用な処理を引き起こす可能性も…。

「テキストボックスが変更されたら」という処理は AfterUpdate を使ったほうが良さそうです。変更があり、フォーカスが他のコントロールに移った時に走ってくれます。ただ、上述したように AfterUpdate は WithEvent では検知できないので、今回の方法では使えないかな_(:3 」∠)_

追記:別解

上記では配列を使ってコントロールの番号を指定していますが、ユーザーフォーム上の全てのコントロールをループして、その中の任意のタイプのコントロールだけ、ということもできます。

Class1

myCheckがPublicでも大丈夫ならちょっと短く書けますね。

UserForm1

コントロールオブジェクトの数値を気にしない場合はこちらの使い方でも。

thomさんの記事を参考にさせていただいています!

関連

この WithEvent を使って、クリックイベントを拾うカレンダーコントロールを作ってみました。

クラスモジュールの使い方をまとめてみました。

  • このエントリーをはてなブックマークに追加
  • follow us in feedly 618
  • RSSを登録

公開日:2013/06/04
更新日:2016/09/20


コメントを残す




*印は必須項目です。コメントは承認制ですので、反映までしばらくお待ち下さい。(稀にですがスパムの誤判定にて届かないこともあるようですので、必要な際はお問い合わせからお願い致します。)


back to top