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

ExcelマクロVBAの実用サンプル、エクセルVBA集と解説
公開日:2020-07-31 最終更新日: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にインポートする
多階層フォルダ(ディレクトリ)の作成
漢数字→数値変換:漢数字=NUMBERSTRING(数値,1)


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

AIは便利なはずなのに…「AI疲れ」が次の社会問題になる|生成AI活用研究(2026-02-16)
カンマ区切りデータの行展開|エクセル練習問題(2026-01-28)
開いている「Excel/Word/PowerPoint」ファイルのパスを調べる方法|エクセル雑感(2026-01-27)
IMPORTCSV関数(CSVファイルのインポート)|エクセル入門(2026-01-19)
IMPORTTEXT関数(テキストファイルのインポート)|エクセル入門(2026-01-19)
料金表(マトリックス)から金額で商品を特定する|エクセル練習問題(2026-01-14)
「緩衝材」としてのVBAとRPA|その終焉とAIの台頭|エクセル雑感(2026-01-13)
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.マクロとは?VBAとは?VBAでできること|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.メッセージボックス(MsgBox関数)|VBA入門




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


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.



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