エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA)

【本日のミッション】

エクセル VBAのListViewオブジェクトにドラッグ&ドロップで、ファイル名・ファイルパス 複数の情報を取得せよ。

目次

ミッションの概要

エクセル VBA の ListViewオブジェクトにドラッグ&ドロップで、ファイル名・ファイルパス 複数の情報を取得せよ、というのが今回のミッションです。

エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA)

ListViewオブジェクトにファイルをドラッグ&ドロップで情報表示させる手順

  1. ツールボックスに ListViewコントロールボタンを表示させる
  2. ユーザーフォームに ListViewオブジェクトを作る
  3. ユーザーフォームの Initializeイベントプロシージャに、ListViewの初期設定をしておく
    OLEDropModeプロパティを「ccOLEDropManual」にすることが重要!
    ListViewオブジェクトをどのように表示させたいか、ここできっちり指定しておくこと!ここまでの設定で、ユーザーフォームにListViewオブジェクトが表示されます。
  4. ListViewオブジェクト「ListView1」のOLEDragDrop イベントに、ファイルをドラッグ&ドロップした時の動作を指定するここまで設定して、ファイルをドラッグ&ドロップして時にListViewオブジェクトに情報が表示されます。

ツールボックスに ListViewコントロールボタンを表示させる

ListViewオブジェクトを使用するためには、ツールボックスにListViewコントロールを追加しなくてはいけません。その方法は、下記ページをご参照ください。

エクセル VBA フォーム ツールボックスにListViewコントロールを追加(Excel VBA)

エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA)

ユーザーフォームに ListViewオブジェクトを作る

ユーザーフォームを開く

画面左のプロジェクトエクスプローラーから、ユーザーフォームをダブルクリックして開きます。

エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA)

ツールボックスを表示させる

ListViewオブジェクトを作るためのツールボックスを、下記方法で表示させます。

エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA)

ツールボックスにListViewボタンが表示されない場合は、エクセル VBA フォーム ツールボックスにListViewコントロールを追加(Excel VBA)を参考に追加してください。

ツールボックスを表示する方法1

[表示]-[ツールボックス]

エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA)

ツールボックスを表示する方法2

標準ツールバーの[ツールボックス]ボタンをクリックします。

標準ツールバーが表示されていない場合は、[表示]-[ツールバー]-[標準]で表示されます。

エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA)

ListViewの作成

ツールボックスから「ListView」ボタンをクリックします。
ツールボックスにListViewボタンが表示されない場合は、エクセル VBA フォーム ツールボックスにListViewコントロールを追加(Excel VBA)を参考に追加してください。

エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA)

ユーザーフォームのListViewオブジェクトを配置したい位置に、左上からクリックのまま右下までドラッグします。

エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA)

ユーザーフォームにListViewオブジェクトが作成されます。

左のプロパティウインドウを確認すると、このListViewのオブジェクト名が「ListView1」ということが確認できます。

エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA)

今回はファイル名・ファイルパスを表示させたいので、ListViewオブジェクトの幅を広げておきます。

エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA)

■■■スポンサーリンク■■■

ユーザーフォームの Initializeイベントで、ListViewオブジェクトの初期設定を行う

UserForm の Initializeイベント に記述した処理は、ユーザーフォームが画面表示される時に行われます。ユーザーフォームに設置したオブジェクト(リストビュー・リストボックス・コンボボックス・テキストボックス等)で、

  • リストビューの列見出し
  • プルダウンを開いた時に出てきて欲しい値リスト
  • 初めから表示されていて欲しい選択リスト
  • テキストの初期値

等がユーザーフォームを開くと同時に設定されるようにしておきます。

今回は、ユーザーフォーム「UserForm1」が画面表示される時に、ListViewオブジェクト「ListView1」に

  • 行全体の選択
  • 行列グリッド線の表示
  • ラベル編集不可
  • ファイルドロップの処理
  • 表示形式
  • 列見出しの名前・列幅の設定

が設定されているようにします。

ユーザーフォームのコードウィンドウを表示

プロジェクトエクスプローラーから、ListViewオブジェクトを設置しているユーザーフォームを右クリックします。

[コードの表示]をクリックし、コードウィンドウを表示させます。([F7]キーでもコード表示できます。)

エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA)

UserFormの選択

コードウィンドウ上部の「(General)」と表示されているプルダウンを開き、「UserForm」を選択します。

エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA)

自動的に下記コードが挿入されますが、削除するとUserFormの選択が解除されるため、そのままにしておきます。

エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA)

Initializeイベントの選択

右側のプルダウン(「Click」と表示されています。)を開き、「Initialize」を選択します。

エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA)

