VBA UserForm ListViewコントロールの設置方法

前回はリストボックスの使用方法でしたが、今回は同じようなコントロール「ListViewコントロール」を使ってみたいと思います。
リストボックスでも問題なく使用できていますが、調べてみると「ListView」の方が使い勝手がよさそうなので設置して使ってみたいと思います。

くるみこ
くるみこ

それでは「ListView」を使ってみようともいます。まずは設置方法から順番に勉強していきたいと思います(^^)

「リストボックス」と「ListView」の違いって何だろう?
何だか楽しみです! よろしくお願いしますm(__)m

【この記事でわかること
・ListViewコントロールの設置方法がわかります
ListViewにセル範囲リストからデータを取得表示する方法がわかります

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

くるみこ
くるみこ

前回記事では「リストボックス」を設置・利用する方法を解説しています。是非あわせて覗いてみてね(^^)/

「ListView」コントロールを設置してみます

・まずは「ListView」を設置してみましょう。

「マルチページ」に「ページ」追加して配置します

【実際に行った手順を書いていきます】
・初めに設置する場所を新しい「ページ」を作成して用意します。
・「マルチページ」上で右クリック→「新しいページ」を選び「Page3」を追加しました。
・「Page3」に配置したいのですが、「ツールボックス」に「リストビュー」がありません。
・「ListViewコントロール」はExcelの標準ではないので、外部コントロールを使用します。
・「ツールボックス」で右クリック→「その他のコントロール」をクリックします。
・コントロールの追加から「Microsoft ListView Control 6.0(SP4)」にチェック「OK」で追加できます。

手順①
手順③
手順②
手順④

