Excel VBA > VBA:実務活用 > ListBoxに長い文字列を設定するとき
このエントリーをはてなブックマークに追加

ListBoxに長い文字列を設定するとき

Listuboxには含めることのできる文字数に制限がある?

以前紹介した方法(「Listプロパティを設定できません。種類が一致しません。」エラーについて)では、リストボックスに含めることのできる文字数について説明しました。
しかし実際にはこれ以上の文字を含めることも可能です。今回はその方法についてご紹介します。

listbox_list_variant_02

ポイントは「配列での受け渡し」

その方法は、それほど難しくありませんが、AddItemを使わないで行う必要があるので、アプローチが変わります。
既にプログラムを作りこんでいる場合は、若干面倒な修正になるかもしれません(作り方にもよりますが)。
今回は50万文字まで試しました(※もっとも試し方によってはNGになる可能性もあるのでご了承願います)。
リストボックスには「List」プロパティがあります。このプロパティはとても便利で2次元の配列をそのままセットできます。
この仕組みを利用するとより多くの文字数を入力することが可能になります。
listbox_list_variant_01

Private Sub CommandButton1_Click()

    Dim i As Long
    Dim var(0, 0) As Variant

    With Me.ListBox1

        ’50万文字作る
        For i = 1 To 500000
            var(0, 0) = var(0, 0) & 1
        Next i

    ‘リストボックスにのListプロパティに配列をセット
        .List = var

        ‘何文字入力されているか表示
        MsgBox “入力されている文字数” & _
                VBA.Format(VBA.Len(.List(0, 0)), “0,000”)

    End With

End Sub

ちなみに要素数は上記のような形でプログラムすることはテスト以外ないと思われ、実際には「要素数をどうするか」、という問題も出てくると思います。
そのため通常だとRedimを使う必要があり、Redim時に要素数をあらかじめ把握しておくような仕掛けを用意する等が発生すると思います。

Listプロパティの活用(余談)

余談ですが、AddItemよりもListプロパティの方法でリストボックスに値をセットする方がリストボックス的なコード(AddItem)に依存する必要がないので扱いやすいです。
Listプロパティの方がシートの値をそのまま取り込めたりするため、プログラム上のデータも配列にして持たせることで、変数をそのまま受け渡ししやすいことがメリットだと思います。
リストボックスやコンボボックスで「処理が遅い」と感じてる方はVariant→Listプロパティも試してみてください。
ちなみにリスト的な意味では、コレクションなども扱いやすいですがアイテム数(Add)が劇的に増える(またコレクション内ループも)とパフォーマンスに影響を与えることがあるのと、リストボックスに表示するためにループを使ってもう一度AddItemを使うことの2度手間が発生するのでパフォーマンスを意識するならVariantでデータを扱う方がメリットがありますね(ただVariantもメモリ使いますが)。

カテゴリ:VBA:実務活用