この記事では、VBA(Visual Basic for Applications)を使用して、Excelのリストビューにデータをフィルタリングして表示する方法について解説します。質問者が抱える問題、すなわち「コマンドボタンを押して実行すると、特定の担当者のみが表示される」という問題に対して、リストビューを正しく更新する方法を説明します。
1. リストビューの基本設定
まず、リストビューの基本設定として、列ヘッダーを設定し、データの表示方法を決めます。この設定では、ListViewをレポートビューにし、列ヘッダーや行全体の選択を有効にするなど、リストビューに必要な設定を行います。
2. AutoFilterによるフィルタリング
質問者のコードでは、AutoFilterを使ってシート「d」の2列目で担当者「A」をフィルタリングしています。このフィルタリングを行った後、フィルタリングされた結果に基づいてリストビューにデータを反映させる必要があります。
3. リストビューの更新方法
リストビューを更新するには、まず既存のアイテムや列ヘッダーをクリアします。その後、フィルタリングされたデータを一行ずつリストビューに追加します。質問者が行っているように、forループでシートの行を走査し、リストビューにデータを追加します。
以下のコードで、リストビューにフィルタリングされたデータを表示する方法を説明します。
Private Sub CommandButton1_Click()
Worksheets("d").Range("A1").AutoFilter field:=2, Criteria1:="A"
End Sub
Private Sub UserForm_Initialize()
Dim wS As Worksheet ' データ元のシート
Set wS = ThisWorkbook.Sheets("d")
Dim lastRow As Long
lastRow = wS.Cells(Rows.Count, "A").End(xlUp).Row ' A列の最終行を取得
Dim i As Long
Dim li As ListItem ' ListViewの各行を表すオブジェクト
' 更新中の描画を一時停止し、処理を高速化
Me.ListView1.ColumnHeaders.Clear ' 既存の列ヘッダーをクリア
Me.ListView1.ListItems.Clear ' 既存のアイテム(行)をクリア
' 列ヘッダーの設定
With Me.ListView1.ColumnHeaders
.Add , "Col1", "名前", 50 ' Key, Text, Width
.Add , "Col2", "担当", 100
.Add , "Col3", "年齢", 80
.Add , "Col4", "生年月日", 80
End With
' 表示モードの設定
Me.ListView1.View = lvwReport ' レポートビュー
Me.ListView1.FullRowSelect = True ' 行全体を選択可能にする
Me.ListView1.Gridlines = True ' グリッド線を表示する
' データの追加
For i = 2 To lastRow ' 2行目から最終行まで
Set li = Me.ListView1.ListItems.Add(Text:=wS.Cells(i, "A").Value) ' 最初の列のデータを設定
li.SubItems(1) = wS.Cells(i, "B").Value ' 2列目のデータを設定
li.SubItems(2) = wS.Cells(i, "C").Value
li.SubItems(3) = Format(wS.Cells(i, "D").Value, "yyyy/mm/dd") ' 日付の書式設定
Next i
End Sub
4. フィルタリングされたデータの表示
フィルタリング後、リストビューにデータを反映させる際に重要な点は、フィルタリングの結果が正しく表示されることです。上記のコードでは、リストビューのアイテムとして、フィルタリングされた各行を追加していきます。リストビューに表示されるデータは、指定した担当者「A」に関連する行のみです。
まとめ
VBAを使ってリストビューにフィルタリング結果を表示する方法について説明しました。Excelでデータをフィルタリングし、その結果をリストビューに反映させることで、ユーザーにとって直感的で使いやすいインターフェースを提供できます。リストビューを正しく更新するために、コードの順番や処理の流れをしっかり確認し、必要に応じてフィルタリング条件を変更することができます。


コメント