HOME > 即効テクニック > Excel VBA > ユーザーフォーム関連のテクニック > リストボックスで常に最下行を表示する

即効テクニック

ユーザーフォーム関連のテクニック

リストボックスで常に最下行を表示する

(Excel 97/2000/2002/2003/2007)

UserFormに配置したリストボックス(ListBox)にデータを登録するにはAddItemメソッドを使います。 次のコードは、リストボックスに1000個のデータを登録します。

Private Sub CommandButton1_Click()
  Dim i As Long
  For i = 1 To 1000
    ListBox1.AddItem "Sample" & i
  Next i
End Sub   
VBAはとても高速ですから、1000回のAddItemメソッドくらいならおそらく一瞬で終了してしまいます。 しかし、間違いなく1000個のデータが登録されているかどうかを確認するには、リストボックスのスクロールバーを下までドラッグしなければなりません。 1000個のデータを登録しても、リストボックスには最上部のデータが表示されているからです。 AddItemメソッドで追加した最新(最下行)のデータを、常に表示するにはどうしたらいいでしょう。 それには、ListIndexプロパティを設定します。 次のコードで、実行結果をご確認ください。
Private Sub CommandButton1_Click()
  Dim i As Long
  For i = 1 To 1000
    ListBox1.AddItem "Sample" & i
    ListBox1.ListIndex = ListBox1.ListCount - 1
    DoEvents
  Next i
End Sub   
画面を更新させるために、DoEventsも入れてあります。 では、リストボックスではなくテキストボックスではどうでしょう。 テキストボックス(TextBox)のMultiLineプロパティをTrueにして次のコードを実行してください。
Private Sub CommandButton1_Click()
  Dim i As Long
  TextBox1.SetFocus
  For i = 1 To 1000
    TextBox1.Text = TextBox1.Text & "Sample" & i & vbCrLf
    DoEvents
  Next i
End Sub   
テキストボックスに複数行の文字列を代入すると、カーソルは最終位置に移動されます。 リストボックスのように苦労しなくても、常に最終行が表示されているわけです。 では逆に、テキストボックスに複数行を代入しても、先頭行を表示するにはどうしたらいいでしょう。 単純にカーソルを、テキストボックス内の先頭に移動するだけなら、次のようにSelStartプロパティを操作すればいいです。
Private Sub CommandButton1_Click()
  Dim i As Long
  TextBox1.SetFocus
  For i = 1 To 1000
    TextBox1.Text = TextBox1.Text & "Sample" & i & vbCrLf
    DoEvents
  Next i
  TextBox1.SelStart = 0
End Sub   
しかし「○行目にカーソルを移動したい」というときには、SelStartプロパティではなくCurLineプロパティが便利です。 次のコードは、カーソルを100行目に移動します。
Private Sub CommandButton1_Click()
  Dim i As Long
  TextBox1.SetFocus
  For i = 1 To 1000
    TextBox1.Text = TextBox1.Text & "Sample" & i & vbCrLf
    DoEvents
  Next i
  TextBox1.CurLine = 99
End Sub