こんにちは!あつもり(@atumori17)です。
前回は「ドラッグアンドドロップしてファイル名とフルパスを取得する方法」を紹介しましたが、今回はその内容をさらに便利にしてお伝えしていこうと思います。
前回はドラッグアンドドロップしたファイルのフルパスとファイル名をInputBoxを使って表示させました。
この方法だとファイルが1つの場合は良いのですが、複数ファイルの場合ちょっと不便に感じることがあるかもしれません。例えばエクセルを使ってファイル名とフルパスの一覧表を作成する場合などです。
ファイルの数ぶんコピー&ペーストを繰り返さなければいけませんよね。う~ん。ちょっと何とかならないかな?ってことで今回は「ドラッグアンドドロップで複数ファイルのフルパスをCSVに書き出す方法」を紹介していきます。
CSVファイルとはデータをカンマで区切ったテキストファイル
スクリプトの解説に入る前にCSVファイルとは何か?という説明をさせてください。
ひとことで言うと「カンマで区切られた値が入ったテキストファイル」です。CSVはComma Separated Valueの略になります。
CSVファイルはデータベースからデータをエクスポートしてエクセルで加工したり、逆にエクセルで作ったデータをデータベースにインポートしたりなんて時に使います。
このようにCSVファイルはさまざまなソフトと互換性があるので、データのやりとりをするのに使われることが多いファイル形式なんです。
下の画像はデータベースからエクスポートした「商品マスタ.csv」をエクセルで開いた例です。カンマで区切られたデータをセルごと分けて開いてくれます。CSVファイルはエクセルと相性がいいんですね。
ファイルパスをCSVファイルに書き出すスクリプト
CSVとは何かの説明が終わったところで、スクリプトの全文を紹介します。テキストエディタを開き、下記のコードを入力します。
全て入力し終わったら「ファイルのフルパスをCSVに書き出す.vbs」などのファイル名でデスクトップに保存します。
Option Explicit
'ドラッグアンドドロップで取得したファイルパスを変数に入れる
Dim GetPathArray
Set GetPathArray = WScript.Arguments
Dim objFSO
Set objFSO = CreateObject("Scripting.FileSystemObject")
Dim pt
'配列の内容を出力
For Each pt in GetPathArray
'取得したファイル名
Dim FileName
FileName = objFSO.GetFileName(pt)
'取得したフォルダパス
Dim FolderPath
FolderPath = objFSO.GetParentFolderName(pt)
'カンマで連結させてテキストファイルに出力
OutputText pt & "," & FolderPath & "," & FileName
Next
Set objFSO = Nothing
MsgBox "CSVファイルの書き出しが終わりました"
'テキストファイルへ出力
Function OutputText(ByVal strMsg)
Dim objFSO
Dim objText
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set objText = objFSO.OpenTextFile("C:\work\ファイルパス.csv", 8, True)
objText.write strMsg
objText.write vbCrLf
objText.close
Set objFSO = Nothing
Set objText = Nothing
End Function
プログラムコードの解説
GetParentFolderNameメソッドで親フォルダのパスを取得する
今回はCSVファイルに書き出すということで、せっかくですので親フォルダのパスも取得しようと思います。親フォルダとは指定したファイルが入っているフォルダを指します。
以下の画像を見てください。「マニュアル1.xls」を基準に考えると、親フォルダは「勉強会資料」、親フォルダのパスは「C:\work\勉強会資料」となります。
親フォルダのパスを取得するにはファイルシステムオブジェクトのGetParentFolderNameメソッドを使います。
ファイルパスには対象ファイルのフルパスを指定します。
自作関数に引数を渡してCSVファイルとして書き出す
OutputText関数は自作した関数です。この関数は引数で渡した値をテキストファイルに書き出すというものです。上記のプログラムコードの31行目から48行目になります。
自作関数のOutputText関数については過去の記事で詳しく紹介していますので参考にしてみてください。
今回のアプリケーションではCSVファイルに書き出すので、OutputText関数に渡すデータはカンマで連結させたデータになります。ここではファイルのフルパス、親フォルダのパス、ファイル名をカンマで連結させています。
上記のプログラムコードの23、24行目になります。
'カンマで連結させてテキストファイルに出力 OutputText pt & "," & FolderPath & "," & FileName
気をつけなければいけないのが、過去の記事で紹介しているOutputText関数は拡張子を.txtとて書き出していましたが、今回はCSVファイルですので拡張子を.csvにします。上記のプログラムコードの38行目になります。
Set objText = objFSO.OpenTextFile("C:\work\ファイルパス.csv", 8, True)
プログラムの説明は以上になります。
ドラッグアンドドロップでのCSV書き出しを実行してみる
テスト用のファイルを作成してドラッグアンドドロップする
まずはテスト用のファイルを作ります。今回は「C:\work」フォルダの下に「勉強会資料」フォルダを作り、マニュアル1~5.xlsを作りました。
では実際に起動してみます。デスクトップにある「ファイルのフルパスをCSVに書き出す.vbs」にテスト用に作成したエクセルファイルをドラッグアンドドロップします。
メッセージボックスが表示されたらOKボタンを押します。
「C:\work」フォルダの下にファイルパス.csvファイルができました。
書き出されたCSVファイル開いてみる
それでは書き出されたCSVファイルをテキストエディタで開いてみましょう。開いたファイルを見てみると、ドラッグアンドドロップしたファイルの
- フルパス
- 親フォルダのパス
- ファイル名
がカンマで区切られて書き出されていますね。
せっかくなのでエクセルでも開いてみましょう。おお~!いい感じにセルごとにデータが分かれましたっ。
まとめ
いかかでしたか?今回の内容をまとめると以下のようになります。
- CSVファイルはカンマで区切られた値が入ったテキストファイルでエクセルと相性がいい
- GetParentFolderNameメソッドで親フォルダのパスを取得できる
以上になりますっ。お疲れ様でした~。