【ExcelVBA】2階層以上のフォルダを作成する

この記事では、2階層以上のフォルダを作成する方法についてご説明します。

【動画】2階層以上のフォルダを作成する実際の動き

本題に入る前に、まずは次の動画をご覧ください。


2階層以上のフォルダを作成する方法は3つありますが、その3つそれぞれの方法を使って2階層以上のフォルダを作成しています。

【補足】フォルダを作成するMkDirステートメントやfso.CreateFolderメソッドは単一のフォルダしか作成できない

フォルダを作成するMkDirステートメントやfso.CreateFolderメソッドは単一のフォルダしか作成できません。

どういうことかというと、例えば「C:\work\temp」というフォルダ配下に「test1¥test2¥test3¥test4」という4階層のフォルダを作成したいとします。
(作成後は「C:¥work¥temp¥test1¥test2¥test3¥test4」といったフォルダになります)

【参考】「C:\work\temp」というフォルダ

【参考】「test1¥test2¥test3¥test4」という4階層のフォルダ作成時

以上のように「C:\work\temp」というフォルダ配下に「test1¥test2¥test3¥test4」という4階層のフォルダを作成したい時に、フォルダを作成するMkDirステートメントやfso.CreateFolderメソッドを1回実行しただけでは作成できません。

MkDirステートメントやfso.CreateFolderメソッドの引数に「C:¥work¥temp¥test1¥test2¥test3¥test4」を指定して実行してもエラーになります。

【参考】MkDirステートメントの引数に4階層のフォルダを指定して実行後エラー

【参考】fso.CreateFolderメソッドの引数に4階層のフォルダを指定して実行後エラー

ではどうやってMkDirステートメントやfso.CreateFolderメソッドで2階層以上のフォルダを作成するのかというと、1階層ずつフォルダを作成するようMkDirステートメントやfso.CreateFolderメソッドを実行し、その後に再びMkDirステートメントやfso.CreateFolderメソッドを実行して1階層下にフォルダを一つ作る…と処理を繰り返さなければなりません。

今回の例のように4階層のフォルダを作成するには、MkDirステートメントやfso.CreateFolderメソッドを4回繰り返す必要があります。

ただし、API関数SHCreateDirectoryExは例外です。

フォルダを作成するAPI関数SHCreateDirectoryExは1回の実行で2階層以上のフォルダを作成することができる

フォルダを作成するAPI関数SHCreateDirectoryExは1回の実行で2階層以上のフォルダを作成することができます。

4階層のフォルダを作成するのにMkDirステートメントやfso.CreateFolderメソッドは4回の実行を繰り返す必要がありますが、API関数SHCreateDirectoryExなら1回の実行だけで4階層のフォルダを作成することができるのでとても便利です。

コードの例

Excelのマクロのコード(例)

以下の3つの方法について、Excelのマクロのコードをご紹介します。

  1. MkDirステートメントを使って2階層以上のフォルダを作成
  2. fso.CreateFolderメソッドを使って2階層以上のフォルダを作成
  3. API関数SHCreateDirectoryExを使って2階層以上のフォルダを作成

①MkDirステートメントを使って2階層以上のフォルダを作成

Option Explicit

