EXCEL VBAメモ - ユーザーフォーム上のTextBoxにEnter押下で連続入力する
目的
ListBoxとTextBoxがあるユーザーフォームで、TextBoxに入力したデータをListBoxに追加していきたい。
その時Enter押下だけで連続に入力していく様にしたい。
試行錯誤
通常はTextBoxにデータを入力したあとにEnterを押すとフォーカスが別のコントロールに移動してしまう為、追加用のButtonコントロール等を用意しなければならない。
Enterのみで連続入力ができないか、TextBox_KeypressイベントやTextBox_Keydownイベント等試したけれども、やはりEnterでフォーカスが移動してしまい、上手くいかない。
結論
TextBox_BeforeUpdateというイベントを利用すると良い。このイベントはTextBoxの入力値に変更があった場合、フォーカスが移動する前に発生し、引数にCancelがありフォーカス移動を止めることができる。
従って、このイベント内でListBoxに追加する処理を記述してから、最後にCancel に True を代入することでTextBoxにフォーカスを残したままListBoxにデータを追加することが可能になる。
(フォーカス移動後に発生するTextBox_AfterUpdateイベントもある。こちらはCancelが無い)
問題点
無条件にCancel = Trueにすると、以下の問題が生じるので、TextBoxに値が存在する場合のみ行うなど条件分けが必要になる。
- TABによるフォーカス移動が利かなくなる
- 他のButton等が使用できなくなる
Private Sub UserForm_Initialize() ListBox1.AddItem "aaa" ListBox1.AddItem "bbb" ListBox1.AddItem "ccc" ListBox1.AddItem "ddd" TextBox1.IMEMode = fmIMEModeDisable TextBox1.SetFocus End Sub '他のコントロールにフォーカスが移動する前に発生 'Cancel = Trueでフォーカス移動を禁止 Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) If TextBox1.Text <> "" Then ListBox1.AddItem TextBox1.Text TextBox1.Text = "" '最後に追加した項目を選択する(スクロール対策) ListBox1.ListIndex = ListBox1.ListCount - 1 Cancel = True End If End Sub 'ListBox上の選択したデータ削除ボタン Private Sub CommandButton2_Click() Dim idx As Long '選択項目のインデックス番号取得 idx = ListBox1.ListIndex '選択された項目があれば削除 If idx <> -1 Then ListBox1.RemoveItem idx End If TextBox1.SetFocus End Sub