VBA ListView の表示データと元データを同時に削除する

スポンサーリンク

ListViewコントロール」を活用して出来ることはまだたくさんありそう。でも、ここでの目的は「PW生成ツール」を完成させることですので、それに使う機能に絞っています。
実装していない機能といえば、必要なくなったデータを削除する機能です。編集は「設定シート」で行えますが、「削除」する機能はまだありません。ListView で表示しているデータから削除できるように調整してみましょう。

くるみこ
くるみこ

今度は「ListView」からデータを削除する方法について勉強しましょう。「ListView」に表示されているデータはセル範囲に保存されたデータが表示されているだけなので、そこを調整する必要がありそうですね(^^)

なるほどそうですね! 「ListView」のデータを消したらセル範囲のデータも消すようにするということですよね。面白くなってきました! よろしくお願いしますm(__)m

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

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

くるみこ
くるみこ

前回記事は「ListView」のデータを取得して設定シートに表示する方法と「ListView」データをソートする方法の解説です。
是非あわせて覗いてみてね(^^)/

スポンサーリンク

「ListView」の選択データを削除する

・「ListView」の表示データから、選択されたリストを削除する方法を検討します。

動作設定を検討します

・動作設定は、リスト上でマウスを右クリックした時に実行するように設定したいと思います。
・右クリックを判別するには「マウスダウン」イベントでクリックされた部位を判別します。
・右クリックなら削除実行を確認するメッセージを表示して判断を仰ぐように設定します。
・「削除する」が選択されたらリスト削除を実行します。
・ひとまず ListView 上での動作設定はこんな感じですね。

ListView の表示データを削除するVBAコード

'マウス右クリック時に選択ListItemを削除する
Private Sub ListView1_MouseDown(ByVal Button As Integer, _
                                ByVal Shift As Integer, _
                                ByVal x As stdole.OLE_XPOS_PIXELS, _
                                ByVal y As stdole.OLE_YPOS_PIXELS)
    Dim res As Long
    If Button = 2 Then 'MouseButton 2 = 右側ボタン"
        With ListView1
            res = MsgBox("現在選択されている " & vbCrLf & _
                "名称:「" & .SelectedItem & "」/分類:「" & _
                .SelectedItem.SubItems(1) & "」" & vbCrLf & _
                "を削除してよろしいですか?", vbYesNo + vbQuestion)
            If res = vbYes Then
                .ListItems.Remove .SelectedItem.Index
            End If
        End With
    End If
End Sub

・2行目、記載するイベントは ListViewMouseDown イベントです。
・6行目、メッセージボックスのレスポンスを受け取る変数を宣言しています。
・9行目、メッセージボックスを表示して削除を実行していいかを確認しています。
     選択している部分がわかりにくいので「名称」「分類」データを表示しています。
・6行目、選択されているListView1.ItemIndexを取得しています。
・13行目、メッセージボックスで選択されたレスポンスを確認しています。
・14行目、「はい」だった場合、選択リスト行を削除します。

これで ListView の選択データを削除できるようになりました

ただし、ListView の表示だけなのでセル範囲の該当保存データは削除されていません

ListView の元データも削除できるようにします

・では、ListView のデータ削除と同時にセル範囲の該当データも削除するように設定しましょう。
・でも、ListView のデータがソートされている場合は、セル範囲の行の置とはズレが生じてしまいます。その点を考慮して考える必要があります。

選択ListViewデータと同時にセル範囲データも削除する

・同時に削除するためにはセル範囲の該当行を特定する必要があります。
・それでは、先ほどのコードに機能を追加していきましょう。

'マウス右クリック時に選択ListItemを削除する
Private Sub ListView1_MouseDown(ByVal Button As Integer, _
                                ByVal Shift As Integer, _
                                ByVal x As stdole.OLE_XPOS_PIXELS, _
                                ByVal y As stdole.OLE_YPOS_PIXELS)
    Dim res As Long
    Dim strKey As String 'Key文字列保存用
    Dim eRow As Long    '最終行用
    Dim LData As Range  'セル範囲指定用
    If Button = 2 Then 'MouseButton 2 = 右側ボタン"
        With ListView1
            strKey = .SelectedItem.SubItems(7) '【Key】取得
            res = MsgBox("現在選択されている " & vbCrLf & _
                "名称:[" & .SelectedItem & "]/分類:[" & _
                .SelectedItem.SubItems(1) & "]" & vbCrLf & _
                "Key[" & strKey & "]" & vbCrLf & _
                "を削除してよろしいですか?", vbYesNo + vbQuestion)
            If res = vbYes Then
                .ListItems.Remove .SelectedItem.Index
                With Worksheets("設定値")
                    eRow = .Cells(Rows.Count, 8).End(xlUp).Row
                    Set LData = .Range(.Cells(1, 8), .Cells(eRow, 8)) _
                                .Find(What:=strKey) 'Key列内セル文字列を検索
                    If LData Is Nothing Then        '検索該当なしの回避用
                        MsgBox "検索データが不明です!"
                    Else
                        LData.EntireRow.Delete '行全体を削除
                    End If
                End With
            End If
        End With
    End If
End Sub

・7~9行目、変数宣言を追加しています。(目的はコード内コメントを参照してください)
・12行目、選択リスト行の項目「Key」の一意データを取得しています。
20行目以降が「設定値」シートの対象行を削除するための処理です
・22行目、「設定値」シート8列目「Key」列対象範囲を Findメソッドを使って12行目で保存していた文字列で検索し対象セル特定しています。
・24行目、検索結果の対象セルが取得できたかどうか判定しています。
・検索されたセルが無い場合(Nothing)メッセージを表示します。以降の処理はしません。
27行目、見つかったセルに対して、EntireRow.Delete で行全体を削除しています
・下が実行GIF画像です。左側の検索された該当行が削除されているのを見てください(^^♪

ListViewデータ削除と同時にExcelシートの元データ行削除がうまくいきましたので、今回はここで終了とします!

スポンサーリンク

まとめ(おわりに)

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

まとめと感想など

くるみこ
くるみこ

ListView」から表示されているデータと元データのシート行を削除する方法について解説・勉強しました! 今回の感想はいかがですか?

Findメソッドでデータを特定して削除するなどは、今まで勉強してきたことを活用する勉強になりました! ソートが出来るようになっらから設定が必要になったということですよね。何かの設定を変更すると影響される部分も一緒に手を加えなければならないことが良くわかりました(^^♪

くるみこ
くるみこ

ListView」の部分が続きましたが、次回はこの削除の部分について「リストボックス」にも設定しておきたいと思います。
次回も楽しみにしていてね(^^)/

【今回わかったことは】
・「ListView」に表示しているデータの削除方法がわかりました
・「ListView」元データセル範囲の該当行データを削除する方法もわかりました

今後の記事について

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

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

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

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