VBAでフォームを使って日付や時刻を入力する場面では、「年 → 月 → 日 → 時 → 分 → 秒」のように順番にテキストボックスへ数値を入力することが多いかと存じます。このような入力操作の中で、毎回「Tab」キーを押すのは少々手間がかかることもございます。
本記事では、各テキストボックスに設定した最大文字数(MaxLength)に達した際に、自動で次のテキストボックスへフォーカスが移動する実装方法をご紹介いたします。VBA初心者の方でも簡単に導入できますので、フォームの入力効率を高めたい方はぜひお試しください。
概要:自動で次のTextBoxにフォーカスを移す仕組み
この機能は、各 TextBox
の Change
イベント内で、現在の文字数が MaxLength
に達したかどうかを判定し、次の TextBox
にフォーカスを移すというシンプルな仕組みで実現いたします。
事前準備
各テキストボックスに対して、以下のような MaxLength
の設定をプロパティウィンドウで行っておく必要がございます。
項目 | MaxLength の設定例 |
---|---|
年 | 4 |
月〜秒 | 2 |
サンプルコード(UserFormモジュール)
以下は実装例でございます。コントロール名は任意に変更可能ですが、分かりやすいように「入力対象 → 次の入力欄」という順序で処理を記述しております。
' 共通処理:最大文字数に達したら次のTextBoxへ移動
Private Sub JumpToNextBox(currentBox As MSForms.TextBox, nextBox As MSForms.TextBox)
If Len(currentBox.Text) >= currentBox.MaxLength Then
nextBox.SetFocus
End If
End Sub
' 各TextBoxのChangeイベントで呼び出す
Private Sub txtYear_Change()
JumpToNextBox txtYear, txtMonth
End Sub
Private Sub txtMonth_Change()
JumpToNextBox txtMonth, txtDay
End Sub
Private Sub txtDay_Change()
JumpToNextBox txtDay, txtHour
End Sub
Private Sub txtHour_Change()
JumpToNextBox txtHour, txtMinute
End Sub
Private Sub txtMinute_Change()
JumpToNextBox txtMinute, txtSecond
End Sub
' 最終欄(秒)では任意でコマンドボタン等にフォーカス移動
Private Sub txtSecond_Change()
If Len(txtSecond.Text) >= txtSecond.MaxLength Then
btnSubmit.SetFocus
End If
End Sub
実装時の注意点
BackSpace
で文字を削除した場合はフォーカス移動しません。これは意図的な仕様です。- 任意の順番で入力させたい場合は、
JumpToNextBox
の引数を変更するだけで柔軟に対応できます。 - 「秒」まで入力し終えたタイミングで、送信ボタンや次の処理へ移ることも可能です。
おわりに
VBAフォームにおいて「Tabキーを押さずに入力欄を次々に移動する」という小さな工夫は、ユーザー体験の向上に大きく寄与いたします。本記事の方法は非常に簡単に導入できるうえ、可読性やメンテナンス性も高いため、業務用フォームなどでも広く活用いただけるはずです。
ぜひご自身のプロジェクトでも導入をご検討ください。