[[20201212231243]] 『複数列表示のリストボックス削除について』(X&X) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『複数列表示のリストボックス削除について』(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

丁寧な回答ありがとうございます。
リストボックスから選んだデータは、コマンドボタンを押すとセルに反映されると同時に、リストボックスから消えるところまではいいのですが、この後、セルに反映されたデータを削除してユーザーフォームを立ち上げると、またそのデータがリストボックスに復活するようにするにしたいのですが、どうしたらいいでしょうか?
(X&X) 2020/12/15(火) 00:40

 RowSource
 セルとリストボックスは直結してます。

 と書きました。
 意味解りますよね。
(Why) 2020/12/15(火) 01:52

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.