VBAサンプル集
多階層フォルダ(ディレクトリ)の作成

ExcelマクロVBAの実用サンプル、エクセルVBA集と解説
最終更新日:2020-08-02

多階層フォルダ(ディレクトリ)の作成


フォルダを作成する場合、親フォルダの下にサブフォルダ作成します。


VBAでフォルダを作成するには、MkDirステートメントまたはFileSystemObjectを使用しますが、
これらは、親のフォルダから順次作成していく必要があります。

Win32 APIを使用することで、多階層フォルダを一括で作成する事もできます。

多階層フォルダ(ディレクトリ)の作成について、大きく3通り説明します。
MkDirステートメント
FileSystemObject
Win32 API(SHCreateDirectoryEx,MakeSureDirectoryPathExists)

フォルダの削除については以下を参照してください。
フォルダ(サブフォルダも全て)削除する、Optionでファイルのみ削除
VBAでフォルダを削除するにはRmDirステートメントを使いますが、サブフォルダやファイルが入っている場合は、RmDirはエラーとなります。そこで、サブフォルダやファイルがある場合は、FileSystemObjectを使います。以下のサンプル使用時には、「ツール」→「参照設定」で、「MicrosoftScripti…

多階層フォルダ(ディレクトリ)の作成 の具体例

バックアップ用のフォルダを想定します。
年、月、日
3階層のフォルダで管理するとします。

マクロ VBA 多階層フォルダ ディレクトリ

このフォルダを自動で日々作成していく場合のVBAになります。



Sub sample()
  Dim root As String
  Dim yyyy As String
  Dim mm As String
  Dim dd As String
  
  root = "C:\backup"
  yyyy = Format(Year(Date), "0000年")
  mm = Format(Month(Date), "00月")
  dd = Format(Day(Date), "00日")
  
  Dim rtn As Long
  rtn = CreateDirectory(root, yyyy, mm, dd)
  Select Case rtn
    Case 0
      MsgBox "フォルダを作成しました。"
    Case 1
      MsgBox "フォルダは存在します。"
    Case Else
      MsgBox "フォルダの作成に失敗しました。"
  End Select
End Sub

上記のVBAで使用する関数FunctionのサンプルVBAになります。
以下は、CreateDirectoryのそれぞれのVBAコードになります。

Dir関数とMkDirステートメントで多階層フォルダの作成

