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

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

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


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


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

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

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

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

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

バックアップ用のフォルダを想定します。
年、月、日
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入門
VBAでは、フォルダのファイル一覧を取得したりファイルの存在確認をする事が出来ます、Dir関数は、指定したパターン(ワイルドカード)やファイル属性と一致するファイルまたはフォルダの名前を表す文字列の値を返します。引数に指定したファイルが存在すると、そのファイル名を返し存在しないと空欄を返します。
第80回.ファイル操作Ⅰ(その他)|VBA入門
VBAではファイル操作するためのステートメントと関数が多数用意されています、VBAでファイル操作する場合は、これらの用意されたステートメントや関数を使い処理を実現します。ファイル操作で使う、ステートメントと関数 ChDriveステートメント ChDirステートメント CurDir関数 MkDirステートメント RmDirステートメント Killステートメ…

Join関数とParamArrayについては以下を参照してください。
第113回.配列に関連する関数|VBA入門
マクロVBAで配列を使う上で、必要となるVBA関数がいくつかあります。より便利に配列を活用するために必須となるVBA関数、・LBound関数 ・UBound関数 ・Array関数 ・IsArray関数 ・Join関数 ・Filter関数 以上のVBA関数について解説します。
第133回.引数の数を可変にできるパラメーター配列(ParamArray)|VBA入門
Subプロシージャー、Functionプロシージャーにおいて、引数リストの数を特定せず、不定個数の引数を渡せるよう可変にしたい場合があります。ワークシートの関数では、引数の個数が不定の関数が多数あります。=SUM(数値1,数値2,...) このように、最後が「,...」となっていて、いくつでも(限度はありますが)指定できる関数です。

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オブジェクトでは、コンピュータのファイルシステムへのアクセスが提供されています。VBAに用意されているファイル操作関連のステートメントや関数より、より強力で、より多くの機能が搭載されています。ただし機能が大変多いため、これらを全て覚えるという事は困難です。

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 ・・・新着記事一覧を見る

VBA100本ノック 18本目:名前定義の削除|VBA練習問題100(11月6日)
VBA100本ノック 17本目:重複削除(ユニーク化)|VBA練習問題100(11月6日)
VBA100本ノック 16本目:無駄な改行を削除|VBA練習問題100(11月5日)
VBA100本ノック 15本目:シートの並べ替え|VBA練習問題100(11月4日)
VBA100本ノック 14本目:社外秘シート削除|VBA練習問題100(11月3日)
VBA100本ノック 13本目:文字列の部分フォント|VBA練習問題100(11月1日)
VBA100本ノック 12本目:セル結合を解除|VBA練習問題100(10月31日)
VBA100本ノック 11本目:セル結合の警告|VBA練習問題100(10月30日)
VBA100本ノック 10本目:行の削除|VBA練習問題100(10月29日)
VBA100本ノック 9本目:フィルターコピー|VBA練習問題100(10月28日)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.マクロって何?VBAって何?|VBA入門
6.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
7.繰り返し処理(For Next)|VBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.とにかく書いてみよう(Sub,End Sub)|VBA入門
10.マクロはどこに書くの(VBEの起動)|VBA入門




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


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



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