ユーザーフォームのリストボックスについて、項目の選択を全解除する

本日試しにやってみたことを、忘れないうちにメモ。
ユーザーフォーム上のリストボックスについて、項目の選択を全解除したい。
↓こんな感じだ。
f:id:Infoment:20181219210822g:plain

今までコマンドボタンのクリックイベントには、こんなコードを書いていた。

Private Sub CommandButton1_Click()
    Dim i As Long
        For i = 0 To ListBox1.ListCount - 1
            ListBox1.Selected(i) = False
        Next
End Sub

リストボックスの項目は、0番目から数え始める。従って最後は、
 「リストの項目数-1」番目
となる。順次i番目の選択状態(Selected)をFalseにすることで、リストの全項目が非選択状態となる。


ところで、リストボックスのリストは、三つの方法でセットできる。

    ListBox1.AddItem "りんご"
    ListBox1.AddItem "みかん"
    ListBox1.AddItem "ばなな"

のように、一つずつ追加するのが一つ目。

    ListBox1.List = Array("りんご", "みかん", "ばなな")

のように、配列で一気にセットするのが二つ目。


f:id:Infoment:20181219215222p:plain
のように、リストの項目が記載されたセルをRowsorceで指定するのが三つ目だ。(普段、私は殆ど使わない)。
四つ目以降の方法もあるかも知れないが、私が知る限りでは上記の三つだ。

この二つ目を見ていて、ふと思った。リストに配列を充てられるのなら、リストは配列として取り出せるのではないか。
そこで、全解除ボタンのコードを、こんな風に変更してみた。

Private Sub CommandButton1_Click()
    Dim seq As Variant
    With ListBox1
        seq = .List ' リストを一旦、配列に退避させる
        .Clear      ' リストボックスをクリア
        .List = seq ' リストに配列を充てる
    End With
End Sub

結果、意図したとおりの動きとなった。早速「手数の一つ」に加えるとしよう。
ただし試してみたところ、Rowsorceで設定したリストボックスの場合、上記方式は「予期せぬエラーの発生」のメッセージと共にエラー終了する。

万能な方式ではないので、注意が必要です。

参考まで。