hakeの日記

Windows環境でプログラミングの勉強をしています。

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