和風スパゲティのレシピ

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

MkDirとFSO.CreateFolderの違い

フォルダを作成するときに使用する、
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