【エクセルVBA】ドラッグ&ドロップでファイルパスを取得

VBA

※本サイトはアフィリエイト広告を利用しています。

読み込むCSVファイルを指定したり、別のブックを開いたり、VBAを書いていてよく出てくるファイルの指定の仕方について、今回はドラッグ&ドロップでパスを取得する方法について解説していきます!
動きとしてはこんな感じになります。

【エクセルVBA】ドラッグ&ドロップでファイルパス取得~ショートVer.~

まえがき

VBAを書いているときに別のブックからをデータを転記する場面が発生することが良くあるのですが、その場合はのファイルの指定の仕方はみなさん何を使われているでしょうか?
私はよくThisWorkbooks.pathを使っています。VBAを書いたエクセルと同じフォルダにデータの入ったブックを入れておくとThisWorkbooks.pathでフォルダ名が指定できるので、このパスとファイル名でどのブックかを指定できます。

自分が使う場合はこれでいいのですが、お客様からの依頼で作成をする場合には同じフォルダに対象のファイルが入れられない場合もあります。そのような時にはエクスプローラー表示してファイルを使用者に指定してもらうという方法が取れます。
以前紹介したこちらのコードですね。

ダイアログからファイルを開く

この方法でも使用者にファイルを指定してもらうことができるのですが、複数のファイルを指定してもらう場合、少し手間がかかります。
そこで今回は、ドラッグ&ドロップでファイルのパスを取得する方法をご紹介します。

準備

今回実行したい動きとしては、

  • ドラッグ&ドロップするウインドウを表示する
  • ドラッグ&ドロップしたファイル名のパスを取得する

の2ステップです。

まず準備としてドラッグ&ドロップするウインドウの作成をします。

リストビューの作成

まず、リストを表示するためのユーザーフォームを挿入します。
「フォーム」→「挿入」→「ユーザーフォーム」の順に選択をしてユーザーフォームを挿入します。

ユーザーフォームにリストビューを追加します。左下のアイコンがリストビューです。

補足:ツールボックスの表示&List Viewのアイコンの追加

ツールボックスが表示されない場合や、ツールボックスにListViewが無い場合の対処方法についての補足も書いておきます。
既に表示されている場合は読み飛ばして大丈夫です!

1.ツールボックスが表示されない場合
「表示」→「ツールボックス」でツールボックスが表示できます。

※ちなみに、フォーム以外のもの(標準モジュールなど)を選択している場合は「ツールボックス」の文字が色が薄くなっていて選択できないようになっていますので、フォームを選択している状態でツールボックスの表示を試してみてください。

2.List Viewのアイコンが無い場合

ツールボックス上で右クリックして「その他のコントロール」をクリックします

コントロールの追加画面で、「Microsoft ListView Control」にチェックを入れ、OKをクリックします。

サンプルコード

それでは早速サンプルコードを紹介していきます。

<標準モジュール>

Sub OpenUserform()
    'ユーザーフォームを開く(フォームの名前はDropFileとしています)
    DropFile.Show
End Sub

<フォーム>

Private Sub UserForm_Initialize()
    With ListView1
    
        ''''プロパティの設定
        .FullRowSelect = True           '行全体の選択
        .Gridlines = True               '行列グリッド線の表示
        .View = lvwReport               '表示形式
        .OLEDropMode = ccOLEDropManual  'ファイルドロップ処理

        ''''列見出しの名前・列幅の設定
        .ColumnHeaders.Add , "key1", "ファイルパス", 450, lvwColumnLeft
    End With
End Sub


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
        
        'ファイル数の取得(複数ファイルを同時にドラッグ&ドロップした時用)
        FileCount = Data.Files.Count
        
        'ドラッグ&ドロップしたファイルパスを順にリスト化
        For i = 1 To FileCount
            .ListItems.Add = Data.Files(i)
        Next i
        
    End With
End Sub

Sub CommandButton1_Click()
    Dim i As Long
    Dim FileCount As Long
    Dim LastRow As Long
    
    'リストにあるファイル数を取得
    FileCount = ListView1.ListItems.Count
    
    'それぞれのファイルに対して転記を実行
    For i = 1 To FileCount
    
        '転記先の最終行を取得
        LastRow = Cells(Rows.Count, 1).End(xlUp).Row

        'ファイルパスの取得
        FilePath = ListView1.ListItems(i)
        'ファイルを開く
        Workbooks.Open FilePath
                
        'セルA1のデータを1列目の最終行に転記
        Range("A1").Copy ThisWorkbook.Worksheets("Sheet1").Cells(LastRow, 1)
            
        'ファイルを保存せずに閉じる
        Workbooks(ActiveWorkbook.Name).Close SaveChanges:=False
      
    Next i
    
    'ユーザーフォームを閉じる
    Unload Me

End Sub

コードは標準モジュールのコード(ユーザーフォームを開くためのコード)とユーザーフォームのコードの2つに大きく分かれています。
標準モジュールのコードはユーザーフォームを開くだけなので割愛して、ユーザーフォームのコードを解説していきます。

Initialize

このコードはユーザーフォームのイニシャライズをするための物です。フォームのサイズや見た目などの設定をしています。

.OLEDropMode = ccOLEDropManualは手動でドロップされたアイテムを処理するためのコードになります。それ以外はリストの表示の見た目を整えるためのコードです。

.ColumnHeaders.Add , “key1”, “ファイルパス”, 450, lvwColumnLeft
見出しの名前などを設定します。“ファイルパス”というのが見出しに表示したい名前です。
その前に書いてあるKey1というのは、見出しを2種類以上使いたい時にはKey2などになります。例えばファイル名とファイルパスを別々に表示したいなど、見出しが2つ以上いる場合に使うことになります。

450, lvwColumnLeftの数字はリストを表示する幅、その後ろの指定は文字の配置になります。右寄せ、左寄せ、中央に表示の3タイプあります。

Sub ListView1_OLEDragDrop

このコードはドラッグ&ドロップされた時に実行されるものです。

Dataにドラッグ&ドロップしたファイルの情報が格納され、それを.ListItems.Add = Data.Files(i)でリストに追加していきます。

Sub CommandButton1_Click()

このコードはユーザーフォームにある実行ボタンをクリックした時に実行されるものです。

FilePath = ListView1.ListItems(i)でリストにあるファイルのパスを取得しています。これを使って、取得したパスのファイルを開くなどをするのがそれ以降のコードになります。
(それ以降のコードでは、ファイルを開いてデータを転記、という動きになっているのですが、説明は割愛します)

解説動画

動画にて解説をしております。実際の画面を見ながらの方がわかりやすいと思いますので、ぜひこちらも見てみてください。

【エクセルVBA】ドラッグ&ドロップでファイルバスを取得

まとめ

今回はドラッグ&ドロップでファイルのパスを取得する方法について解説しました。
参考になれば嬉しいです!

お問い合わせ、お仕事のご依頼などがありましたら下記のお問い合わせフォームからご連絡ください。
お問い合わせフォーム
VBAの作成であれば50,000円ほどから、自分で使うVBAの書き方で詰まっている方のお手伝いであれば10,000円ほどから承ります。

VBA
スポンサーリンク
スポンサーリンク
りこをフォローする
エクセルVBAの寺子屋

コメント

タイトルとURLをコピーしました