読み込むCSVファイルを指定したり、別のブックを開いたり、VBAを書いていてよく出てくるファイルの指定の仕方について、今回はドラッグ&ドロップでパスを取得する方法について解説していきます!
動きとしてはこんな感じになります。
まえがき
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)でリストにあるファイルのパスを取得しています。これを使って、取得したパスのファイルを開くなどをするのがそれ以降のコードになります。
(それ以降のコードでは、ファイルを開いてデータを転記、という動きになっているのですが、説明は割愛します)
解説動画
動画にて解説をしております。実際の画面を見ながらの方がわかりやすいと思いますので、ぜひこちらも見てみてください。
まとめ
今回はドラッグ&ドロップでファイルのパスを取得する方法について解説しました。
参考になれば嬉しいです!
コメント