Sub test()

    Dim folders() As String     '作成するフォルダ(フル)
    Dim mkfolder As Variant     '作成するフォルダ(単一)
    Dim dirStr As String        '作成先のフォルダ
    
    '作成先のフォルダ
    dirStr = "C:\work\temp"
    
    '作成するフォルダ
    folders = Split("test1\test2\test3\test4", "\")
    
    For Each mkfolder In folders
    
        'フォルダを作成する
        MkDir dirStr & "\" & mkfolder
        
        'フォルダ作成後に次に作成したいフォルダを取得する
        dirStr = dirStr & "\" & mkfolder
    
    Next mkfolder

End Sub

10行目では作成先のフォルダを指定しています。

13行目では作成する4階層のフォルダを指定しています。

13行目のsplit関数で、4階層のフォルダを4つに分解し、配列「folders」に格納しています。

分解された4階層のフォルダは「test1」「test2」「test3」「test4」の4つになります。

この4つのフォルダを18行目のMkDirステートメントで一つずつ作成先のフォルダに作成していきます。

フォルダを作成したら、その作成したフォルダに次の階層のフォルダを21行目で指定して作成します。

4階層のフォルダを作成するため4回繰り返すのに、15行目でfor eachステートメントを使っています。

②fso.CreateFolderメソッドを使って2階層以上のフォルダを作成

Option Explicit

Sub test()

    Dim fso             As Object       'FileSystemObjectのインスタンス用変数
    Dim folders()       As String       '作成するフォルダ(フル)
    Dim mkfolder        As Variant      '作成するフォルダ(単一)
    Dim dirStr          As String       '作成先のフォルダ
    
    'FileSystemObjectのインスタンスを生成する
    Set fso = New FileSystemObject
    
    '作成先のフォルダ
    dirStr = "C:\work\temp"
    
    '作成するフォルダ
    folders = Split("test1\test2\test3\test4", "\")
        
    For Each mkfolder In folders
        
        'fso.CreateFolderメソッドを使ってフォルダを作成する
        fso.CreateFolder dirStr & "\" & mkfolder
        
        'フォルダ作成後に次に作成したいフォルダを取得する
        dirStr = dirStr & "\" & mkfolder
    
    Next mkfolder
    
    Set fso = Nothing
    
End Sub

14行目では作成先のフォルダを指定しています。

17行目では作成する4階層のフォルダを指定しています。

17行目のsplit関数で、4階層のフォルダを4つに分解し、配列「folders」に格納しています。

分解された4階層のフォルダは「test1」「test2」「test3」「test4」の4つになります。

この4つのフォルダを22行目のfso.CreateFolderメソッドで一つずつ作成先のフォルダに作成していきます。

フォルダを作成したら、その作成したフォルダに次の階層のフォルダを25行目で指定して作成します。

4階層のフォルダを作成するため4回繰り返すのに、19行目でfor eachステートメントを使っています。

③API関数SHCreateDirectoryExを使って2階層以上のフォルダを作成

Option Explicit

'階層化されたフォルダを一気に作成するAPI関数
Private Declare PtrSafe Function SHCreateDirectoryEx Lib "shell32" Alias _
                                "SHCreateDirectoryExA" ( _
                                ByVal hwnd As Long, _
                                ByVal pszPath As String, _
                                ByVal psa As Long) As Long

Sub test()

    Dim folders As String       '作成するフォルダ(フル)
    Dim dirStr As String        '作成先のフォルダ
        
    '作成先のフォルダ
    dirStr = "C:\work\temp"
    
    '作成するフォルダ
    folders = "test1\test2\test3\test4"
        
    'フォルダを作成する
    Call SHCreateDirectoryEx(0&, dirStr & "\" & folders, 0&)
    
End Sub

16行目では作成先のフォルダを指定しています。

19行目では作成する4階層のフォルダを指定しています。

22行目では、作成先のフォルダと作成する4階層のフォルダを「¥」でつなげてAPI関数SHCreateDirectoryExの第2引数に指定しています。

API関数SHCreateDirectoryExを実行することで4階層のフォルダを作成することができます。

API関数SHCreateDirectoryExは、MkDirステートメントやfso.CreateFolderメソッドのように2階層以上のフォルダを作成するのに繰り返し実行する必要はありません。

また、API関数SHCreateDirectoryExを使うには、4行目から8行目の通りにAPI関数SHCreateDirectoryExの宣言文を記述しないといけません。

宣言文を記述しないでAPI関数SHCreateDirectoryExを実行しようとしてもエラーとなってしまい使うことができないので、宣言文の記述を忘れないようにしましょう。

動作確認

マクロ実行前

マクロを実行する前のフォルダ。「C:\work\temp」のフォルダ内に、「test1¥test2¥test3¥test4」という4階層のフォルダを作成します。

マクロ実行後

マクロを実行した結果、「C:\work\temp」のフォルダ内に、「test1¥test2¥test3¥test4」という4階層のフォルダが作成されました。

【注意】参照設定が必要です

一つ注意点があるのですが、先ほどの「fso.CreateFolderメソッドを使って2階層以上のフォルダを作成」する方法の説明で紹介したコードを動かすには参照設定が必要です。

参照設定の一覧(下の画像を参考)から次の項目(ライブラリ)にチェックを付けて「OK」ボタンをクリックします。

  1. Windows Script Host Object Model(wshom.ocx)

なぜ必要かというと、Excelのマクロのコードの11行目の「FileSystemObject」というオブジェクトが「wshom.ocx」というファイルを参照するからです。

    'FileSystemObjectのインスタンスを生成する
    Set fso = New FileSystemObject

この参照設定をしないと下の画像のエラーが出ますので必ず行う必要があります。

ここでは「wshom.ocx」とは何者かについては記事の本題から逸れてしまうので詳細は割愛しますが、マクロで「wshom.ocx」というオブジェクトを使う場合は参照設定しないと動かない、程度に思って頂ければと思います。

最後に

本記事では、2階層以上のフォルダを作成する方法についてご説明しました。

2階層以上のフォルダを作成するには次の3つの方法があります。

  1. MkDirステートメントを使って2階層以上のフォルダを作成
  2. fso.CreateFolderメソッドを使って2階層以上のフォルダを作成
  3. API関数SHCreateDirectoryExを使って2階層以上のフォルダを作成

2階層以上のフォルダを作成する場合は参考にしてみてくださいね。

プログラミングのスキルを習得するなら

プログラミングのスキルを習得したい、今のスキルをもっと高めたい、そう考えているなら「プログラミングスクール」がおすすめです。

プログラミングのスキルの基礎を身につけるなら「TechAcademy」で1週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。

→ TechAcademyの「1週間 無料体験」はこちら