【本日のミッション】
エクセル VBA ListViewオブジェクト の ListItemsコレクション・SubItemsコレクションを解明せよ。
ミッションの概要
エクセル VBA ListViewオブジェクト の ListItemsコレクション・SubItemsコレクションを解明せよ、というのが今回のミッションです。
ListViewオブジェクトを使う時、表示形式を詳細表示「lvwReport」にしていると、複数列のデータを表示させることができるのですが、列によって扱うコレクションが異なります。
ここに出てくる「ListItemsコレクション」と「SubItemsコレクション」の使い方を調べてみました。

プロシージャ
ListItemsコレクション・SubItemsコレクションの動作を確認するために、下記プロシージャをサンプルとして使用します。
その他のコードの内容につきましては、エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA)をご参照ください。
ファイルをドラッグ&ドロップすると、No(連番)、ファイル名、ファイルパスを取得するコードになります。


Private Sub UserForm_Initialize()
With ListView1
'■プロパティ設定
.FullRowSelect = True '行全体の選択
.Gridlines = True '行列グリッド線の表示
.LabelEdit = lvwManual 'ラベル編集不可
.OLEDropMode = ccOLEDropManual 'ファイルドロップ処理
.View = lvwReport '表示形式
'■列見出しの名前・列幅の設定
.ColumnHeaders.Add , "key1", "No", 30, lvwColumnLeft
.ColumnHeaders.Add , "key2", "ファイル名", 100, lvwColumnLeft
.ColumnHeaders.Add , "key3", "ファイルパス", 300, lvwColumnLeft
End With
End Sub
Private Sub ListView1_OLEDragDrop(Data As MSComctlLib.DataObject, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single)
'【変数】
Dim i As Long 'カウンター
Dim fileCount As Long 'ファイル数
With ListView1
'■既存ファイル名のクリア
.ListItems.Clear
'■ファイル数の取得
fileCount = Data.Files.Count
'■ドラッグ&ドロップしたファイル名・ファイルパスを順にリスト化
For i = 1 To fileCount
With .ListItems.Add
.Text = i ’No
.SubItems(1) = Dir(Data.Files(i)) 'ファイル名
.SubItems(2) = Data.Files(i) 'ファイルパス
End With
Next i
End With
End Sub
ListItemsコレクション・SubItemsコレクション
ListViewの表示形式を詳細表示「lvwReport」(参考:エクセル VBA ListView の View プロパティ とは(Excel VBA))にしている場合、「ListItemsコレクション」は左の1列目のみになります。2列目以降は1列目「ListItemsコレクション」の「SubItemsコレクション」になります。
今回のプロシージャの処理の順番は下記の通りです。
- ListItems.Addで「ListItemsコレクション」を追加します。
- 追加された「ListItemsコレクション」の Text に No(i)を入れます。
- 追加された「ListItemsコレクション」の1つ目の「SubItemsコレクション」にファイル名(i番目)を入れます。
- 追加された「ListItemsコレクション」の2つ目の「SubItemsコレクション」にファイルパス(i番目)を入れます。
For i = 1 To fileCount
With .ListItems.Add
.Text = i 'No
.SubItems(1) = Dir(Data.Files(i)) 'ファイル名
.SubItems(2) = Data.Files(i) 'ファイルパス
End With
Next i


上記コードの処理がどんな風に行われているか、具体的に表記するならこんな感じです。
変数iを数字で、ファイル名・ファイルパスを実際のテキストとして表示しています。


①1つ目の ListItems が追加されて、その Text に「1」が入ります。
②追加された ListItems の1つ目の SubItems に「File1_1.xlsx」が入ります。
③追加された ListItems の2つ目の SubItems に「C:\VBA\第1階層\File1_1.xlsx」が入ります。
④2つ目の ListItems が追加されて、その Text に「2」が入ります。
⑤追加された ListItems の1つ目の SubItems に「File1_2.xlsx」が入ります。
⑥追加された ListItems の2つ目の SubItems に「C:\VBA\第1階層\File1_2.xlsx」が入ります。
⑦3つ目の ListItems が追加されて、その Text に「3」が入ります。
⑧追加された ListItems の1つ目の SubItems に「File1_3.xlsx」が入ります。
⑨追加された ListItems の2つ目の SubItems に「C:\VBA\第1階層\File1_3.xlsx」が入ります。
With .ListItems.Add .Text = 1 'No .SubItems(1) = "File1_1.xlsx" 'ファイル名 .SubItems(2) = "C:\VBA\第1階層\File1_1.xlsx" 'ファイルパス End With With .ListItems.Add .Text = 2 'No .SubItems(1) = "File1_2.xlsx" 'ファイル名 .SubItems(2) = "C:\VBA\第1階層\File1_2.xlsx" 'ファイルパス End With With .ListItems.Add .Text = 3 'No .SubItems(1) = "File1_3.xlsx" 'ファイル名 .SubItems(2) = "C:\VBA\第1階層\File1_3.xlsx" 'ファイルパス End With
【参考】
VBA(マクロ)作成の前、リボンに開発タブを表示させる(Excel VBA)
ユーザーフォームの作成方法 準備(Excel VBA)
ユーザーフォームのオブジェクトの名前を「UserForm1」から変更する方法(Excel VBA)
ユーザーフォームの上のバー(タイトルバー)の名前を「UserForm1」から変更する(Excel VBA)
ユーザーフォームのオブジェクトウィンドウとコードウィンドウを表示切替させる方法(Excel VBA)
「オブジェクト名が不正です」を出さないようにユーザーフォームオブジェクト名を命名規則に従って変更(Excel VBA)
エクセルファイルが開いた時にユーザーフォームを表示させる方法(Excel VBA)
エクセル フォームのラベルのテキストを縦書きにする方法(Excel VBA)
エクセル VBA フォーム ツールボックスにListViewコントロールを追加(Excel VBA)
エクセル VBA フォーム「Microsoft ListView Control」が出てこない原因 (Excel VBA)
エクセル VBA ListViewにドラッグ&ドロップでファイルパスを取得(Excel VBA)
エクセル VBA ListViewにスクロールバーを表示させる(Excel VBA)
エクセル VBA ListView の FullRowSelect プロパティとは(Excel VBA)
エクセル VBA ListView の Gridlines プロパティとは(Excel VBA)
エクセル VBA ListView の LabelEdit プロパティとは(Excel VBA)
エクセル VBA ListView の OLEDropMode プロパティとは(Excel VBA)
エクセル VBA ListView の View プロパティ とは(Excel VBA)
エクセル VBA ListView の ColumnHeaders コレクションとは(Excel VBA)
エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA)
エクセル VBA ListViewのListItems・SubItemsコレクションとは(Excel VBA)
エクセル VBA ListView の OLEDragDropイベントとは(Excel VBA)