こんにちは、Ryoです。
ユーザーフォームで扱うことの多いListBoxですが、AddItemメソッドを利用して追加した項目に対してRemoveItemメソッドを利用することで削除することも可能なので、作成したUserFormの使い勝手を更に向上させることもできます。今回はリストに追加された項目を複数選択して削除する方法について書いていきます。
1.サンプル概要
Sheet上にサンプルとして作成した簡易的な表の項目をユーザーフォームのリストボックスに追加します。
追加された項目から削除したい項目を選択しますが、ここは複数選択を可能にしています。
選択した後に「リストボックスから削除」と表記してあるコマンドボタンをクリックすると選択項目が削除されます。
サンプル動作を動画として記録したものがこちらになります。この記録は「Microsoft PowerPointの画面録画機能」を利用したものですが、手軽に記録できるので重宝してます。
2.サンプルコード
今回仕様したユーザーフォーム構成は以下の通りになります。
サンプルコードはUserFormの初期化処理を行う「Private Sub UserForm_Initialize()」、リストボックスの選択項目削除を行うボタン「Private Sub CommandButton1_Click()」になります。
Private Sub UserForm_Initialize() 'ユーザーフォームの初期化処理 Dim temp As Variant Dim i As Long 'セルA1~A5までの値を変数tempに代入 temp = Range("A1").CurrentRegion.Value '↓↓↓ '******************** '参考:リストに追加する範囲が不変であれば ' temp = Range("A1:A5").Valueのように ' 範囲を限定しても可 '******************** 'フォームに設置したListBox1に対する処理 With ListBox1 '変数tempに代入された配列要素数分の処理 For i = 1 To UBound(temp) 'ListBox1に項目を設定 .AddItem temp(i, 1) Next 'リストボックス項目の複数選択を可能にしておく .MultiSelect = fmMultiSelectMulti End With End Sub
Private Sub CommandButton1_Click() 'リストボックスの選択項目を削除する Dim i As Long 'リストボックス項目数をカウントし、 'その数だけ処理を繰り返す For i = ListBox1.ListCount - 1 To 0 Step -1 'ListBox1に対する処理 With ListBox1 'リストボックス項目の選択有無を確認 If .Selected(i) Then '選択されている場合、その項目を削除する .RemoveItem i End If End With Next End Sub
◆解説
先ずはユーザーフォームの初期化処理としてListBox1に項目の追加を行っています。temp = Range(“A1”).CurrentRegion.Valueで表全体の内容を変数tmpに代入することで配列として格納されます。
次にListBox1に対して処理を行いますが、tempに格納した配列の要素数=追加項目数なので、その数分処理を繰り返し行うことで全項目をリストへ追加しています。
For i = 1 To UBound(temp)
.AddItem temp(i, 1)
Next
For~Next文の処理でリストボックスへの項目追加は完了しますが、削除の処理を行う際に複数選択したいことも想定してMultiSelectプロパティを利用し、その対処を可能にしておきます。
.MultiSelect = fmMultiSelectMulti
このMultiSelectプロパティについては以前投稿しておりますので、よろしければご参考までに。
次にCommandButton1_Click()の処理ですが、ここではリストボックスの選択された項目に対して削除を行いますのでRemoveItemメソッドを利用します。
構文:オブジェクト.RemoveItem index
このRemoveItemメソッドは引数indexに指定したインデックス番号の項目をListBoxから削除しますので、サンプルでの処理としてはListCountプロパティでリストボックスの項目数をカウントさせて、その数分でループ処理を行いながらIf/Selectedプロパティで選択を判定させ、選択されている項目(=True)を.RemoveItem i(i=インデックス番号)で削除を実行しています。
ちなみに項目を削除すると「インデックス番号は自動的に詰められる」ので、ループ処理をFor i = ListBox1.ListCount – 1 To 0 Step -1のようにリストボックス最後の項目から逆順にチェックさせています。
3.まとめ
今回のようなRemoveItemメソッドなどは汎用的に使用するようなものではないのですが、私の場合は作成したユーザーフォーム内に「削除機能」としてコマンドボタンに関連付けて配置しておくようなイメージで使うことが多いような気がします。
追加された項目の整理や手動での修正など、用途に応じて多様な使い方ができますので、知っておくと何かと役に立つと思います。
以上、リストボックスの選択項目を削除する方法についてでした!今回の記事が何かの参考になれば幸いです。
Ryo