Excel VBA > VBA:実務活用 > 動的なコントロールの「Enter」、「Exit」を疑似的に検知する
このエントリーをはてなブックマークに追加

動的なコントロールの「Enter」、「Exit」を疑似的に検知する

動的に追加したコントロールには無いイベントがあって困るときがある

ユーザーフォーム上に動的に追加したコントロールはクラスモジュール側でイベントを拾ってくれないものもあります。
とりわけ、テキストボックス等で「Enter」や「Exit」イベントを活用したいときに非常に苦労したりします。
そこで今回は、動的に追加したコントロールに対して、この「Enter」、「Exit」イベントを疑似的に拾う方法について説明します。この方法ではクラスモジュール不要の為、便利と言えば便利でもあります。
ちなみにここでの説明は「テキストボックス(Textbox)」について確認、説明しています。
dynamic_CtrlEvent_1253_02

テキストボックスを追加し、それにEnterとExitイベントを疑似的に付与する

ここの例では、上記の画像のようにテキストボックスを動的に1個追加します。

・左側テキストボックス:静的(最初から作成しておく)
・右側テキストボックス:動的(Initializeイベント内で作成する)

このようにして、右側のテキストボックスを動的に作り出します。

その後
Enterの疑似イベント:テキストボックスの背景を黄色
Exitの疑似イベント:テキストボックスの背景を青色

として、試しています。
dynamic_CtrlEvent_1253_01

なぜ「Enter」と「Exit」イベントを検知できるか

ではなぜ上記の画像では、「Enter」と「Exit」イベントが拾えているのでしょうか?
しかもクラスモジュールは使っていません。後述するコードを見てもらえれば分かると思いますが、
上記の処理だけであれば、動的なテキストボックスの追加部分を含めてもほんの10行程度です。

これができる理由とは、、、
実はとても簡単な仕組みです。
フレーム(Frame)を使っています。
dynamic_CtrlEvent_1253_03

他のコントロールのイベントを「代用」する仕掛け

既に気づいた方もいらっしゃるかもしれませんが、実は動的に追加したテキストボックスはフレーム内に配置されています。
すなわちこのフレームのEnterイベントとExitイベントを動的テキストボックスのそれらに割り当てるような動きをしているから実現できています。これが「疑似的」である所以です。

もっとも、この方法は「動的であることのメリットが消失」するため違和感があります。ただ一方で、実装としてはシンプルなことも見逃せないです。好みの問題かもしれないですが、やはり、そもそもとしてテキストボックス(そしてその他のコントロールも)に、「Enter」と「Exit」を仕様としてあってほしいです。

コード実行時で気になった点

ちなみにこのコードのコントロール追加はフォームの「Initializeイベント」で追加しています。
「Activateイベント」では、コントロールが追加される「瞬間」くらいにフレームのEnterイベントが発生します。
恐らくこの時点では、テキストボックスはまだ「未完成状態」と思われ、Enterイベント内でエラーが発生します。
それを回避するためにInitializeで確実に追加した後という形にしています。

Option Explicit

'============================================
Private Sub Frame1_Enter()

    'テキストボックスの背景を黄色にする
    Me.Frame1.Controls(0).BackColor = vbYellow

End Sub

'============================================
Private Sub Frame1_Exit(ByVal Cancel As MSForms.ReturnBoolean)

    'テキストボックスの背景を青色にする
    Me.Frame1.Controls(0).BackColor = vbBlue

End Sub

'============================================
Private Sub UserForm_Initialize()

    'テキストボックスを動的に作成
    Me.Frame1.Controls.Add ("Forms.TextBox.1")

End Sub

カテゴリ:VBA:実務活用