目的
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