【本日のミッション】
エクセル VBAのListViewオブジェクトにドラッグ&ドロップで、ファイル名・ファイルパス 複数の情報を取得せよ。
目次
- 1 ミッションの概要
- 2 ListViewオブジェクトにファイルをドラッグ&ドロップで情報表示させる手順
- 3 ツールボックスに ListViewコントロールボタンを表示させる
- 4 ユーザーフォームに ListViewオブジェクトを作る
- 5 ユーザーフォームの Initializeイベントで、ListViewオブジェクトの初期設定を行う
- 6 ファイルをドラッグ&ドロップした時の動作をOLEDragDropイベントプロシージャに設定
- 7 FullRowSelectプロパティ
- 8 Gridlinesプロパティ
- 9 LabelEditプロパティ
- 10 OLEDropModeプロパティ
- 11 Viewプロパティ
- 12 ColumnHeaders.Add
- 13 ListItemsコレクション・SubItemsコレクション
- 14 ListItems.Add
- 15 ListItems.Clear
- 16 Data.Files.Count
- 17 【参考】
ミッションの概要
エクセル VBA の ListViewオブジェクトにドラッグ&ドロップで、ファイル名・ファイルパス 複数の情報を取得せよ、というのが今回のミッションです。
ListViewオブジェクトにファイルをドラッグ&ドロップで情報表示させる手順
- ツールボックスに ListViewコントロールボタンを表示させる
- ユーザーフォームに ListViewオブジェクトを作る
- ユーザーフォームの Initializeイベントプロシージャに、ListViewの初期設定をしておく
OLEDropModeプロパティを「ccOLEDropManual」にすることが重要!
ListViewオブジェクトをどのように表示させたいか、ここできっちり指定しておくこと!ここまでの設定で、ユーザーフォームにListViewオブジェクトが表示されます。 - ListViewオブジェクト「ListView1」のOLEDragDrop イベントに、ファイルをドラッグ&ドロップした時の動作を指定するここまで設定して、ファイルをドラッグ&ドロップして時にListViewオブジェクトに情報が表示されます。
ツールボックスに ListViewコントロールボタンを表示させる
ListViewオブジェクトを使用するためには、ツールボックスにListViewコントロールを追加しなくてはいけません。その方法は、下記ページをご参照ください。
エクセル VBA フォーム ツールボックスにListViewコントロールを追加(Excel VBA)
ユーザーフォームに ListViewオブジェクトを作る
ユーザーフォームを開く
画面左のプロジェクトエクスプローラーから、ユーザーフォームをダブルクリックして開きます。
ツールボックスを表示させる
ListViewオブジェクトを作るためのツールボックスを、下記方法で表示させます。
ツールボックスにListViewボタンが表示されない場合は、エクセル VBA フォーム ツールボックスにListViewコントロールを追加(Excel VBA)を参考に追加してください。
ツールボックスを表示する方法1
[表示]-[ツールボックス]
ツールボックスを表示する方法2
標準ツールバーの[ツールボックス]ボタンをクリックします。
標準ツールバーが表示されていない場合は、[表示]-[ツールバー]-[標準]で表示されます。
ListViewの作成
ツールボックスから「ListView」ボタンをクリックします。
ツールボックスにListViewボタンが表示されない場合は、エクセル VBA フォーム ツールボックスにListViewコントロールを追加(Excel VBA)を参考に追加してください。
ユーザーフォームのListViewオブジェクトを配置したい位置に、左上から左クリックのまま右下までドラッグします。
ユーザーフォームにListViewオブジェクトが作成されます。
左のプロパティウインドウを確認すると、このListViewのオブジェクト名が「ListView1」ということが確認できます。
今回はファイル名・ファイルパスを表示させたいので、ListViewオブジェクトの幅を広げておきます。
ユーザーフォームの Initializeイベントで、ListViewオブジェクトの初期設定を行う
UserForm の Initializeイベント に記述した処理は、ユーザーフォームが画面表示される時に行われます。ユーザーフォームに設置したオブジェクト(リストビュー・リストボックス・コンボボックス・テキストボックス等)で、
- リストビューの列見出し
- プルダウンを開いた時に出てきて欲しい値リスト
- 初めから表示されていて欲しい選択リスト
- テキストの初期値
等がユーザーフォームを開くと同時に設定されるようにしておきます。
今回は、ユーザーフォーム「UserForm1」が画面表示される時に、ListViewオブジェクト「ListView1」に
- 行全体の選択
- 行列グリッド線の表示
- ラベル編集不可
- ファイルドロップの処理
- 表示形式
- 列見出しの名前・列幅の設定
が設定されているようにします。
ユーザーフォームのコードウィンドウを表示
プロジェクトエクスプローラーから、ListViewオブジェクトを設置しているユーザーフォームを右クリックします。
[コードの表示]をクリックし、コードウィンドウを表示させます。([F7]キーでもコード表示できます。)
UserFormの選択
コードウィンドウ上部の「(General)」と表示されているプルダウンを開き、「UserForm」を選択します。
自動的に下記コードが挿入されますが、削除するとUserFormの選択が解除されるため、そのままにしておきます。
Initializeイベントの選択
右側のプルダウン(「Click」と表示されています。)を開き、「Initialize」を選択します。
下記コードが表示されます。
ここで先ほどの「Private Sub UserForm_Click() ~ End Sub」は不要になりますので、削除しておきましょう。
UserForm の Initializeイベントプロシージャにコードの追加
UserForm の Initializeイベントプロシージャ「Private Sub UserForm_Initialize ~ End Sub」 内に下記の通り、コードを追加します。
Private Sub UserForm_Initialize() With ListView1 '■プロパティ設定 .FullRowSelect = True '行全体の選択 .Gridlines = True '行列グリッド線の表示 .LabelEdit = lvwManual 'ラベル編集不可 .OLEDropMode = ccOLEDropManual 'ファイルドロップ処理 .View = lvwReport '表示形式 '■列見出しの名前・列幅の設定 .ColumnHeaders.Add , "key1", "ファイル名", 100, lvwColumnLeft .ColumnHeaders.Add , "key2", "ファイルパス", 300, lvwColumnLeft End With End Sub
ユーザーフォームの実行
このコード内にカーソルを置いたまま、[F5]キーをクリック(ユーザーフォームの実行)するとユーザーフォームが表示されます。
ファイルをドラッグ&ドロップした時の動作をOLEDragDropイベントプロシージャに設定
UserForm Initializeイベントプロシージャの初期設定だけでは、ListViewオブジェクトは希望している動作をしません。ファイルをドラッグ&ドロップした時の動作を設定する必要があります。
ユーザーフォームのコードウィンドウを表示
プロジェクトエクスプローラーから、ListViewオブジェクトを設置しているユーザーフォームを右クリックします。
[コードの表示]をクリックし、コードウィンドウを表示させます。([F7]キーでもコード表示できます。)
ListViewオブジェクト「ListView1」の選択
コードウィンドウ上部左のプルダウンを開き、ListViewオブジェクト「ListView1」を選択します。
自動的に下記コードが挿入されますが、このコードは使用しません。削除するとListView1の選択が解除されるため、そのままにしておきます。
OLEDragDropイベントの選択
上部右側のプルダウンを開き、「OLEDragDrop」イベントを選択します。
下記コードが表示されます。
ここで先ほどの「Private Sub ListView1_BeforeLabelEdit(Cancel As Integer)~ End Sub」は不要になりますので、削除しておきましょう。
ListViewオブジェクト「ListView1」の OLEDragDropイベントプロシージャ にコードの追加
ListViewオブジェクト「ListView1」の OLEDragDropイベントプロシージャ「Private Sub ListView1_OLEDragDrop ~ 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 = Dir(Data.Files(i)) 'ファイル名 .SubItems(1) = Data.Files(i) 'ファイルパス End With Next i End With End Sub
ファイルをドラッグ&ドロップした時の動作確認
このコード内にカーソルを置いたまま、[F5]キーをクリック(ユーザーフォームの実行)するとユーザーフォームが表示されます。
ユーザーフォームに、ファイルをドラッグ&ドロップすると、ファイル名とファイルパスが表示されます。
FullRowSelectプロパティ
参考:エクセル VBA ListView の FullRowSelect プロパティとは(Excel VBA)
True:行全体を選択します。
False:項目だけを選択します。
Gridlinesプロパティ
参考:エクセル VBA ListView の Gridlines プロパティとは(Excel VBA)
True:行列グリッド線を表示します。
False:行列グリッド線を表示しません。
LabelEditプロパティ
参考:エクセル VBA ListView の LabelEdit プロパティとは(Excel VBA)
lvwManual:ラベル編集不可
lvwAutomatic:ラベル編集可
OLEDropModeプロパティ
参考:エクセル VBA ListView の OLEDropMode プロパティとは(Excel VBA)
ccOLEDropManual:ファイルをドロップするとListViewオブジェクトの OLEDragDropイベントプロシージャに記述した処理を行います。
今回、ListViewオブジェクト「ListView1」の OLEDragDropイベントプロシージャ「Private Sub ListView1_OLEDragDrop」では、既存ファイル名・ファイルパスのクリアと、ドロップしたファイルのファイル名・ファイルパスのリスト化の処理を行っています。
ccOLEDropNone:ファイルをドロップしても、ListViewオブジェクトの OLEDragDropイベントプロシージャに記述した処理は行われず、ファイルが開きます。
Viewプロパティ
参考:エクセル VBA ListView の View プロパティ とは(Excel VBA)
lvwReport:詳細表示
lvwList:一覧表示
lvwSmallIcon:小アイコン表示
lvwIcon:アイコン表示
ColumnHeaders.Add
ListViewオブジェクトの列見出しを追加・設定します。
参考:エクセル VBA ListView の ColumnHeaders コレクションとは(Excel VBA)
ListViewオブジェクト.ColumnHeaders.Add Index, Key, Text, Width, Alignment, Icon
引数 | 内容 | ||||||
Index | 追加する列の位置を指定します。省略すると左から追加されます。 | ||||||
Key | 列見出しを特定するユニークな名前を指定します。 2つの異なる列に、同じ名前を指定すると「実行時エラー ‘35602’: Key is not unique in collection」というエラーが表示されますので、列ごとに重複しない名前を指定するようにします。 | ||||||
Text | 列見出しに表示する文字列を指定します。 | ||||||
Width | 列見出しの幅を指定します。省略すると均等幅になります。 | ||||||
Alignment | 見出し文字列の位置を指定します。
|
ListItemsコレクション・SubItemsコレクション
ListViewオブジェクトの表示形式を詳細表示「lvwReport」(参考:エクセル VBA ListView の View プロパティ とは(Excel VBA))にしている場合、「ListItemsコレクション」は左の1列目のみになります。2列目以降は1列目「ListItemsコレクション」の「SubItemsコレクション」になります。
今回の場合は、1列目のファイル名を「ListItemsコレクション」として、2列目のファイルパスは1列目「ListItemsコレクション」の「SubItemsコレクション」として処理する必要があります。
With .ListItems.Add .Text = Dir(Data.Files(i)) 'ファイル名 .SubItems(1) = Data.Files(i) 'ファイルパス End With
ListItems.Add
ListViewオブジェクトの「ListItemsコレクション」にデータを追加します。
上記で説明した通り、「ListItemsコレクション」は左1列目のみになります。ListItems.Add で追加した「ListItemsコレクション」にデータを入れられるのは1列目のファイル名のみになります。
2列目のファイルパスは、ListItems.Add で追加した「ListItemsコレクション」の「SubItemsコレクション」にデータを入れる必要があります。
For i = 1 To fileCount With .ListItems.Add .Text = Dir(Data.Files(i)) 'ファイル名 .SubItems(1) = Data.Files(i) 'ファイルパス End With Next i
別の表記にすると、下記のようになります。
For i = 1 To fileCount .ListItems.Add.Text = Dir(Data.Files(i)) 'ファイル名 .ListItems(i).SubItems(1) = Data.Files(i) 'ファイルパス Next i
ただ、この書き方ですと「ListItems.Clear」をしなかった場合、ファイルパスが正しく表示されないので注意が必要です。
ListItems.Clear
ListViewオブジェクトに表示されているデータをクリアします。
項目をクリアせずに、ファイルをドラッグ&ドロップすると、前に表示されていたデータを残したまま、下にデータが追加されます。
↓前にドラッグ&ドロップしたファイルパスが残った状態。
Data.Files.Count
ドラッグ&ドロップしているファイルの数です。
「Data」はどこから来たの?と、思ってしまいますね。
ListViewオブジェクト「ListView1」の OLEDragDropイベントプロシージャを設定したときに、自動的に組み込まれているんですね。
Private Sub ListView1_OLEDragDrop(Data As MSComctlLib.DataObject, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single)
・
・
End if
【参考】
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)