フォルダを作成するときに使用する、
MkDirステートメントとFileSystemObject.CreateFolderメソッドの違いを解説します。
同じところ
どちらも「作成したいフォルダのパス」を受け取り、
そのフォルダを作成します。
細かい挙動もほぼ一致しており、
- 引数はこの「作成したいフォルダのパス」1つだけ
- 親フォルダを省略した場合はカレントフォルダに作成
- 相対パスで記述可
- 既にあるフォルダを選択するとエラー
- 親フォルダがないフォルダを指定するとエラー
あたりの仕様も全く同じです。
また、1000フォルダ作成しても両者とも1~2秒で完了しますので、
速度面でも気にするような差はありません。
違うところ
最も大きな違いは「CreateFolderメソッドには返り値がある」ことです。
が、この返り値は「Folderオブジェクト」というFSO上のオブジェクトであり、
FileSystemObject全体に関わる話のため、最後に追記します。
ということでまずは通常実行した場合の違いについて述べますと、
FileSystemObjectとDir系列ステートメント全般に言える違いですが、
フォルダ名にUnicode文字が混じった場合にDir系列はエラーになります。
例えば、
- ①~⑳のフォルダはMkDirステートメントでも作成できる
- ㉑~㊿のフォルダはCreateFolderメソッドでなければ作成できない
という違いになります。
セル値などのデータからフォルダ名を作成する場合はご注意ください。
また、Dir系列には「フォルダパスに255文字制限」があります。
といっても、これはWindows標準フォルダの制約と同じであり、
さらにはWorkbook.Openなども同様の制約があります。
FileSystemObjectが256文字以上のファイルパスに耐えたところで、
結局他の部分でエラーになってしまっては意味がありません。
原則フォルダ(ファイル)パスは255文字以内で運用すべきですのでご注意ください。
その他かなり細かい違いですが、
既にフォルダがあった場合のエラーメッセージが異なり
- MkDir「パス名が無効です。」
- CreateFolder「すでに同名のファイルが存在しています。」
が表示されます。
ちなみに親フォルダがない場合のエラーメッセージは「パスが見つかりません。」で、
これはどちらも同じメッセージが表示されます。
なお、FileSystemObjectを使用する以上当然のことなのですが、
Public FSO As New FileSystemObject ' または Set FSO = CreateObject("Scripting.FileSystemObject")
と、FileSystemObjectのバインディングが必要になります。
このコードを書く必要があるため、
「MkDirステートメントの方が書くのが楽(なことが多い)」
というのも、割と大事な違いです。
使い分け
フォルダ名にUnicode文字を使用する可能性がある場合は、
FileSystemObjectのCreateFolderメソッドを使用する必要があります。
そうでない場合はほとんど同じものですので、好きな方を使ってください。
単体で使うならMkDirステートメントの方が書くのが楽そうですが、
前後でファイル/フォルダ操作をしていて既にFSOオブジェクトがあるなら、
FSO.から選択入力のCreateFolderの方が、書くのが楽で統一感も出そうです。
自分の好みでない方のコードを非難するようなことをしない限り、
どちらを使ってもOKです。
FileSystemObject全体を活用するコード
前述の通り、FileSystemObjectのメソッドであるCreateFolderメソッドは、
FileSystemObjectで定義された「Folderオブジェクト」を返します。
Dim 新規フォルダ As Folder Set 新規フォルダ = FSO.CreateFolder("C:\Users\wfsp\Desktop\新規フォルダ")
簡単な活用例としては、
' カレントフォルダに新しいフォルダを作り、出来たフォルダにファイルを保存する Dim 新規フォルダ As Folder Set 新規フォルダ = FSO.CreateFolder("新規フォルダ") Workbooks("○○").SaveAs 新規フォルダ.Path & "\○○.xlsx"
と、プロパティ「.Path」を用いて作ったフォルダのパスを調べたり、
このあとこのフォルダに保存したファイルを再度見に行く際に、
For Each 作成ファイル In 新規フォルダ.Files
と、Filesプロパティを使って、Fileオブジェクトを調べていくことも可能です。
このようにFSOは「フォルダ/ファイルをオブジェクトとして扱える」のが特長です。
- フォルダパスで動かす分にはDir系列とFSOはあまり変わらない
- Folder/Fileオブジェクトを扱えることがFSOのメリット
というのが、Dir系列とFileSystemObjectの違いになります。
この違いの詳しい解説はこちらの記事をどうぞ。
www.limecode.jp