・ツールボックスに「ListView」が入っていることが確認できました。
・「ListView」コントロールをクリック、「Page3」でクリック&ドラッグで設置します。
・これで「ListView」コントロールを設置できました(^^;

「ListView」コントロールを初期化します

・まずは「ListView」コントロールを初期化(Initialize)する準備をします。

使ってみたい気になるプロパティがこちらです

名前説明選択項目
AllowColumnReorderマウス操作で列ヘッダー並べ替えの可否True/False(既定値)
Checkboxesリスト左側にチェックボックス表示するTrue/False(既定値)
FlatScrollBarスクロールバーの表示有無
(Falseでも矢印キーでスクロール可)
True/False(既定値)
FullRowSelectリスト選択時に行全体を選択するTrue(既定値)/False
GridLines行列グリッド線を表示するTrue/False(既定値)
LabelEditラベル(リストアイテム1列目)編集可否lvwAutomatic(既定値)/
lvwManual(不可)
MultiSelectリストアイテムの複数選択可否True/False(既定値)
Sorted並び替え(アルファベット順)可否True/False(既定値)
SortKeyソートの基準の列番号
SortOrder並び替え方法(Sorted=True)lvwAscending(昇順)/
lvwDescending(降順)
Viewリストビューの表示形式
表形式なら「lvwReport」を使います
lvwIcon/lvwSmallIcon/
lvwList(一覧)/
lvwReport(詳細)

太字のプロパティが今回の設定対象としたものです。(既定値のものは除外しています)
LisetViewコントロールの各プロパティをVBAで初期設定していきます。

「ListView」に列見出しを設定します

ListViewコントロールの列見出しは、ColumnHeadersコレクションで操作します。
・ColumnHeadersコレクションのAddメソッドで、列見出しを1つづつ追加します。

【Addメソッドの構文】
 ColumnHeaders.Add Index, Key, Text, Width, Alignment, Icon

【引数】
 ・Index:追加する列の位置を指定します。省略で左から順に追加されます。
 ・Key:列見出しを特定する重複しないユニークな名前を指定します。
 ・Text:列見出しに表示する文字列です。
 ・Width:列見出しの幅を指定します。省略すると均等な幅が指定されます。
 ・Alignment:見出し文字列の配置位置を定数で指定します。既定は左寄せです。
    定数=「lvwColumnLeft」「lvwColumnRight」「lvwColumnCenter」

「ListView」にプロパティと見出しを設定します

・マルチページのチェンジイベントにVBAコードを設定します。
・すでに「リストボックス」の表示コードがあるので分岐処理しています。

'マルチページのChangeイベント
Private Sub MultiPage1_Change()
    Dim eRow As Long    '最終行用
    Dim LData As Range  'セル範囲指定用
    With Worksheets("設定値")
        eRow = .Cells(Rows.Count, 2).End(xlUp).Row
        Set LData = .Range(.Cells(2, 1), .Cells(eRow, 8))
    End With
    If MultiPage1.Value = 1 Then
        With ListBox1
            .ColumnCount = 8
            .ColumnHeads = True
            .ColumnWidths = "60;60;60;60;20;20;40"
            .RowSource = LData.Address
        End With
    ElseIf MultiPage1.Value = 2 Then
        With ListView1
            .AllowColumnReorder = True  '列幅の変更を許可
            .FullRowSelect = True       '行全体を選択
            .Gridlines = True           'グリッド線を表示
            .LabelEdit = lvwManual      'ラベル選択時編集しない
            .View = lvwReport   '表示設定「lvwList」はうまく表示しない
            '列見出しの設定
            .ColumnHeaders.Clear '初期化必須実行時エラー35602回避用
            .ColumnHeaders.Add 1, "Name", "名称", 60 ', lvwColumnLeft
            .ColumnHeaders.Add 2, "Bunrui", "分類", 60 ', lvwColumnCenter
            .ColumnHeaders.Add 3, "_ID", "ID", 60 ', lvwColumnCenter
            .ColumnHeaders.Add 4, "M", "mKey", 60 ', lvwColumnCenter
            .ColumnHeaders.Add 5, "L", "開始", 20 ', lvwColumnCenter
            .ColumnHeaders.Add 6, "R", "終了", 20 ', lvwColumnCenter
            .ColumnHeaders.Add 7, "S", "記号", 40 ', , lvwColumnCenter
            .ColumnHeaders.Add 8, "_Key", "Key" ', , lvwColumnCenter
        End With
    End If
End Sub

・16行目からが「ListView」のコードです。
MultiPageValue が「2」なら「ListView」が選択されているので以降の処理に進みます。
・18~22行目までが、各プロパティの設定です。(コード内のコメント参照)
・23行目以降が、列見出しを設定する部分です。
・24行目、【重要】.ColumnHeaders.Clear ‘初期化必須実行時エラー35602回避用
         この初期化が無いと再表示の際、実行時エラー35602が発生します!

・25~32行目で、各項目の列見出しを設定していきます。
列設定時の注意点は、一番左の列がメインになる点です。ここでは、メイン項目を「名称」に設定しています。一番左列の Alignment の設定は「lvwColumnLeft」にしないとエラーになります
・ということで、Alignment の設定はひとまず全てコメントアウトしてデフォルトにしています。
・ここまでを実行すると次の画像のようになります。行列のグリッド線が確認できます。

「ListView」にデータを表示させます

・設置した「ListView」にセル範囲データを取得表示させてみます。
・先ほどのコードに続きのVBAコード書いていきます。

'マルチページのChangeイベント
Private Sub MultiPage1_Change()
    Dim eRow As Long    '最終行用
    Dim LData As Range  'セル範囲指定用
    Dim i As Long       'ListItemループ用
    With Worksheets("設定値")
        eRow = .Cells(Rows.Count, 2).End(xlUp).Row
        Set LData = .Range(.Cells(2, 1), .Cells(eRow, 8))
    End With
    If MultiPage1.Value = 1 Then
        With ListBox1
            .ColumnCount = 8
            .ColumnHeads = True
            .ColumnWidths = "60;60;60;60;20;20;40"
            .RowSource = LData.Address
        End With
    ElseIf MultiPage1.Value = 2 Then
        With ListView1
            .AllowColumnReorder = True  '列幅の変更を許可
            .FullRowSelect = True       '行全体を選択
            .Gridlines = True           'グリッド線を表示
            .LabelEdit = lvwManual      'ラベル選択時編集しない
            .View = lvwReport   '表示設定「lvwList」はうまく表示しない
            '列見出しの設定
            .ColumnHeaders.Clear '初期化必須実行時エラー35602回避用
            .ColumnHeaders.Add 1, "Name", "名称", 60 ', lvwColumnLeft
            .ColumnHeaders.Add 2, "Bunrui", "分類", 60 ', lvwColumnCenter
            .ColumnHeaders.Add 3, "ID", "ID", 60 ', lvwColumnCenter
            .ColumnHeaders.Add 4, "M", "mKey", 60 ', lvwColumnCenter
            .ColumnHeaders.Add 5, "L", "開始", 20 ', lvwColumnCenter
            .ColumnHeaders.Add 6, "R", "終了", 20 ', lvwColumnCenter
            .ColumnHeaders.Add 7, "S", "記号", 40 ', , lvwColumnCenter
            .ColumnHeaders.Add 8, "Key", "Key" ', , lvwColumnCenter
            .ListItems.Clear
            For i = 1 To eRow
                With .ListItems.Add
                    .Text = LData(i, 2)
                    .SubItems(1) = LData(i, 1)
                    .SubItems(2) = LData(i, 3)
                    .SubItems(3) = LData(i, 4)
                    .SubItems(4) = LData(i, 5)
                    .SubItems(5) = LData(i, 6)
                    .SubItems(6) = LData(i, 7)
                    .SubItems(7) = LData(i, 8)
                End With
            Next
        End With
    End If
End Sub

【追加設定したコード】
・5行目に、ループカウンター用の変数を新たに用意しています。
・7行目、8行目のセル範囲用のコードは「リストボックス」と共用して使います。
・34行目に、ListItemを初期化するコードを入れてItemをセットする準備をしています。
・35行目から、セル範囲の最終行までのループ処理開始です。
・37行目は、一番左列のメインItemに「名称」のセルデータを代入しています。
・38~44行目で、それ以降の列「SubItem」に順番にセルデータを代入していきます。

・動作確認後ページのキャプション「Page3」を「ListView」に変更しました。
ListView にセル範囲のデータが表示されるようになったGIF画像です。

列の表示幅変更やマウスや矢印キーでのスクロールも可能になりました(^^♪
・「ListView」の設定・データ表示が出来るようになったので今回はここで終了とします。

スポンサーリンク

まとめ(おわりに)

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

まとめと感想など

くるみこ
くるみこ

ListView」の設置からセル範囲のデータを表示させるところまでを解説・勉強しました。「ListView」ならリストの扱い方がやりやすくなる感じがしますね!いかがでしたか?

「リストボックス」との違いが少しわかりました。列幅もマウスで変更出来たり、スクロールできるのはいいですね(^^♪  セルデータを代入するのは「リストボックス」の方が簡単でしたね! 取得する場合はどうなんだろう?

くるみこ
くるみこ

そうですね!「リストボックス」の方が簡単だったかもしれません(^^; では次回は「ListView」のデータを取得する方法など、その他の利点について検証してみましょう! 次回も楽しみにしていてね(^^)/

【今回わかったことは】
ListViewコントロールの設置方法と設定方法と注意点がわかりました
ListViewにセル範囲データを表示させる方法がわかりました

今後の記事について

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

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

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

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