和風スパゲティのレシピ

日本語でコーディングするExcelVBA

FileSystemObject.CreateFolderメソッド

FileSystemObjectにてフォルダを作成する、
CreateFolderメソッドについて解説します。

基本形

FSO.CreateFolder 作りたいフォルダのフルパス

実行例

Dim FSO As New FileSystemObject

' デスクトップに「テスト」フォルダを作成
FSO.CreateFolder C:\Users\○○\Desktop\テスト

' マクロを実行したブックと同じフォルダに「バックアップ」フォルダを作成
FSO.CreateFolder Thisworkbook.Path & "\バックアップ"

' カレントフォルダに今日の日付のフォルダを作成
FSO.CreateFolder Format(Date,"yyyymmdd")

解説

FileSystemObject.CreateFolderメソッドは、
作りたいフォルダのパスを渡すとそのフォルダを作成してるメソッドです。

引数がそのひとつであることと、エラーの発生条件も含めて、
通常実行する分には、MkDirステートメントとほとんど同じ動きをします。


発生するエラーは以下の2つになります。

発生するエラー1:すでに存在しているフォルダを指定できない

既に存在するフォルダを指定した場合は、

実行時エラー56
「すでに同名のファイルが存在しています。」

となります。


対策としてフォルダの存在を判定する方法には、
Dir(フォルダパス, Directory)とFSO.FolderExistsの2つがありますが、
既にFSOをSetしているコードですので後者を使用するのが良いでしょう。

If FSO.FolderExists(作成フォルダパス) = False Then
    FSO.CreateFolder 作成フォルダパス
End If

発生するエラー2:既にあるフォルダの中にしか作成できない

続いて2つ目が、既に存在しているフォルダの中にしか実行できない、
つまり、「深い階層まで一気に作ろうとするとエラー」になります。


例えば、まだ「商品」フォルダしかない段階で、

FSO.CreateFolder "C:\Users\○○\Desktop\商品\くだもの\柑橘\みかん"

このコードを実行すると、

実行時エラー76
パスが見つかりません。

エラーとなります。


これを解決するには、

FSO.CreateFolder "C:\Users\○○\Desktop\商品\くだもの"
FSO.CreateFolder "C:\Users\○○\Desktop\商品\くだもの\柑橘"
FSO.CreateFolder "C:\Users\○○\Desktop\商品\くだもの\柑橘\みかん"

このように上の階層から順に作成していく必要があります。


この手の処理をよく行う場合は、
深い階層まで一気に作成するコードを関数として持っておくとよいです。

以下の記事を参考ください。
www.limecode.jp

FileSystemObjectを活用するコード

CreateFolderメソッドには実は返り値があり、Folderオブジェクトを返します。

Dim 新規フォルダ As Folder
Set 新規フォルダ = FSO.CreateFolder("C:\Users\wfsp\Desktop\新規フォルダ")


この後「作ったフォルダにファイルを保存していく」場合に、

Workbooks("○○").SaveAs 新規フォルダ.Path & "\~~~.xlsx"

のようにFolderオブジェクト.Pathを使って書くこともできますし、

さらに一通りファイルを保存した後で、

For Each 作成ファイル In 新規フォルダ.Files

と.Filesプロパティを利用して、各ファイルを見ていくFor Each文にも使えます。


また、Folderオブジェクトの規定のプロパティが「Path」であることを利用し、

Dim path新規フォルダ As String
path新規フォルダ = FSO.CreateFolder("新規フォルダ")

と、「カレントディレクトリからの相対パスにフォルダを作り、作ったフォルダパスをString型で受け取る」ことも可能です。


この中身を解説しますと、

Dim path新規フォルダ As String
Dim 新規フォルダ As Folder

Set 新規フォルダ = FSO.CreateFolder("新規フォルダ")
path新規フォルダ = 新規フォルダ.Path ' ←この最後の.Pathが省略できる

このような仕組みです。
RangeでValueが省略できるのと同じですね。


ただ、流石に既定のプロパティの省略までやるとぱっと見String型とわからないため、

path新規フォルダ = FSO.CreateFolder("新規フォルダ").Path

と、最後に.Pathを明示した方がわかりはいいかもしれません。


新規に作成したフォルダをFolderオブジェクトに入れたところで、
Name、Delete、Moveなどのプロパティ/メソッドがあまり意味をなさないため、
CreateFolderメソッドについては返り値を利用することは少ないかもしれません。

ただFolderオブジェクト自体は便利なものですので、
こういった操作ができることは覚えておくとよいと思います。