【ExcelVBA】Excelの表の通りにフォルダを作成するには

この記事では、Excelの表の通りにフォルダを作成する方法についてご説明します。

【動画】Excelの表の通りにフォルダを作成する実際の動き

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


表のセルに入力された文字列を元にMkDirステートメントを実行してフォルダを作成します。

フォルダの作成は、表の数、表の列の数に合わせて行い、ブランクのセルはMkDirステートメントは実行しません。

マクロ作成の流れ

STEP.1
作成したいフォルダ名が入力されている表の範囲を取得する
作成したいフォルダ名が入力されている表の範囲を取得します。
STEP.2
STEP.1で取得した表の範囲にあるセル全ての値を取得してフォルダを作成する
STEP.1で取得した表の範囲にあるセル全ての値を取得してフォルダを作成します。
セルに値が入っていない場合(ブランク)は何もしません。

Excelファイルの例

今回は次のExcelファイルを用意しました。

セルA2(黄色のセル)には、フォルダを作成したいトップのフォルダを指定します。

このトップのフォルダに、作成したいフォルダが作成されます。

4行目からの表が、作成したフォルダを入力するセルです。

この表に入力された文字列がフォルダ名で使われてフォルダが作成されます。

セルが空白(ブランク)の場合はフォルダ作成処理は行いません。

コードの例

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

Option Explicit

