FileSystemObjectでフォルダをコピーするときの注意
FileSystemObjectでフォルダを作る
当方、10年以上前から音楽ファイルの再生にはfoobar2000を使っています。
CDから楽曲データをリッピングしてエンコードするときに、勝手にフォルダを作っていくタイプのソフトウエアにどうしてもなじめなくて、面倒だけれど自力でフォルダ構築してきたのです。
長年使っていると、やはりフォルダの数がえらいことに。
普段づかいのHDDにはflac
でため込んでいるのですが、Walkmanなんかに入れるときは、容量の問題もあってなるべくmp3
にしたい。でもそうなると、〈フォルダごとコピー〉という技が使えない。使ったとしても、flac
ファイルごとコピーされるので、一旦flacファイルを消す手間が生じる。
VBAを始める前は、仕方なく手作業でこうした作業をしていましたが、今は違う。
〈フォルダ構成まるごとコピー〉ぐらいなら(やり方がエレガントかどうかは別として)苦も無く出来るようになりました。
そこで、上には書かなかった〈もう一つの問題〉に取り組むことにしました。
もう一つの問題
「もう一つの問題」。それは、〈アルバムアートの画像ファイルはどうすんの?〉問題である。
音楽フォルダ内では、
こんなふうにフォルダを作っている。何のことはない、アルバムごとにフォルダを作っているだけ。
で、各アルバムフォルダには、flac
ファイルと、アルバムアート用のfolder.jpg
というファイルが入っている。
マクロを作ってフォルダ構成を丸ごとWalkmanの音楽フォルダにコピーしたとて、アルバムごとのfolder.jpg
は別途手作業でコピーせねばならんかったのだ。
対応
しかし、今の私はかつての私とはちがう。I'm not the man who I was used to be. である(英語はこれでいいのだろうか?)。
フォルダをコピーするときに、コピー元フォルダの中にfolder.jpg
があれば、それをコピーするという一手間加えるだけでよい。
それはすでにできている。
しかし、今回の本題はそこではない。もっと初歩的なことだ。
本題
ようやくここで本題だ。たぶん、前置きの方が長い。許せ。
本題は、〈FileSystemObjectでフォルダを作るときの注意〉だ。
準備
テキトーなフォルダ上に、次のようなフォルダを準備する。
Test1
というフォルダの中に、aho
、boke
、kasu
、suttokodokkoi
というフォルダがある。
さらに、aho
フォルダの中にはAnthrax
、Megadeth
、Metallica
、Slayer
フォルダがあるのだ。実はさらにMetallica
フォルダの中にはさらにフォルダが作ってあるのだが、今回は関係ないので省略する。
では、このTest1
フォルダ内にaho
フォルダを作ろうとするとどうなるのか。
次のコードで実験。
リスト1 標準モジュール
Option Explicit Private fsObj As FileSystemObject Private Sub test01() If fsObj Is Nothing Then _ Set fsObj = New FileSystemObject Dim targetDir As String targetDir = ThisWorkbook.Path & "\Test1\aho" Call fsObj.CreateFolder(targetDir) End Sub
このマクロを書いたブックと同じフォルダにあるTest1
フォルダの中にaho
フォルダを作ろうというのだから、aho
フォルダのフルパスはThisWorkbook.Path & "\Test1\aho"
。
こいつをFileSystemObject.CreateFolder
メソッドに渡してやるだけ。何て簡単!
ただし、上でも書いたように、Test1\aho
フォルダは既に存在している。さて、どうなることか。
ちゃんとエラーを吐いてくれた。
何も言わずに上書きされてしまうのではたまらんが、これは親切設計。
おわりに
フォルダの存在確認をして、なかったらフォルダ作成、というようにしたければ、最後の1行を
If Not fsObj.FolderExists(targetDir) then _ Call fsObj.CreateFolder(targetDir)
とすればよろしかろう。FolderExists
というのもメチャメチャわかりやすくて好きです。
私もこんな命名ができるようになりたい……。
フォルダコピー関連の具体的な話はまたこんど……w