【EXCEL:VBA】一括で大量にフォルダを作成したい

指定したフォルダを作成したい

この記事では、EXCELでフォルダを一気に大量に作成する方法について説明しています。

 

一度EXCELに作成したいフォルダリストを入力しておけば、何度でもフォルダを作成することができます。

 

 

しかも、作成するベースフォルダを変えて実行すれば、同じ階層のフォルダを何度でも作ることができます。

 

フォルダを1つ1つ間違わずに作るのって、結構時間もかかるし、ストレスが発生します。

 

 

それでは、EXCELで指定したフォルダリストをもとに、大量のフォルダを作成していきましょう。

 

困っている女性

毎月、大量のフォルダを作成するのが地味に大変なの・・・、わかる!?

困っている女性

しかも、作るフォルダは階層が深くて、間違いそうなの。

困っている女性

たまに、フォルダ名を間違って上司から怒られるの・・・。
それなら、VBAを使えばボタン1つ押すだけで、大量のフォルダも深い階層のフォルダも一気に作ることができるよ。

解決する男性

困っている女性

それそれ、早く教えてよ。

 

◆似たような作業で、フォルダ一覧を取得する方法については、以下の記事を参照してください。

【EXCEL:VBA】指定したフォルダに存在するファイル一覧を取得したい

 

 

フォルダ作成ツールに必要なものを、1つ1つ順番に説明していきます。

1.ベースフォルダ指定欄、フォルダリスト入力欄を準備する

まず、ベースとなるフォルダを指定する欄とそのベースフォルダの下に作成したいフォルダリストを書き込む欄を作成します。

「ファイル作成」シートを作成する

フォルダ作成シートを作成する

フォルダ作成シートを作成する

  1. 「フォルダ作成」という名前のシートを作成します。
  2. 1行目に「ベースフォルダ」のタイトル行を作成します。
  3. 2行目に「ベースフォルダ」を入力する欄を作成します。
  4. 3行目に「NO」、「フォルダ名」のタイトル行を作成します。
  5. 4行目以降は、作成したいフォルダリストを書き込む欄になります。

 

4行目以降の「NO」、「フォルダ名」は作成したいフォルダを入力していきましょう。

 

2.VBAでフォルダを作成する機能を記入する

「Microsoft Visual Basic for Applications」を起動します。

VBAプログラムを記入する

VBAプログラムを記入する

 

標準モジュールを追加して、以下のソースを書きます。

