皆様こんにちは、ノグチです。
ユーザーフォームを作成して、使ってみることを目標に、ユーザーフォームのプロパティやイベントを、連載形式でご紹介しています。
前回までのおさらい
前回までに作成したユーザーフォームがこちら。
前回の記事では、このフォームの上側のテキストボックスのプロパティを変更したのでした。
今回は、同じくフォーム上側のテキストボックスのイベントを使ってみましょう。
テキストボックスのイベント
テキストボックスにも、便利に使えるイベントが多く用意されています。
そのイベントの中で、使いどころが多そうな、Enter、Exit、Changeの3つをご紹介します。
コントロールのイベントに対応したプロシージャをVBEで開く方法は、こちらの記事の「イベントに対応したイベントプロシージャを開く」でご紹介していますので、併せてご覧ください。
Enterイベント:テキストボックスにフォーカスが当たるとき
まず、Enterイベントからいきましょう。
Enterイベントは、テキストボックスにフォーカスが当たったタイミングで実行されるイベントです。
ユーザーフォームが開いたとき、このEnterイベントがセットされているテキストボックスに最初にフォーカスがあたっている場合は、処理の順番をざっくり言うと、ユーザーフォームの読み込み、初期処理→フォーカスがあたっているコントロールのEnterイベントの処理、となります。
テキストボックスにフォーカスがあたったら背景色を変える
Enterイベントに、テキストボックスにフォーカスが当たったらテキストボックスの背景色を変える、という処理をセットしてみましょう。
テキストボックスの背景色は、BackColorプロパティを使って変えることができますよ。
コードはこちら。
Private Sub TextItem_Enter() With TextItem .BackColor = RGB(255, 0, 0) End With End Sub
テキストボックスにフォーカスが当たったら、背景色を赤色に変える、というコードです。
実際に使ってみましょう。
ユーザーフォームを開いて、下のテキストボックスにあたっているフォーカスを、上のテキストボックスをクリックすることで移してみると…
このように、背景色がプロパティで指定した色に変わっていますね。
Exitイベント:フォーカスがテキストボックスから外れる時
お次はExitイベント。
このイベントは、フォーカスがテキストボックスから外れる時に実行されるイベントです。
フォーカスが外れたら背景色を変える
Enterイベントでご紹介した、テキストボックスにフォーカスがあたったら背景色を変えるというイベントの逆を、このイベントでやってみましょう。
フォーカスが外れるタイミングで、テキストボックスの背景色をもとの色に戻す、というコードです。
Private Sub TextItem_Exit(ByVal Cancel As MSForms.ReturnBoolean) With TextItem .BackColor = RGB(255, 255, 255) End With End Sub
早速試してみましょう。
テキストボックスからフォーカスを外すと…
この通り、背景色が元の白に戻っています。
テキストボックスに入力された値が指定した文字数かチェックする
テキストボックスに入力された値が、入力して欲しい形式になっているのか?をチェックするのも、このイベントが使えます。
このイベントには、引数Cancelがあります。
このCancelにTrueを指定すれば、フォーカスが次のコントロールに移ることをキャンセルさせることができます。
例えば、テキストボックスに5文字以上を入力して欲しい場合、テキストボックスに入力された文字数が指定した数に満たない場合、メッセージを出して、テキストボックスからフォーカスが移動しないようにさせることもできます。
テキストボックスに入力された文字数が5文字以下だったら、メッセージを表示してイベントをキャンセルする=フォーカスを他のコントロールに移動させない、という処理だと、こんなコードになります。
Private Sub TextItem_Exit(ByVal Cancel As MSForms.ReturnBoolean) If Len(TextItem.Value) < 5 Then MsgBox "5文字以上で入力してください" Cancel = True Else With TextItem .BackColor = RGB(255, 255, 255) End With End If End Sub
引数CancelにTrueを指定しても、イベントプロシージャ内の処理は一旦最後まで実行されますので、フォーカスが外れてよい場合の、背景色が変わる処理部分はIF文を使って分岐するようにしています。
実際にこの処理をさせてみましょう。
ユーザーフォームを開いて、テキストボックスに4文字入力します。
そして、次のテキストボックスにフォーカスを移そうとすると…
この通り、メッセージが表示されて、フォーカスがテキストボックスに残ったままになっていますね。
Changeイベント:テキストボックスの値が変更された時
Changeイベントは、テキストボックスの値が変更されたタイミングで実行されるイベントです。
キーボードでの文字入力はもちろん、Back spaceキーやDeleteキーでの文字の削除もこのイベントの対象になりますよ。
入力の都度文字数をフォーム上に表示してみる
このChangeイベントを使って、ユーザーフォーム上に入力されている文字列を、テキストボックスの値をそのまま表示させてみましょう。
フォームの右上に、「txtboxCopy」というラベルを追加して、そこにテキストボックスに入力された文字列を入力する都度表示させます。
コードはこちら。
Private Sub TextItem_Change() txtboxCopy.Caption = TextItem.Value End Sub
そしてユーザーフォーム上で、テキストボックスに値を入力してみると…
この通り、テキストボックスに値が入力される都度Changeイベントが実行されて、ラベルの文字列が更新されます。
使いどころは注意が必要
Changeイベントは、テキストボックスの値が変わったら実行されるとご紹介しました。
このイベント、テキストボックスの値が変わる都度実行されますので、メッセージを出すような処理はさせないのがよいでしょう。
というのもこのイベント、テキストボックスの値が変わる都度実行されますので、1文字入力したり文字を削除したりする都度メッセージが出てしまうことになって非常に鬱陶しいのです。
Changeイベントを使って何か処理をさせたい場合は、注意が必要ですね。
最後に
今回はテキストボックスにフォーカスが当たるときに実行されるEnterイベント、フォーカスが外れるときに実行されるExitイベント、値が変更された時に実行されるChangeイベントの3つをご紹介しました。
ユーザーフォームを作成するにあたって、このイベントを知ることは避けて通れません。
イベントが実行される条件やタイミングなど、「難しいのでは?」と思ってしまうかもしれませんが、わかってしまえばユーザーフォームでできることの幅がぐっと広がりますよ。
それでは、最後までお読みいただきありがとうございました!
連載目次:【エクセルVBA】ユーザーフォームを使ってみよう!
ユーザーフォームは、ちょっとした画面なら作れてしまう、便利な機能です。
何となく敷居が高いように感じてしまいますが、順を追っていけば難しいことはありませんよ。
- 【エクセルVBA】ユーザーフォームを作ってみよう!VBEでフォームを挿入する方法
- 【エクセルVBA】Showメソッドでユーザーフォームをコマンドボタンから開いてみよう!
- 【エクセルVBA】コマンドボタンのClickイベントとUnloadステートメントでユーザーフォームを閉じる方法
- 【エクセルVBA】テキストボックスのプロパティで入力を便利にしよう
- 【エクセルVBA】テキストボックスでよく使う3つのイベントを使ってみよう
- 【エクセルVBA】Initializeイベントでワークシートの値をユーザーフォームの初期値にセットする
- 【エクセルVBA】AfterUpdateイベントでテキストボックス同士を連動させてみよう
- 【エクセルVBA】コマンドボタンのClickイベントでワークシートを更新してみよう
- 【エクセルVBA】ユーザーフォームのリストボックスを使ってみよう!
- 【エクセルVBA】リストボックスのRowSourceプロパティの値を変動させてみよう!
- 【エクセルVBA】AddItemメソッドでリストボックスに値を追加してみよう!
- 【エクセルVBA】リストボックスのListプロパティで複数列の値を更新する
- 【エクセルVBA】ユーザーフォームにコンボボックスを追加する方法
- 【エクセルVBA】コンボボックスに値をセットする2つの方法 RowSourceプロパティとAddItemメソッド