以前、リストの絞り込みを行う方法を紹介しました。
ただ、これだけでは少々物足りない。絞り込んだ結果で何かをして、はじめて意味があります。そこで前回の本棚を例に、絞り込んだ結果の使い方を幾つか考えてみましょう。
まず実際の本棚テーブルに、書名以外の情報が幾つか含まれているとします。
のちのち使いやすくするために、↓こちらを参考にして、一旦コレクションに格納しましょう。
(いつも有難うございます)。
まず、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)を用いると、コードが非常にスッキリします。見た目に分かり易く(=可読性:高)、レイアウト変更にも対応しやすいため、大変重宝しています。
最後に、ユーザーフォームについて、前回のものに以下の項目を追加します。
- 本棚番号
- 書籍名称
- 著者氏名
各情報を表示するラベル(青文字)名は、以下のように変更しておきます。
- 本棚番号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
使い方
- 題名の一部で絞り込み検索
- 絞り込まれた候補から選択
- 選択書籍の詳細情報を表示
これで、絞り込んだ選択項目の詳細を知ることができました。
次回に続く(かもしれない)。
参考まで。