リストの絞り込み の続き① ~ 絞り込んだ結果の詳細表示 ~

以前、リストの絞り込みを行う方法を紹介しました。

infoment.hatenablog.com

ただ、これだけでは少々物足りない。絞り込んだ結果で何かをして、はじめて意味があります。そこで前回の本棚を例に、絞り込んだ結果の使い方を幾つか考えてみましょう。

まず実際の本棚テーブルに、書名以外の情報が幾つか含まれているとします。

f:id:Infoment:20180814072549p:plain

のちのち使いやすくするために、↓こちらを参考にして、一旦コレクションに格納しましょう。

thom.hateblo.jp

(いつも有難うございます)。

まず、BookShelfClass という名前のクラスモジュールを作成します。
内容は、以下の通りです。

Public 本棚番号 As String
Public 書籍名称 As String
Public 著者氏名 As String

Public Property Get Self() As BookShelfClass
    Set Self = Me
End Property

次いで、標準モジュールを作成します。名前は任意で構いません。
内容は、以下の通りです。

Option Explicit

Enum 列
    本棚番号 = 1
    書籍名称
    著者氏名
End Enum

Public Books As Collection

Sub BookShelfInformation()
    Dim Tb As ListObject
        Set Tb = ActiveSheet.ListObjects("書籍テーブル")
        Set Books = New Collection
    
    Dim i As Long
    For i = 1 To Tb.DataBodyRange.Rows.Count
        With New BookShelfClass
            .本棚番号 = Tb.DataBodyRange.Cells(i, 本棚番号)
            .書籍名称 = Tb.DataBodyRange.Cells(i, 書籍名称)
            .著者氏名 = Tb.DataBodyRange.Cells(i, 著者氏名)
            
            Books.Add .Self
        End With
    Next
End Sub

thomさんのブログでも言及されていますが、この列挙型(Enum)を用いると、コードが非常にスッキリします。見た目に分かり易く(=可読性:高)、レイアウト変更にも対応しやすいため、大変重宝しています。

最後に、ユーザーフォームについて、前回のものに以下の項目を追加します。

  • 本棚番号
  • 書籍名称
  • 著者氏名

f:id:Infoment:20180814073633p:plain

各情報を表示するラベル(青文字)名は、以下のように変更しておきます。

  • 本棚番号Label
  • 書籍名称Label
  • 著者氏名Label

ユーザーフォームに記載するコードは、以下の通りです。

Option Explicit

Dim Book As BookShelfClass

Private Sub ListBox1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    For Each Book In Books
        If Book.書籍名称 = ListBox1.List(ListBox1.ListIndex) Then
            本棚番号Label = Book.本棚番号
            書籍名称Label = Book.書籍名称
            著者氏名Label = Book.著者氏名
            Exit Sub
        End If
    Next
End Sub

Private Sub TextBox1_Change()
    Dim str  As String
        str = TextBox1.Value
        ListBox1.Clear
        
        For Each Book In Books
            If Book.書籍名称 Like "*" & str & "*" Then
                ListBox1.AddItem Book.書籍名称
            End If
        Next
End Sub

Private Sub UserForm_Initialize()
    Call BookShelfInformation
    For Each Book In Books
        ListBox1.AddItem Book.書籍名称
    Next
End Sub

Private Sub CloseButton_Click()
    Unload Me
End Sub


使い方

  1. 題名の一部で絞り込み検索
  2. 絞り込まれた候補から選択
  3. 選択書籍の詳細情報を表示

f:id:Infoment:20180814082619p:plain

これで、絞り込んだ選択項目の詳細を知ることができました。

次回に続く(かもしれない)。

参考まで。