[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『複数列表示のリストボックス削除について』(X&X)
はじめまして。
ユーザーフォーム上に複数列表示するリストボックスがあります。
Private Sub UserForm_Initialize()
Dim l As Long
l= Cells(Rows.Count, 1).End(xlUp).Row
With ListBox1 .ColumnCount = 6 .ColumnWidths = "35;55;25;25;25;25" .RowSource = Range("A2", "F" & l).Address End With
End Sub
これを同ユーザーフォーム上にあるコマンドボタンを押すと、例えばインデックス1のリストをリストボックスから削除したい場合
ListBox1.RemoveItem (1)
これだと、「予期せぬエラーが発生しました」とエラーが出ます。
やりたいことは、複数選択可能にして、選んだリストは全て削除するようにしたいのですが、これ以上の知識はありません。教授お願いします。
< 使用 Excel:Excel2019、使用 OS:Windows10 >
とりあえずサンプルコードを乗せておきます。
(リストボックスから削除したアイテムはワークシート上からも削除されますのでご注意ください)
Private Sub UserForm_Initialize() Dim l As Long l = Cells(Rows.Count, 1).End(xlUp).Row With ListBox1 .ColumnCount = 6 .ColumnWidths = "35;55;25;25;25;25" .MultiSelect = fmMultiSelectMulti .RowSource = Range("A2", "F" & l).Address End With End Sub
Private Sub CommandButton1_Click()
Dim doDelete As New Collection
With ListBox1 Dim i As Long For i = 0 To .ListCount - 1 If .Selected(i) Then doDelete.Add Rows(i + 2) End If If i >= .ListCount - 1 Then Exit For End If Next End With
Dim rng As Range For Each rng In doDelete rng.Delete Next
Dim l As Long l = Cells(Rows.Count, 1).End(xlUp).Row ListBox1.RowSource = Range("A2", "F" & l).Address
End Sub
//////////以下解説/////////////////////////////
まず前提として、RowSourceプロパティはリストボックスとセルのリンクを設定するものです。
したがって、リストボックスの中身を変更したければ、本来はセルの方を操作しなくてはいけません。RemoveItemメソッドでリストボックスを操作しようとしているのでエラーになります。
リストボックスの一番上のアイテムを削除したいのであれば、コマンドボタンのイベントに記述するのは、
Rows(2).Delete
です。さらに、データが一行上にずれたことでリストボックスの一番下が空欄になってしまうので、リンクを再設定する必要があります。
Rows(2).Delete
Dim l As Long
l = Cells(Rows.Count, 1).End(xlUp).Row
ListBox1.RowSource = Range("A2", "F" & l).Address
なお、リストボックスの変更をセルに反映させたくないのであれば、セルの配列をそのままリストボックスに突っ込めばOKです。
ListBox1.List = Range("A2:F" & l).Value
この場合は、上記のRemoveItemメソッドでリストボックスからアイテムを消去することができます。
サンプルコードも乗せておきます。
Private Sub UserForm_Initialize()
Dim l As Long l = Cells(Rows.Count, 1).End(xlUp).Row
With ListBox1 .ColumnCount = 6 .ColumnWidths = "35;55;25;25;25;25" .MultiSelect = fmMultiSelectMulti .List = Range("A2:F" & l).Value End With
End Sub
Private Sub CommandButton1_Click()
With ListBox1 Dim i As Long For i = 0 To .ListCount - 1 If .Selected(i) Then .RemoveItem i i = i - 1 End If If i >= .ListCount - 1 Then Exit For End If Next End With
End Sub
(ひいらぎ) 2020/12/13(日) 02:10
RowSourceなんだから、直接 セルを操作すれば良いんのでないですかね。
RowSource セルとリストボックスは直結してます。 セルの内容を変えれば、リストボックスに リストボックスの内容を変えれば、にセルにすぐ反映されます。 (Why) 2020/12/13(日) 03:06
RowSource セルとリストボックスは直結してます。
と書きました。 意味解りますよね。 (Why) 2020/12/15(火) 01:52
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.