Excel VBAは、日々の事務作業を効率化する強力なツールです。特に、フォルダ作成という繰り返し発生するタスクを自動化することで、大幅な時間節約が可能になります。本記事では、Excel VBAを使用して指定された要件に基づくフォルダ作成スクリプトの作成方法を紹介します。このスクリプトは、指定されたパスにワークシートのデータを基にフォルダを作成し、ユーザーがフォルダの作成場所をダイアログボックスで選択できるように設計されています。また、既存の同名フォルダがある場合は新たに作成しないという賢い機能も備えています。この一連のプロセスは、プロジェクト管理、顧客管理、イベント計画、財務・会計文書の整理、人事・従業員管理など、ファイル管理にわたる業務に応用可能です。本記事では、このVBAコードを実務にどのように活用できるか、実用的な例を交えて解説していきます。自動化により、文書管理の効率化とデータ整理の一貫性を高め、業務の質を向上させる方法をご紹介します。
●【EXCEL VBA Dir関数(2)ファイル操作・フォルダー・サブフォルダー操作については、下記を参照して下さい】
●【MkDir ステートメント(Excel)、下記を参照して下さい。(Microsoft社 様)】
https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/mkdir-statement
今回説明するプログラムは、Excelの特定のシートから読み取ったフォルダ名を使用して、ユーザーが選択した場所に新しいフォルダーを作成するプログラムです。既に同名のフォルダーが存在する場合は、そのフォルダーの作成をスキップします。それでは、順番に説明いたします。
【プログラムの流れ】
Sheet1
という名前のワークシートを取得します。【プログラム実行条件・注意事項】
Sheet1
や列の指定は、実際のExcelファイルの構成に合わせて変更する必要があります。★【サンプルプログラム】
下記のリンク先よりサンプルプログラムをダウンロードする事ができます。
● automatic_folder_creation01(サンプルプログラム)
' ' Option Explicit ' 明示的な変数宣言を強制する(エラーを未然に防ぐため) ' 指定した場所にフォルダーを生成するサブルーチン Sub CreateFolders() ' 対象となるワークシートの変数を宣言 Dim ws As Worksheet ' "Sheet1"という名前のワークシートを変数wsにセット Set ws = ThisWorkbook.Sheets("Sheet1") ' フォルダのパスを格納するための文字列変数を宣言 Dim folderPath As String ' ファイルダイアログを開き、フォルダの作成場所をユーザーに選択させる With Application.FileDialog(msoFileDialogFolderPicker) .Title = "フォルダーを作成する場所を選択してください" ' ダイアログのタイトルを設定 .AllowMultiSelect = False ' 複数選択を不可に設定 If .Show <> -1 Then Exit Sub ' ダイアログがキャンセルされたらサブルーチンを終了 folderPath = .SelectedItems(1) & "\" ' 選択されたフォルダのパスを取得し、末尾に\を追加 End With ' ワークシートの最終行を特定するための変数を宣言 Dim lastRow As Long ' A列の最終行を取得 lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row ' ループカウンタ変数を宣言 Dim i As Long ' 2行目から最終行までループを回す(1行目はヘッダー等の想定) For i = 2 To lastRow ' フォルダ名を格納するための変数を宣言 Dim folderName As String ' 現在の行のA列の値(フォルダ名)を取得 folderName = ws.Cells(i, 1).Value ' フォルダ名が空でない、かつ既に同名のフォルダが存在しない場合 If folderName <> "" And Dir(folderPath & folderName, vbDirectory) = "" Then ' 指定されたパスに新しいフォルダを作成 MkDir folderPath & folderName End If Next i ' 次の行に移動 End Sub '
今回説明するプログラムは、上記で説明したましたサンプルプログラム①の応用となります。今回のプログラムでは、EXCELシートに登録されているデータを元にメインフォルダーとサブフォルダーを作成します。具体的には、A列に登録されているデータは、メインフォルダー、その同行に登録されているB列のデータサブフォルダーとしてA列のメインフォルダー内にサブフォルダーが作成されます。なお、既に同名のフォルダが存在する場合は、そのフォルダの作成をスキップします。それでは、順番に説明いたします。
【プログラムの流れ】
1.ワークシートを設定:Sheet1を操作対象のシートとして設定します。
2.フォルダーの基本パスをユーザーが選択:ファイルダイアログを使用して、フォルダーを作成する基本パスをユーザーに選択させます。
3.最終行の取得:Sheet1のA列の最終行を取得します。
4.ループ処理:2行目から最終行まで、各行のA列(メインフォルダー名)とB列(サブフォルダー名)を読み取ります。
5.フォルダーの作成:メインフォルダがまだ存在しない場合、基本パスにメインフォルダーを作成します。続いて、同様にサブフォルダーが存在しない場合、メインフォルダ内にサブフォルダーを作成します。
【プログラム実行条件・注意事項】
1.フォルダー名の重複:既に同名のフォルダーが存在する場合、新たにフォルダーは作成されません。
2.エラーハンドリング:このコードにはエラーハンドリングが含まれていないため、予期せぬエラーが発生する可能性があります(例:アクセス権限の不足、無効なフォルダー名)。
3.ユーザーの操作:ユーザーがファイルーダイアログでキャンセルを選択すると、コードは何もせずに終了します。
★【サンプルプログラム】
下記のリンク先よりサンプルプログラムをダウンロードする事ができます。
● automatic_folder_creation02(サンプルプログラム)
今回説明するプログラムは、上記で説明したましたサンプルプログラム②の応用となります。今回のプログラムでは、EXCELシートに登録されているデータを元にメインフォルダーと複数のサブフォルダーを作成します。具体的には、A列に登録されているデータは、メインフォルダー、その同行に登録されているB列以降のデータサブフォルダーとしてA列のメインフォルダー内にサブフォルダーが作成されます。なお、既に同名のフォルダーが存在する場合は、そのフォルダーの作成をスキップします。それでは、順番に説明いたします。
【プログラムの流れ】
1.Sheet1という名前のワークシートを選択します。
2.ユーザーがフォルダーを作成する場所を選択できるように、ファイルダイアログを開きます。
3.選択されたパスをbasePath変数に格納します。
4.Sheet1のA列で最終行を検出します。
5.2行目から最終行まで各行をループ処理します。
6.各行のA列からメインフォルダー名を取得します。
7.メインフォルダーがまだ存在しない場合、それを作成します。
8.同じ行のB列以降のセルをループ処理し、サブフォルダー名を取得します。
9.各サブフォルダーがまだ存在しない場合、それを作成します。
【プログラム実行条件・注意事項】
1.ワークシートの名前がSheet1であることを確認する必要があります。
2.A列にメインフォルダー名、B列以降にサブフォルダー名が記載されている必要があります。
3.フォルダー名が空のセルは無視されます。
4.既に同名のフォルダーが存在する場合、新たに作成されません。
5.フォルダーの作成場所はユーザーがファイルダイアログで選択する必要があります。
【実行結果・例】
選択されたパス
・MainFolder1
・・・・SubFolder1-1
・・・・SubFolder1-2
・MainFolder2
・・・・SubFolder2-1
・・・・SubFolder2-2
・・・・SubFolder2-3
・・・・SubFolder2-4
・・・・SubFolder2-5
※MainFolder2まで再現しております。
既に存在するフォルダは作成されません。また、空のセルがあれば、その行のその部分についてはフォルダが作成されません。
★【サンプルプログラム】
下記のリンク先よりサンプルプログラムをダウンロードする事ができます。
● automatic_folder_creation03(サンプルプログラム)
' ' Option Explicit ' 明示的な変数宣言を強制する(エラーを未然に防ぐため) ' 指定した場所にフォルダーを生成するサブルーチン Sub CreateSubFolders03() ' 対象となるワークシートの変数を宣言 Dim ws As Worksheet ' "Sheet1"という名前のワークシートを変数wsにセット Set ws = ThisWorkbook.Sheets("Sheet1") ' フォルダのパスを格納するための文字列変数を宣言 Dim basePath As String ' ファイルダイアログを開き、フォルダの作成場所をユーザーに選択させる With Application.FileDialog(msoFileDialogFolderPicker) .Title = "フォルダーを作成する場所を選択してください" ' ダイアログのタイトルを設定 .AllowMultiSelect = False ' 複数選択を不可に設定 If .Show <> -1 Then Exit Sub ' ダイアログがキャンセルされたらサブルーチンを終了 basePath = .SelectedItems(1) & "\" ' 選択されたフォルダのパスを取得し、末尾に\を追加 End With ' ワークシートの最終行を特定するための変数を宣言 Dim lastRow As Long ' A列の最終行を取得 lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row ' ループカウンタ変数を宣言 Dim i As Long, j As Integer ' 2行目から最終行までループを回す(1行目はヘッダー等の想定) For i = 2 To lastRow ' メインフォルダ名を格納するための変数を宣言 Dim mainFolderName As String ' 現在の行のA列の値(メインフォルダ名)を取得 mainFolderName = ws.Cells(i, 1).Value ' メインフォルダ名が空でない、かつ既に同名のフォルダが存在しない場合 If mainFolderName <> "" And Dir(basePath & mainFolderName, vbDirectory) = "" Then ' メインフォルダを作成 MkDir basePath & mainFolderName End If ' B列以降のサブフォルダの処理 For j = 2 To ws.Cells(i, Columns.Count).End(xlToLeft).Column ' サブフォルダ名を格納するための変数を宣言 Dim subFolderName As String ' 現在の行のj列の値(サブフォルダ名)を取得 subFolderName = ws.Cells(i, j).Value ' サブフォルダ名が空でない、かつ既に同名のサブフォルダが存在しない場合 If subFolderName <> "" And Dir(basePath & mainFolderName & "\" & subFolderName, vbDirectory) = "" Then ' サブフォルダを作成 MkDir basePath & mainFolderName & "\" & subFolderName End If Next j Next i ' 次の行に移動 End Sub ' '