Sub test()

    Dim rowPos      As Integer      '表のデータの先頭行用変数
    Dim rng         As Range        'Rangeオブジェクト格納用変数
    Dim tableLstRow As Integer      '表の最終行
    Dim tableLstCol As Integer      '表の最後列
    Dim refFolder   As String       '参照しているフォルダ
    Dim cellVal     As String       'セルの値格納用変数
    Dim rowCnt      As Integer      'カウンタ(行用)
    Dim colCnt      As Integer      'カウンタ(列用)
        
    'トップフォルダのパスを取得する
    refFolder = Worksheets("work").Range("topFlder")
    
    '表のデータの先頭行を取得する
    rowPos = 5
    
    '表の最終行
    tableLstRow = Worksheets("work").Range("A" & rowPos).End(xlDown).Row
    
    '表の最後列
    tableLstCol = Worksheets("work").Range("A" & rowPos - 1).End(xlToRight).Column
    
    '表の範囲を取得する
    Set rng = Worksheets("work").Range(Cells(rowPos, 1), Cells(tableLstRow, tableLstCol))
    
    '表のデータ行の数分ループさせるFor文
    For rowCnt = 1 To rng.Rows.Count
        
        '表のデータの列数分ループさせるFor文
        For colCnt = 1 To tableLstCol
        
            If Dir(refFolder & "\" & rng.Value2(rowCnt, colCnt), vbDirectory) = "" Then
            
                'セルの値と同じ名前のフォルダが存在しない場合
            
                'フォルダを作成する
                MkDir refFolder & "\" & rng.Value2(rowCnt, colCnt)
            
            End If
            
            '(フォルダ作成をしたらその)作成したフォルダを、次のフォルダの作成先に設定する
            refFolder = refFolder & "\" & rng.Value2(rowCnt, colCnt)
                    
            DoEvents
    
        Next colCnt

        '表の1行分フォルダを作成し終わったら、トップフォルダのパスを再設定する
        refFolder = Worksheets("work").Range("topFlder")

    Next rowCnt

End Sub

注目すべきコード①

最初に見て頂きたいのは18行目から27行目です。

    '表のデータの先頭行を取得する
    rowPos = 5
    
    '表の最終行
    tableLstRow = Worksheets("work").Range("A" & rowPos).End(xlDown).Row
    
    '表の最後列
    tableLstCol = Worksheets("work").Range("A" & rowPos - 1).End(xlToRight).Column
    
    '表の範囲を取得する
    Set rng = Worksheets("work").Range(Cells(rowPos, 1), Cells(tableLstRow, tableLstCol))

以上のコードは、フォルダ名が入力された表の最終行と最後列を取得して表の範囲を取得している処理のコードです。

事前に表が何行目から始まっているのか18行目で取得し(今回のサンプルでは5(行目)で指定)、21行目で最終行、24行目で最後列を取得します。

最終行と最後列が取得出来たら、表のデータの先頭行、最終行、最後列を使って表の範囲を27行目で取得します。

注目すべきコード②

次に見て頂きたいのは30行目です。

    '表のデータ行の数分ループさせるFor文
    For rowCnt = 1 To rng.Rows.Count

以上のコードは、表のデータ行の数分ループさせるFor文です。

もし表のデータ行が20行ある場合は20回ループさせます。

注目すべきコード③

次に見て頂きたいのは33行目です。

        '表のデータの列数分ループさせるFor文
        For colCnt = 1 To tableLstCol

以上のコードは、表のデータの列数分ループさせるFor文です。

もし表のデータ列が3列ある場合は3回ループさせます。

注目すべきコード④

次に見て頂きたいのは35行目から42行目です。

            If Dir(refFolder & "\" & rng.Value2(rowCnt, colCnt), vbDirectory) = "" Then
            
                'セルの値と同じ名前のフォルダが存在しない場合
            
                'フォルダを作成する
                MkDir refFolder & "\" & rng.Value2(rowCnt, colCnt)
            
            End If

以上のコードは、表のセルの値と同じ名前のフォルダが存在しないかを判定し、存在しない場合はフォルダを作成する処理です。

35行目で表のセルの値と同じ名前のフォルダが存在しないかを判定し、存在しない場合は40行目でフォルダを作成します。

注目すべきコード⑤

次に見て頂きたいのは45行目です。

            '(フォルダ作成をしたらその)作成したフォルダを、次のフォルダの作成先に設定する
            refFolder = refFolder & "\" & rng.Value2(rowCnt, colCnt)

以上のコードは、フォルダの作成先を変更するコードです。

一度フォルダを作成したら、次はそのフォルダの配下にフォルダを作成したいので、フォルダ作成後はフォルダの作成先を変更します。

例えば今回のサンプルで説明すると、「C:¥work¥10_勉強¥10_VBA関連¥0186¥test」の配下に「work」というフォルダを作成したら、次はその「work」というフォルダの下にフォルダを作成します。

なので、今回のサンプルの場合次のフォルダの作成先は「C:¥work¥10_勉強¥10_VBA関連¥0186¥test¥work」にしたいので、変数「refFolder」には「C:¥work¥10_勉強¥10_VBA関連¥0186¥test¥work」を格納します。

なお、このコードは最下層のフォルダを作成するまでは行う必要があります。

注目すべきコード⑥

次に見て頂きたいのは51行目です。

        '表の1行分フォルダを作成し終わったら、トップフォルダのパスを再設定する
        refFolder = Worksheets("work").Range("topFlder")

以上のコードは、フォルダの作成先をトップのフォルダに再設定する処理です。

最下層のフォルダまで作成したら、次はトップのフォルダからまたフォルダを作成していくので、フォルダの作成先をトップのフォルダに再設定する必要があります。

動作確認

マクロ実行前

今回はExcelファイルの例のexcelファイルを使います。

マクロ実行後

マクロ実行後は、下の画面の通りにフォルダが作成されます。

最後に

本記事では、Excelの表の通りにフォルダを作成する方法についてご説明しました。

フォルダ構成を考えたけど一つ一つフォルダを作成するのは面倒…と考えているときは、今回の記事を参考にすると一括でフォルダを作成することができるので参考にしてみてくださいね。

Excelのスキル向上やExcelの基礎知識をしっかりと学びたいなら

Excelのスキルを習得したい、Excelの基礎知識をもっと理解したい、そう考えているなら「無期限サポート付きExcel講座【すごい改善】」がおすすめです。

Excelのスキルの基礎を身につけるなら【すごい改善】で無期限サポート付きがあるので、これで「Excelのスキルや基礎」を学ぶのにおすすめですよ。

→ 受講後、何度でも無期限でメールで質問できるアフターサポートがついているExcelマスター講座はこちら