リストボックスを自動スクロールする


リストボックス(ListBoxコントロール)にデータを追加するには、AddItemメソッドを使います。次のコードは、コマンドボタン(CommandButton1)をクリックすると、テキストボックス(TextBox1)の文字列をリストボックス(ListBox1)に追加します。なお、ここでは下図のようなUserFormを例にします。上から、ListBox1、TextBox1、CommandButton1です。

Private Sub CommandButton1_Click()
    ListBox1.AddItem TextBox1.Text
End Sub

では、この調子で次々とデータを登録していきましょう。"Sample2"から"Sample10"まで登録するのですが、1つずつ手入力するのは面倒くさいので次のようなコードで登録します。

Private Sub CommandButton1_Click()
    Dim i As Long
    For i = 2 To 10
        TextBox1.Text = "Sample" & i
        ListBox1.AddItem TextBox1.Text
    Next i
End Sub

最後に登録したのは"Sample10"ですが、これはリストボックスの高さを超えていますので見えません。そう、リストボックスは、新しいデータを登録しても、それだけでは自動的にスクロールしないんですね。それでもいいと。常に先頭が見えていればいいというのでしたら、ただAddItemするだけです。そうではなくて、一番下に追加した新しいデータが見えるよう、自動的にスクロールさせたいのでしたら、ListIndexプロパティを操作してやります。

Private Sub CommandButton1_Click()
    Dim i As Long
    For i = 1 To 11
        TextBox1.Text = "Sample" & i
        ListBox1.AddItem TextBox1.Text
        ListBox1.ListIndex = ListBox1.ListCount - 1
    Next i
End Sub

上記のサンプル程度でしたら、コマンドボタンをクリックすると一瞬で終わってしまいますが、たとえば次のようなコードだと違いがわかりやすいです。

Private Sub CommandButton1_Click()
    Dim i As Long, buf As String
    buf = Dir("C:\Windows\")
    Do While buf <> ""
        ListBox1.AddItem buf
        ListBox1.ListIndex = ListBox1.ListCount - 1
        DoEvents
        buf = Dir()
    Loop
End Sub

リストボックスの表示を更新するために、DoEventsを入れています。

また、次のように、処理の結果などを追記する場合にも便利です。

Private Sub CommandButton1_Click()
    Static cnt As Long
    cnt = cnt + 1
    ListBox1.AddItem "処理" & cnt
    ListBox1.ListIndex = ListBox1.ListCount - 1
End Sub