今回はVBAのユーザーフォームでテキストボックスにデフォルトの値を設定し、ユーザーの使い勝手を高めます。この記事はVBAで自動化ツールを作成している非エンジニアの会社員を読者に想定しています。
目次
ユーザーフォームが表示される事がトリガーのイベントプロシジャInitialize
今回はInitializeというユーザーフォームが開かれたことをトリガーにして実行されるイベントプロシジャを利用します。やりたいことは下記の様な設定をデフォルトで設定することです。
それぞれのコントロールのオブジェクト名は下記の通りです。
- ユーザーフォーム:登録フォームfm
- ユーザー名のラベル:Label1
- ユーザーが入力するテキストボックス:入力tb
- 無効な値が入力されたときのラベル:エラーメッセージ
- 「登録」のコマンドボタン:登録cb
既に下記のプログラムが作成済みです。このプログラムの意味の詳しい解説は、VBA テキストボックスの基本をご参照下さい。
Private Sub 登録cb_Click() Dim 入力された値 As String Dim 入力された値の文字数 As Long 入力された値の文字数 = Len(入力tb.Value) Select Case 入力された値の文字数 Case 0 エラーメッセージ.Caption = "ユーザー名が入力されていません。" Exit Sub Case 1 エラーメッセージ.Caption = "ユーザー名は2文字以上で入力して下さい。" Exit Sub End Select If IsNumeric(入力tb.Value) Then エラーメッセージ.Caption = "数値のみの名前は無効です" 入力tb.Value = "" 入力tb.SetFocus Exit Sub Else 入力された値 = 入力tb.Value End If エラーメッセージ.Caption = "" Sheets(1).Cells(1, 1) = 入力された値 End Sub
ユーザーフォームが表示される瞬間にテキストボックスに文字を表示させる
実際にInitializeでユーザーフォームの実装を見て行きます。まずは、Initializeのイベントプロシジャを挿入します。プルダウンリストからUserForm、イベント名はInitializeを選択します。
Initializeでデフォルト設定を行う
挿入されたプロシジャの中身を作成していきます。
Private Sub UserForm_Initialize() 入力tb.Value = "例) 山田 ゆん太郎" 入力tb.ForeColor = &HC0C0C0 End Sub
Initializeはユーザーフォームが表示された瞬間に実行されるイベントなので、初期設定にうってつけです。ユーザーが入力方法に迷わないように記入例を薄く表示させています。入力tb.ForeColor = &HC0C0C0のところがポイントです。薄い灰色にしたいのですが、色の番号が分からないので、プロパティウィンドウで調べます。実際に表示させたい色を選択して色番号を確認します。
ForeColorというのがテキストボックスに表示される値の文字色を設定するプロパティ名です。「&H00C0C0C0&」と表示されているので、その部分をコピーして、プログラムの中に貼り付けます。””で囲む必要はありません。すると、エディタが勝手にプログラムの中で使うのに適切な記述「&HC0C0C0」に書き換えてくれます。
【注意事項】
実際はここでデフォルト値を決めても構いません。しかし、私は上のサンプルコードのように初期化で色を設定することをオススメします。
理由は、このテキストボックスはユーザーが入力する場合には通常通り黒い文字を表示したいからです。初期設定の色でしか文字を表示しないのであれば、構いませんが、場合によって表示させる色が異なる場合は、初期設定時に色を変える方がメンテナンス時など、後から見たときに分かりやすいです。
ユーザーフォームを表示させると下の様になります。
選択されたらテキストボックスを空にしつつ文字の色を黒にする
入力しやすいテキストボックスになりました。しかし、このままではユーザーが入力した文字も灰色のままになってしまいます。そこで、ユーザーがテキストボックスを選択したらテキストボックスを空にしつつ、文字の色を黒に変更します。
Private Sub 入力tb_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) 入力tb.Value = "" 入力tb.ForeColor = &H80000008 End Sub
これでユーザーがマウスで入力のためのテキストボックス、入力tbをクリックした瞬間に発動するイベントが完成しました。
マウスではなくTabキーで選択する場合やいきなり文字を打ち込むユーザーがいるかもしれません。キーボードで入力が始まった瞬間にも同様のプロシジャを設定しておきます。
Private Sub 入力tb_Change() 入力tb.Value = "" 入力tb.ForeColor = &H80000008 End Sub
これで大分ユーザーフレンドリーなコードになりました。少しの工夫で使いやすさが向上します。皆さんも少しの工夫をしてツールの完成度を高めていきましょう。