【VBAフォーム】Tab不要で自動的に次のTextBoxへ移動させる方法とは?

VBAでフォームを使って日付や時刻を入力する場面では、「年 → 月 → 日 → 時 → 分 → 秒」のように順番にテキストボックスへ数値を入力することが多いかと存じます。このような入力操作の中で、毎回「Tab」キーを押すのは少々手間がかかることもございます。

本記事では、各テキストボックスに設定した最大文字数(MaxLength)に達した際に、自動で次のテキストボックスへフォーカスが移動する実装方法をご紹介いたします。VBA初心者の方でも簡単に導入できますので、フォームの入力効率を高めたい方はぜひお試しください。


目次

概要:自動で次のTextBoxにフォーカスを移す仕組み

この機能は、各 TextBoxChange イベント内で、現在の文字数が 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キーを押さずに入力欄を次々に移動する」という小さな工夫は、ユーザー体験の向上に大きく寄与いたします。本記事の方法は非常に簡単に導入できるうえ、可読性やメンテナンス性も高いため、業務用フォームなどでも広く活用いただけるはずです。

ぜひご自身のプロジェクトでも導入をご検討ください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次