Function CreateDirectory(ParamArray arg()) As Long
  On Error GoTo ErrExit
  If Dir(Join(arg, "\"), vbDirectory) <> "" Then
    CreateDirectory = 1
    Exit Function
  End If
  
  Dim ary As Variant
  Dim i As Long
  For i = LBound(arg) To UBound(arg)
    ary = arg
    ReDim Preserve ary(i)
    If Dir(Join(ary, "\"), vbDirectory) = "" Then
      MkDir Join(ary, "\")
    End If
  Next
  
  CreateDirectory = 0
  Exit Function
  
ErrExit:
  CreateDirectory = 9
End Function

Dir関数とMkDirステートメントの詳細は以下を参照してください。
第79回.ファイル操作Ⅰ(Dir)|VBA入門
・Dir関数 ・Dir関数の使用例 ・Dir関数の実践例 ・Dir関数の制限について ・Dir関数の関連記事
第80回.ファイル操作Ⅰ(その他)|VBA入門
・ファイル操作で使う、ステートメントと関数 ・ファイル操作の使用例 ・ファイル操作の実践例 ・ファイル操作について

Join関数とParamArrayについては以下を参照してください。
第113回.配列に関連する関数|VBA入門
・LBound関数とUBound 関数 ・Array関数 ・IsArray 関数 ・Join関数 ・Filter関数 ・Eraseステートメント
第133回.引数の数を可変にできるパラメーター配列(ParamArray)|VBA入門
・引数の構文 ・名前付き引数について ・ParamArrayキーワード(パラメーター配列)とは ・ParamArrayキーワード(パラメーター配列)の使用例 ・サイト内の関連ページ

FileSystemObjectで多階層フォルダの作成

Function CreateDirectory(ParamArray arg()) As Long
  On Error GoTo ErrExit
  
  Dim fso As Object
  Set fso = CreateObject("Scripting.FileSystemObject")
  If fso.FolderExists(Join(arg, "\")) Then
    CreateDirectory = 1
    Set fso = Nothing
    Exit Function
  End If
  
  Dim ary As Variant
  Dim i As Long
  For i = LBound(arg) To UBound(arg)
    ary = arg
    ReDim Preserve ary(i)
    If Not fso.FolderExists(Join(ary, "\")) Then
      Call fso.CreateFolder(Join(ary, "\"))
    End If
  Next
  
  Set fso = Nothing
  CreateDirectory = 0
  Exit Function
  
ErrExit:
  CreateDirectory = 9
End Function

FileSystemObjectの詳細については以下を参照してください。
第119回.ファイルシステムオブジェクト(FileSystemObject)|VBA入門
・FileSystemObjectオブジェクトの使用方法 ・FileSystemObjectオブジェクトのプロパティとメソッド ・FileSystemObjectオブジェクトのメソッドの戻り値 ・FileSystemObjectオブジェクトの使用例 ・FileSystemObjectオブジェクトの関連記事と実践例

Win32 APIで多階層フォルダの作成

SHCreateDirectoryEx



Declare PtrSafe Function SHCreateDirectoryEx Lib "shell32" _
  Alias "SHCreateDirectoryExA" _
  (ByVal hwnd As LongPtr, _
   ByVal pszPath As String, _
   ByVal psa As LongPtr) As Long

hwnd
親ウィンドウへのハンドル。ユーザーインターフェイスが表示されない場合は、このパラメーターをNULLに設定できます。
pszPath
ディレクトリーの完全修飾パスを指定するヌル終了ストリングへのポインター。
最大248文字です。
psa
ディレクトリのセキュリティ属性を持つSECURITY_ATTRIBUTES構造へのポインタ。
セキュリティー属性を設定する必要がない場合は、このパラメーターをNULLに設定してください。
戻り値
0 : 正常にフォルダが作成された場合
183 : フォルダが既に存在している場合
その他 : 何らかのエラーが発生した場合

Win32 APIの詳細および性格な情報についてはMicrosoftの技術情報を参照してください。

Function CreateDirectory(ParamArray arg()) As Long
  Dim rtn As Long
  rtn = SHCreateDirectoryEx(0&, Join(arg, "\"), 0&)
  Select Case rtn
    Case 0
      CreateDirectory = 0
    Case 183
      CreateDirectory = 1
    Case Else
      CreateDirectory = rtn
  End Select
End Function

MakeSureDirectoryPathExists

Declare PtrSafe Function MakeSureDirectoryPathExists Lib "imagehlp" _
  (ByVal lpPath As String) As Long

lpPath
有効なパス名。
最大248文字です。
パスの最後がファイル名ではなくディレクトリである場合、文字列はバックスラッシュ(\)文字で終了する必要があります。

戻り値
1 : 関数が成功した場合
0 : 関数が失敗した場合

Win32 APIの詳細および性格な情報についてはMicrosoftの技術情報を参照してください。

Function CreateDirectory(ParamArray arg()) As Long
  Dim fso As Object
  Set fso = CreateObject("Scripting.FileSystemObject")
  If fso.FolderExists(Join(arg, "\")) Then
    CreateDirectory = 1
    Set fso = Nothing
    Exit Function
  End If
  
  Dim rtn As Long
  rtn = MakeSureDirectoryPathExists(Join(arg, "\") & "\")
  If rtn = 1 Then
    CreateDirectory = 0
  Else
    CreateDirectory = 9
  End If
End Function

MakeSureDirectoryPathExistsはフォルダが存在しても関数自体が成功として0が戻ります。
そこで上記VBAでは、フォルダの存在確認はFileSystemObjectを使用しています。

最後が\で終わっていない場合、最後の\の前までのフォルダが作成されます。
"C:\backup\2020年\07月\31日"
この場合は、最後の"31日"は作成されません。
つまり、"フルパス+ファイル名"これで指定してフォルダを作成できるという事になります。



同じテーマ「マクロVBAサンプル集」の記事

ハイパーリンクからファイルのフルパスを取得する
ボタンに表示されているテキストを取得(Application.Caller)
Excelの表をPowerPointへ図として貼り付け
VBAで表やグラフをPowerPointへ貼り付ける
フォルダ(サブフォルダも全て)削除する、Optionでファイルのみ削除
Shift_JISのテキストファイルをUTF-8に一括変換
VBAコードの全プロシージャー・プロパティ一覧を取得
数式バーの高さを数式の行数で自動設定
図形オートシェイプ(Shape)の複数選択
GoogleスプレッドシートをExcelにインポートする
多階層フォルダ(ディレクトリ)の作成


新着記事NEW ・・・新着記事一覧を見る

数字(1~50)を丸付き数字に変換するVBA|VBA技術解説(2022-11-15)
TEXTAFTER関数(テキストの指定文字列より後ろの部分を返す)|エクセル入門(2022-11-14)
TEXTBEFORE関数(テキストの指定文字列より前の部分を返す)|エクセル入門(2022-11-14)
TEXTSPLIT関数(列と行の区切り記号で文字列を分割)|エクセル入門(2022-11-12)
LAMBDA以降の新関数はVBAで使えるか|VBA技術解説(2022-11-11)
WRAPCOLS関数(1次元配列を指定数の列で折り返す)|エクセル入門(2022-11-08)
WRAPROWS関数(1次元配列を指定数の行で折り返す)|エクセル入門(2022-11-08)
EXPAND関数(配列を指定された行と列に拡張する)|エクセル入門(2022-11-07)
TAKE関数(配列の先頭/末尾から指定行/列数を取得)|エクセル入門(2022-11-06)
DROP関数(配列の先頭/末尾から指定行/列数を除外)|エクセル入門(2022-11-06)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.Excelショートカットキー一覧|Excelリファレンス
7.並べ替え(Sort)|VBA入門
8.エクセルVBAでのシート指定方法|VBA技術解説
9.マクロって何?VBAって何?|VBA入門
10.ExcelマクロVBAの基礎を学習する方法|エクセルの神髄




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