Public Sub MainProc()
    Dim sht As Worksheet
    Dim fso As Object
    Dim baseFld As String
    Dim tmpFld As String
    Dim flds() As String
    Dim nowRow As Long
    Dim i As Integer
    
    '①参照するシートを変数に格納する
    Set sht = ThisWorkbook.Sheets("フォルダ作成")
    
    '②ベースフォルダを変数に格納する
    baseFld = sht.Range("A2")
    
    '③FileSystemObjectを変数に格納する
    Set fso = CreateObject("Scripting.FileSystemObject")
     
    nowRow = 3
    
    Do While True
        
        '④現在行を次の行に変更する
        nowRow = nowRow + 1
        
        '⑤NO列が空なら処理を抜ける
        If sht.Range("A" & nowRow) = "" Then
            Exit Do
        End If
        
        '⑥作成対象フォルダパスを\マーク毎に分割して配列に格納する
        flds = Split(sht.Range("B" & nowRow), "\")
    
        tmpFld = baseFld
        For i = 0 To UBound(flds)
        
            '⑦フォルダパス文字列を上位階層から作成する
            tmpFld = tmpFld & "\" & flds(i)
            
            '⑧フォルダが存在しないかチェックする
            If fso.FolderExists(tmpFld) = False Then
                
                '⑨フォルダを作成する
                fso.CreateFolder (tmpFld)
            
            End If
        Next
    Loop
 
    '⑩FileSystemObjectをクリアする
    Set fso = Nothing
    
    MsgBox "完了"
End Sub

 

最後にEXCELを「◯◯◯.xlsm」というような感じでマクロ有効ブック形式で保存します。

 

3.フォルダを作成する機能の使い方

それでは、フォルダを大量に作成する方法を説明します。

 

まず、A2セルにベースとなるフォルダパスを入力します。

次に、4行目以降にNOとフォルダ名を入力します。

NO列が入力されている行までを対象として、フォルダ作成しますので、連番でもなんでもいいので入力してください。

フォルダ名に入力したフォルダは、ベースフォルダで指定したフォルダ配下に作成します。

 

フォルダ作成の動かし方

フォルダ作成の動かし方

次に、「開発」タブの「マクロ」をクリックします。

 

実行ボタンをクリックする

実行ボタンをクリックする

 

先程作成した自作関数「MainProc」が一覧に表示されていますので、選択します。

次に、「実行」ボタンをクリックしてフォルダを作成します。

 

しばらく待つと、ベースフォルダ配下に、4行目以降に入力したフォルダが作成されます。

作成されたフォルダ

作成されたフォルダ

 

4.フォルダを作成するVBAプログラムの説明

それでは、VBAプログラムを説明します。

①参照するシートを変数に格納する

'①参照するシートを変数に格納する
Set sht = ThisWorkbook.Sheets("フォルダ作成")

ここでは、このあとの処理で何度も使う「フォルダ作成」シートを変数に格納しています。

そうすることにより、入力するプログラムを短くすることができるからです。

何度も「ThisWorkbook.Sheets(“フォルダ作成”)」と入力するより、「sht」と入力するほうが少なくてすむからです。

 

②ベースフォルダを変数に格納する

'②ベースフォルダを変数に格納する
baseFld = sht.Range("A2")

ここでは、A2セルに入力されているベースフォルダを変数に格納しています。

このあとの処理で、何度もベースフォルダを使うからです。

 

③FileSystemObjectを変数に格納する

'③FileSystemObjectを変数に格納する
Set fso = CreateObject("Scripting.FileSystemObject")
     
nowRow = 4

For Each f In fso.GetFolder(sht.Range("A2")).Files

ここでは、「FileSystemObject」オブジェクトを変数に格納して、このあとの処理で利用できるようにします。

「FileSystemObject」はファイル操作やフォルダ操作をVBAで行うときに大変お世話になる便利なライブラリです、覚えておくと良いです。

 

④現在行を次の行に変更する

'④現在行を次の行に変更する
nowRow = nowRow + 1

ここでは、現在行を次の行に変更するため、変数「nowRow」に格納している値+1を、変数「nowRow」に格納しています。

ループ処理の外側で、変数「nowRow」には3が格納されています。

フォルダ一覧は、4行目から入力するので、ループ処理の内側に入ったときに変数「nowRow」を+1して、4を格納します。

もちろん、ループしてくると、さらに+1されて5が格納されます。

というように、4行目以降のフォルダ名を取得します。

 

⑤NO列が空なら処理を抜ける

'⑤NO列が空なら処理を抜ける
If sht.Range("A" & nowRow) = "" Then
    Exit Do
End If

ここでは、A列(NO)に値が入力されているかチェックします。

変数「nowRow」に4が格納されている場合、セルA4に値が入力されているかチェックします。

A列に値が入力されていない行まで上から順次チェックしていき、空のA列が見つかるとフォルダ作成処理を終わらせます。

 

⑥作成対象フォルダパスを\マーク毎に分割して配列に格納する

'⑥作成対象フォルダパスを\マーク毎に分割して配列に格納する
flds = Split(sht.Range("B" & nowRow), "\")

ここでは、B列(フォルダ名)に入力されている値を\マーク毎に分割して、配列「flds」に格納します。

このあとのフォルダ作成で、上位階層のフォルダを1つ1つ指定する必要があるためです。

※上記では「\」になっていますが、正しくは半角の「¥」です、ご注意ください。

 

⑦フォルダパス文字列を上位階層から作成する

'⑦フォルダパス文字列を上位階層から作成する
tmpFld = tmpFld & "\" & flds(i)

ここでは、フォルダパスを分割して格納した配列「flds」から1つずつフォルダ名を取得して、作成するフォルダパスを変数「tmpFld」に格納します。

 

⑧フォルダが存在しないかチェックする

'⑧フォルダが存在しないかチェックする
If fso.FolderExists(tmpFld) = False Then

ここでは、変数「tmpFld」に格納されているフォルダパスがすでに存在しているかチェックしています。

「fso.FolderExists」にフォルダパスを渡すと、フォルダが既に存在する場合TRUEを、フォルダが存在しない場合FALSEを返してきます。

すでに存在するフォルダを作成する必要はないからです。

 

⑨フォルダを作成する

'⑨フォルダを作成する
fso.CreateFolder (tmpFld)

ここでは、メイン処理となるフォルダ作成を行っています。

変数「tmpFld」に格納されているフォルダパスを作成します。

 

⑩FileSystemObjectをクリアする

'⑩FileSystemObjectをクリアする
Set fso = Nothing

ここでは、これまで使ってきた「FileSystemObject」をクリアしています。

 

それでは、フォルダ作成するツールを作って、作業を効率化してみましょう。

 

以上です。

 

最後まで読んでいただきありがとうございました。
この記事をシェアしていただけると喜びます。

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です