下記コードが表示されます。

ここで先ほどの「Private Sub UserForm_Click() ~ End Sub」は不要になりますので、削除しておきましょう。

エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA)

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]キーをクリック(ユーザーフォームの実行)するとユーザーフォームが表示されます。

エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA)

ファイルをドラッグ&ドロップした時の動作をOLEDragDropイベントプロシージャに設定

UserForm Initializeイベントプロシージャの初期設定だけでは、ListViewオブジェクトは希望している動作をしません。ファイルをドラッグ&ドロップした時の動作を設定する必要があります。

ユーザーフォームのコードウィンドウを表示

プロジェクトエクスプローラーから、ListViewオブジェクトを設置しているユーザーフォームを右クリックします。

[コードの表示]をクリックし、コードウィンドウを表示させます。([F7]キーでもコード表示できます。)

エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA)

ListViewオブジェクト「ListView1」の選択

コードウィンドウ上部左のプルダウンを開き、ListViewオブジェクト「ListView1」を選択します。

エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA)

自動的に下記コードが挿入されますが、このコードは使用しません。削除するとListView1の選択が解除されるため、そのままにしておきます。

エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA)

OLEDragDropイベントの選択

上部右側のプルダウンを開き、「OLEDragDrop」イベントを選択します。

エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA)

下記コードが表示されます。

ここで先ほどの「Private Sub ListView1_BeforeLabelEdit(Cancel As Integer)~ End Sub」は不要になりますので、削除しておきましょう。

エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA)

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]キーをクリック(ユーザーフォームの実行)するとユーザーフォームが表示されます。

エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA)

ユーザーフォームに、ファイルをドラッグ&ドロップすると、ファイル名とファイルパスが表示されます。

エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA)

■■■スポンサーリンク■■■

FullRowSelectプロパティ

参考:エクセル VBA ListView の FullRowSelect プロパティとは(Excel VBA)

True:行全体を選択します。

エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA)

False:項目だけを選択します。

エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA)

Gridlinesプロパティ

参考:エクセル VBA ListView の Gridlines プロパティとは(Excel VBA)

True:行列グリッド線を表示します。

エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA)

False:行列グリッド線を表示しません。

エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA)

LabelEditプロパティ

参考:エクセル VBA ListView の LabelEdit プロパティとは(Excel VBA)

lvwManual:ラベル編集不可

エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA)

lvwAutomatic:ラベル編集可

エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA)

OLEDropModeプロパティ

参考:エクセル VBA ListView の OLEDropMode プロパティとは(Excel VBA)

ccOLEDropManual:ファイルをドロップするとListViewオブジェクトの OLEDragDropイベントプロシージャに記述した処理を行います。

今回、ListViewオブジェクト「ListView1」の OLEDragDropイベントプロシージャ「Private Sub ListView1_OLEDragDrop」では、既存ファイル名・ファイルパスのクリアと、ドロップしたファイルのファイル名・ファイルパスのリスト化の処理を行っています。

エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA)

ccOLEDropNone:ファイルをドロップしても、ListViewオブジェクトの OLEDragDropイベントプロシージャに記述した処理は行われず、ファイルが開きます。

エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA)

Viewプロパティ

参考:エクセル VBA ListView の View プロパティ とは(Excel VBA)

lvwReport:詳細表示

エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA)

lvwList:一覧表示

エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA)

lvwSmallIcon:小アイコン表示

エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA)

lvwIcon:アイコン表示

エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA)

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」というエラーが表示されますので、列ごとに重複しない名前を指定するようにします。
エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA)
Text列見出しに表示する文字列を指定します。
Width列見出しの幅を指定します。省略すると均等幅になります。
Alignment見出し文字列の位置を指定します。
lvwColumnLeft(規定値)左寄せ
lvwColumnRight右寄せ
lvwColumnCenter中央
■■■スポンサーリンク■■■

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

エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA)

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

エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA)

別の表記にすると、下記のようになります。

For i = 1 To fileCount
    .ListItems.Add.Text = Dir(Data.Files(i))  'ファイル名
    .ListItems(i).SubItems(1) = Data.Files(i) 'ファイルパス
Next i

ただ、この書き方ですと「ListItems.Clear」をしなかった場合、ファイルパスが正しく表示されないので注意が必要です。

エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA)

ListItems.Clear

ListViewオブジェクトに表示されているデータをクリアします。
項目をクリアせずに、ファイルをドラッグ&ドロップすると、前に表示されていたデータを残したまま、下にデータが追加されます。

↓前にドラッグ&ドロップしたファイルパスが残った状態。

エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA)

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)

■■■スポンサーリンク■■■