VBA ListBox 選択データをRowSourceで削除する

ListViewに続き「ListBox」で必要なくなった設定データを削除する機能を追加します。編集は「設定シート」で、削除は「ListBox」で表示しているデータから削除できるようにしていきましょう。

くるみこ
くるみこ

今回は「ListBox」からデータを削除する方法を設定していきます。「ListBox」に表示されているデータを削除すると同時にセル範囲に保存されたデータも削除するように設定します。(^^)

ListBox」のほうが多分「ListView」よりは簡単なんですよね。違いをしっかり確認しながら勉強します! よろしくお願いしますm(__)m

【この記事でわかること
・「ListBox」の表示データ(RowSource)を削除する方法がわかります
ListBoxのデータ削除と同時にセル範囲の元データも削除する方法もわかります

前回記事のおさらいは、下のカードをクリックすれば開きます(^^ゞ

くるみこ
くるみこ

前回記事は「ListView」の表示データを削除する方法と同時にセル範囲に保存している元データも削除する方法の解説です。今回の記事と関連しているので、是非あわせて覗いてみてね(^^)/

「ListBox」に表示された選択データを削除する

・「ListBox」の RowSourceで表示しているデータから、選択されたリストを削除する方法を設定します。

動作の設定を検討します

・動作設定は、リスト上でマウスを右クリックした時に実行するように設定します。
・「マウスダウン」でクリックされた部位が右クリックかどうかを判定して処理します。
・右クリックなら削除実行を確認するメッセージを表示して判断を仰ぐように設定します。
・「削除する」が選択されたらリスト削除を実行します。
注意点は、ListBoxのデータを「RowSource」プロパティで設定している点です
RowSource」の場合は「RemoveItem」メソッドでは削除できないんです
・それを踏まえてコードを設定していきます。
ListBox RowSourceプロパティを操作します

ListBox の選択データを削除するVBAコード

'リストボックスでマウス右クリック時に選択リストを削除する
Private Sub ListBox1_MouseDown(ByVal Button As Integer, _
                            ByVal Shift As Integer, _
                            ByVal X As Single, ByVal Y As Single)
    Dim res As Long
    Dim strKey As String 'Key文字列保存用
    Dim LData As Range  'セル範囲指定用
    If Button = 2 Then  'MouseButton 2 = 右側ボタン"
        With ListBox1
            strKey = .List(.ListIndex, 7) 'Key文字列を代入
            res = MsgBox("現在選択されている " & vbCrLf & _
                .ListIndex + 1 & "行目の/分類:「" & _
                .List(.ListIndex, 0) & "」/名称:「" & _
                .List(.ListIndex, 1) & "」" & vbCrLf & _
                "【Key】" & strKey & vbCrLf & _
                "を削除してよろしいですか?", _
                vbYesNo + vbQuestion)
            If res = vbYes Then
                'RowSourceをRangeオブジェクトに入れて検索セルを返す
                Set LData = Range(.RowSource).Find(What:=strKey)
                    If LData Is Nothing Then    '検索該当なしの回避用
                        MsgBox "検索データが不明です!"
                    Else
                        LData.EntireRow.Delete  '行全体を削除
                    End If
            End If
        End With
    End If
End Sub

・2行目、記載するイベントは ListBoxMouseDown イベントです。
・5行目、メッセージボックスのレスポンスを受け取る変数を宣言しています。
・6~7行目、変数宣言(Key文字列用、Rangeオブジェクト用)
・8行目、マウスのボタン判定(右クリック「2」なのかどうか判定します。
・10行目、選択リスト行の項目「Key」の一意な文字列を変数に代入しています。
・11行目、メッセージボックスを表示して削除を実行していいかを確認しています。
     選択している部分がわかるように「名称」「分類」「Key」データを表示しています。
・20行目、RowSource 内を Findメソッドで「Key」文字列を検索し、HITしたセルをRangeオブジェクトに代入しています。
・21行目、検索結果の対象セルが取得できたかどうか判定しています。
・検索されたセルが無い場合(Nothing)メッセージを表示します。以降の処理はしません。
・24行目、見つかったセルに対して、EntireRow.Delete で行全体を削除しています。

これで ListBox の選択データを元データを一緒に削除できるようになりました
・下が実行GIF画像です。左側の検索された該当行が削除されているのご確認ください(^^♪

ListBox表示選択データとExcelシートの元データ行削除ができるようになりましたので、今回はここで終了とします!

スポンサーリンク

まとめ(おわりに)

・いかがでしたでしょうか?
・今回も、記事内で使用したコードのサンプルファイルを登録していますのでご利用ください。
今までの記事のサンプルも登録していますのでよろしければお使いください(^^)

まとめと感想など

くるみこ
くるみこ

ListBox」でも表示されているデータと元データのシート行を削除できるようになりました! 「ListView」よりは簡単でしたね(^^♪

RowSource を使う方法の理解が深まりました(^^♪
でも RowSource を削除するとセルのデータも削除される仕組みは便利だけど、不思議すぎてなかなか理解できませんね(^^;

くるみこ
くるみこ

これで「ListView」と「ListBox」の両方に削除機能が追加できました。
次回は、いよいよ「PW設定ツール」の仕上げに入っていきます。楽しみにしていてね(^^)/

【今回わかったことは】
・「ListBox」に RowSource で表示しているデータの削除方法がわかりました
RowSource の操作で元データの該当データも削除されることがわかりました

今後の記事について

今回の記事はいかがだったでしょうか。皆さまのお役に立てたなら幸いです(^^;
「汎用でだれでも使えて活用できるように考えてVBAを使う」というポリシーで、記事を継続して書いていきたいと思っています。どうぞよろしくお願いしますm(_ _)m

【検討中の今後の記事内容は・・・・・】
・実務に役立つものを提供できるよう常に検討しています(^^ゞ
・その他雑記的に「プチネタなど」もいろいろ考えていきたいと思います・・・・・
・今後の記事にもご期待ください(^^)/

記事のサンプルファイルをダウンロードできます

今回の記事のサンプルをダウンロードできるようにしています
過去の記事で使用したサンプルファイルがダウンロードできるページを設置しています
こちら(このリンク先)からご利用ください