リストボックスにデータを登録する(3)


AddItemメソッドによるデータの登録は高速です。数千件程度のデータ数なら、For Nextでぶん回したって、たいした時間はかかりません。でも、さすがに数万件になると、それなりに時間がかかります。別に時間がかかったっていいんですけど、プロの仕事としては、そのへんを高速化できるのもスキルのうちなので、たまには気にします。

大量のデータをリストボックスに登録するときは、Listプロパティに配列を直接ぶち込みます。もともと、ListBoxに登録されているデータは、配列形式で管理されています。その配列はListプロパティで操作できますので、ここに直接配列を入れてやれば、大量のデータも一瞬で登録できてしまいます。

ここでは、下図のようなA列をリストボックスに登録します。データは5万件(セル範囲A2:A50001)です。

For NextでAddItemすると、さすがに時間がかかりますので、次のようにします。

Private Sub CommandButton1_Click()
    ListBox1.List = Range("A2:A50001").Value
    MsgBox "登録件数:" & ListBox1.ListCount
End Sub

ほんとに、目を疑うほど一瞬で終わります。逆に、ちゃんと登録されているのか心配になります。そこで、上のコードでは、念のために登録件数も確認しました。

この方式で大量のセルをリストボックスに登録するときは、Valueプロパティを省略してはいけません。「Range("A2:A50001")」だけでは、配列データにならないからです。

5万件程度ではコーヒーを飲む間もありませんので、いっそ100万件でやってみましょう。さすがに、それなりの時間がかかるでしょう。

Private Declare Function GetTickCount Lib "Kernel32" () As Long
Private Sub CommandButton1_Click()
    Dim S As Long
    S = GetTickCount
    ListBox1.List = Range("A2:A1000001").Value
    MsgBox "登録件数:" & ListBox1.ListCount & vbCrLf & _
           (GetTickCount - S) / 1000 & "秒"
End Sub

ふぅ・・・

あ、もちろん、所要時間はパソコンのスペックによって違います。