CreateFolder について
ファイル出力を行う際に、フォルダを作る処理が必要になりました
そのため、CreateFolderメソッドについて調べてみます
MkDirメソッド同様に、親フォルダがない場合はエラーになってしまいますので、再帰的にフォルダを作成するサンプルなどを作成します
■CreateFolderメソッド
フォルダを作成するメソッドですね
・構文
構文は以下の通りです
object.CreateFolder (foldername)
objectはFileSystemObjectのオブジェクトです
・パラメータ
メソッドのパラメータは以下の通りです
- foldername … 作成するフォルダのパス
作成するフォルダのパスを設定しますが、最後の文字はフォルダの区切り文字でなくても、作成するフォルダを識別した文字列として処理されます
・戻り値
メソッドの戻り値は以下の通りです
- 戻り値 … Folderオブジェクト
作成したフォルダのFolderオブジェクトを戻り値として返します
■例
・簡単なサンプル
①CreateFolderのサンプル
Sub CreateFolder_Sample(foldername As String, oFolder As Folder)
Dim obj As FileSystemObject
' オブジェクトを作成
Set obj = New FileSystemObject
' CreateFolder
Set folder = obj.CreateFolder(foldername)
' オブジェクトを破棄
Set obj = Nothing
End Sub
②呼び出し元関数のサンプル
Sub CallCreateFolder_Sample()
Dim foldername As String
Dim oFolder As Folder
' CreateFolderファイルパス
foldername = "E:\VBA\Sample003\Sample"
' 作成した関数を呼び出す
Call CreateFolder_Sample(foldername, oFolder)
Debug.Print oFolder.Name
' Folderオブジェクトを破棄
Set oFolder = Nothing
End Sub
③簡略化したCreateFolderのサンプル
Sub CreateFolder_Sample2(ByVal foldername As String, ByRef oFolder As Folder)
' オブジェクトを作成
With New FileSystemObject
' 作成したフォルダのFolderオブジェクトを返す
Set oFolder = .CreateFolder(foldername)
End With
End Sub
・説明
サンプルはいつも通りのFileSystemObjectオブジェクトを作成するサンプルと、簡略化したサンプルです
ただ、戻り値がオブジェクトのため、関数の引数で受け取るようにしています
その経緯については、別のメソッドのところで、書いていますが、オブジェクトは関数の戻り値ではなく、引数で返すことをお勧めしています
・再帰的に繰り返すサンプル
最初にも書きましたけど、CreateFolderメソッドはフォルダを作るメソッドですが、親フォルダがない場合は、エラーになってしまいます
その場合は、以下のサンプルのように親フォルダを確認しながら作成していきます
④再帰的に呼び出して存在しない親階層フォルダを作成するサンプル
Sub CreateFolderRecursion(foldername As String)
Dim parent As String ' 親階層
' オブジェクトを作成
With New FileSystemObject
' 親階層を取得
parent = .GetParentFolderName(foldername)
' 親階層フォルダがない場合
If (.FolderExists(parent) = False) Then
' 再帰呼び出し
Call CreateFolderRecursion(parent)
End If
' 指定階層フォルダがない場合
If (.FolderExists(foldername) = False) Then
' フォルダ作成
Call .CreateFolder(foldername)
End If
End With
End Sub
・大量フォルダを作るサンプル
1つのフォルダ内に、番号のフォルダを大量に作る場合がある場合、
①や③の関数を呼び出していては、オーバーヘッドが多くなり無駄ができます
そのため、以下のサンプルのように、FileSystemObjectの作成を1回で済ませ、CreateFolderメソッドを等も呼ぶようにします
⑤大量フォルダを作成するサンプル
Sub CreateFolderMassive(ByVal foldername As String, count As Long)
Dim sFolder As String
Dim idx As Long
' オブジェクトを作成
With New FileSystemObject
' countまでループ
For idx = 1 To count
' idxの番号でフォルダを作成する
sFolder = .BuildPath(foldername, idx)
' foldername配下にフォルダを作成
Call .CreateFolder(sFolder)
Next idx
End With
End Sub
・注意点
- 親フォルダがない場合はエラーになるので、再帰的な作成が必要
- 関数化して呼び出す場合は、戻り値のオブジェクトは引数で受け渡す
- 指定するフォルダパスは区切り文字でなくてもよい
- 呼び出し元でオブジェクトを宣言して、使用し終わったら破棄する
・その他
システムによっては、フォルダが色々な意味を成す場合があります
そのため、フォルダを作成することは、大事なのです
同じような注意点はなるべく書かないようにしていますので、他の記事も参考にしてください
ではでは