作成したフォルダ数が5程度であれば、手入力で作成することでも問題ありません。
しかし作成したいフォルダ数が数10個以上作る場合、マクロを使った方が早いです。
実際マクロを使えば、10コでも100コでも自動で処理を行うことができます。また、フォルダ名を間違えずに作成することができます。
・VBAプログラム入りのエクセルファイルをダウンロード可能
このページでは、マクロで複数フォルダを階層別に作成するプログラムを紹介します。
またVBAプログラムが含まれたエクセルファイルをダウンロードすることもできるようにしていますので、興味がある人はご活用ください。
目次
概要|複数フォルダを階層別にまとめて一括作成するマクロとは?
あるフォルダの中に、複数の子フォルダを作成したいときがあります。
例えば、以下の画像のようにとあるフォルダにエクセルファイルが一つだけあるとします。
ここに子フォルダはありません。
このフォルダに階層別に子フォルダを作るとします(以下はイメージ)。
このとき、以下のようにフォルダを手入力で作成していくことは可能です。
動画で解説
このページで紹介するマクロは、以下の動画で説明しています。
動画の中では、「クリア」ボタンが設定されています。しかし、機能を持っていないため、説明をしていません。
手順|複数フォルダを階層別にまとめて一括作成するマクロの使い方
この記事で紹介するマクロについて説明していきます。
手順2|階層別に作成したいフォルダ名をエクセルを入力
手順3|ボタン(VBAプログラム入り)を押下
上記の手順を行うと、手順1で指定したフォルダパスに、手順2で入力したフォルダが自動で作成されます。
以下で各手順について詳細を説明します。
手順1|作成先のフォルダパスを入力
セルB2にフォルダパスを入力します。
ここで指定したフォルダパスに新しいフォルダ(子フォルダ含む)を作成します。
なおセルB2に入力するフォルダパスが存在しない場合、VBAプログラムはエラーとなります。
手順2|階層別に作成したいフォルダ名をエクセルを入力
上記の画像のように、階層別に作成したいフォルダ名をエクセルに入力していきます。
ここで入力した名前でフォルダを作成します。
1. 各行に2つ以上のフォルダ名を入力しないこと
2. 階層がずれないようにすること
注意点1. 各行に2つ以上のフォルダ名を入力しないこと
各行に1つずつフォルダ名を入力しないとプログラムエラーが出ます。
注意点2. 階層がずれないようにすること
フォルダの階層がずれないようにします。
上記の画像ではフォルダ階層2が存在しないまま、フォルダ階層3を入力しているため、プログラムエラーが出ます。
手順3|ボタン(VBAプログラム入り)を押下
ボタンを押すと、プログラムが実行されて、フォルダが自動作成されます。
フォルダが自動作成された結果は以下の画像のとおりです。
以上が手順です。
VBA入りのエクセルファイルをダウンロード
このページで紹介しているエクセルファイル(VBAプログラム入り)をそのまま使いたい人は、以下のフォームからダウンロードできます。
登録したメールアドレスへ「VBAプログラムが含まれたエクセル」を送信します。
本プログラムの内容をそのまま使用可能です。ぜひお仕事にお役立てください。
それでは以下で本ページで紹介しているVBAプログラムについて説明します。
VBA作成前の2つの事前準備
ExcelでVBAを使うためにはいくつかの準備が必要です。
具体的には以下です。
2. フォルダを扱うための事前準備
上記の2つに関して、以下で説明します。
準備1. ExcelでVBAを使うための事前準備
エクセルVBAを使うためには、保存ファイルの拡張子変更、Excelの基本設定変更の2つをしておきます。
2つともで難しい作業はなく、それぞれ1分もあれば設定変更可能です。
上記に関しては、以下の記事で解説をしています。
もしVBAを使うための準備段階に不安がある人は上記をご覧ください。
この内容は以下の動画で紹介しています。
入門エクセルマクロの使い方|マクロ作成から実行までを徹底解説
文字や画像だけで分かりづらい人は上記の動画をご覧ください。
準備2. フォルダを扱うための事前準備
この事例ではフォルダを操作するために、FileSystemObjectを活用します。
FileSystemObjectを使用する場合、VBAの参照設定を変更しておく必要があります。参照設定とは、機能拡張させることです。
FileSystemObjectを使用するために以下の参照設定を変更します。
これでフォルダやファイルの情報を取得することができるようになります。
設定方法の詳細は以下のページで紹介しています。
なお「Microsoft Scripting Runtime」にチェックを入れていないと、本事例で紹介しているVBAプログラムは動作しません。
必ずチェックを入れるようにします。
VBAのプログラムソース解説
今回紹介するプログラムの概要は以下です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
'プログラム0|変数宣言の指定 Option Explicit 'プログラム1|プログラム開始 Sub CreatefoldersWithSubfolders() 'プログラム2|変数設定 Dim i As Long, cmax As Long, x As Long, z As Long, cnt As Long, j As Long, k As Long, n1 As Long Dim str As String, url As String, s As String, s1 As String 'プログラム3|FileSystemObjectを設定 Dim fs As FileSystemObject Set fs = New Scripting.FileSystemObject 'プログラム4|対象シートを設定 Dim ws1 As Worksheet Set ws1 = Worksheets("フォルダ作成") 'プログラム5|セル範囲を指定 cmax = ws1.Range("A65536").End(xlUp).Row cnt = ws1.Range("IV4").End(xlToLeft).Column 'プログラム6|セルB2にURLが記載されているかチェック If ws1.Range("B2").Value = "" Then MsgBox "セルB2に「作成先のフォルダURL」を入力して下さい" Exit Sub End If url = ws1.Range("B2").Value 'プログラム7|Excelの記載チェック(同じ行に複数回記入されていないことを確認) For i = 5 To cmax x = 0 For j = 0 To cnt - 2 If ws1.Range("B" & i).Offset(0, j).Value <> "" Then x = x + 1 End If Next If x > 1 Then z = z + 1 End If Next 'プログラム8|同じ行に複数回記入されていた場合、処理を止める If z > 0 Then MsgBox "入力情報を見直してください" Exit Sub End If 'プログラム9|階層別にフォルダを作成する For j = 0 To cnt - 2 For i = 5 To cmax s = "" If ws1.Range("B" & i).Offset(0, j).Value <> "" Then s1 = ws1.Range("B" & i).Offset(0, j).Value For k = 0 To j If k - j = 0 Then Exit For End If n1 = ws1.Range("B" & i).Offset(0, j - k - 1).End(xlUp).Row s1 = ws1.Range("B" & n1).Offset(0, j - k - 1).Value & "\" & s1 Next s = url & "\" & s1 If fs.FolderExists(folderspec:=s) = False Then fs.Createfolder s End If End If Next Next 'プログラム10|オブジェクト解放 Set fs = Nothing 'プログラム11|プログラム終了 End Sub |
以下で詳しく説明します。
プログラム0|変数宣言の指定
1 |
Option Explicit |
「Option Explicit」とは、変数宣言を強制するためのものです。
予期しないエラーを防止できるため「Option Explicit」を入力することを習慣化することを推奨しています。
詳しい説明は以下のページで紹介しています。
プログラム1|プログラム開始
1 |
Sub CreatefoldersWithSubfolders() |
プログラム「Sub CreatefoldersWithSubfolders()」を実行するという意味です。
VBAではプロシージャという単位でプログラムを呼び出します。
プロシージャの構文は下記となっています。
1 2 3 |
Sub プロシージャ名() '実行プログラム End Sub |
「Sub」で始まり「End Sub」で終わります。
プロシージャに関連するmoduleの話については以下で説明しています。
プログラム2|変数設定
1 2 |
Dim i As Long, cmax As Long, x As Long, z As Long, cnt As Long, j As Long, k As Long, n1 As Long Dim str As String, url As String, s As String, s1 As String |
本プログラムで使用する変数を設定します。
Long(整数)型とString(文字列)型の2種類を使って、本プログラムを動かします。
参考情報
変数については、以下のページで紹介しています。
プログラム3|FileSystemObjectを設定
1 2 |
Dim fs As FileSystemObject Set fs = New Scripting.FileSystemObject |
FileSystemObjectは、ファイルやフォルダを操作するときに使うオブジェクトです。
本事例ではFileSystemObjectをfsという変数として扱います。
変数fsは定義するだけではなく、「Set fs = New Scripting.FileSystemObject」と記入して使えるようになります。
これを忘れてしまうことが多いので、注意が必要です。
FileSystemObjectに関する注意点
なお参照設定にて、Microsoft Scripitng Runtimeを設定に入れておく必要があります。
設定を忘れると動作しませんので、事前に設定を変更しておく必要があります。
なお、FileSystemObject以外にもフォルダを操作する方法はあります。しかしFileSystemObjectを使えば、ファイルとフォルダを両方操作できるので、覚えることが少なくて済みます。
細かいことを覚えるのが面倒な人は、ファイルやフォルダを操作するときはFileSystemObjectを使うと覚えておくといいです。
FileSystemObjectに関しては以下で詳しく紹介しています。
プログラム4|対象シートを設定
1 2 |
Dim ws1 As Worksheet Set ws1 = Worksheets("フォルダ作成") |
変数ws1をWorksheet(ワークシート)型で設定します。
そして、シート「フォルダ作成」をws1として扱います。
プログラム5|セル範囲を指定
1 2 |
cmax = ws1.Range("A65536").End(xlUp).Row cnt = ws1.Range("IV4").End(xlToLeft).Column |
cmaxは、シート「フォルダ作成」のA列の最終行を取得します。今回はA54のセルまで値が入力されているため、cmax=54です。
cntは、4行目の最右列を取得します。今回はG4のセルまで入力されているため、cnt=7です。(A,B,C,D,E,F,Gと数えるとき、Gが7番目のため、cnt=7)
プログラム6|セルB2にURLが記載されているかチェック
1 2 3 4 5 |
If fs.FolderExists(folderspec:=Range("B2").Value) = False Then MsgBox "セルB2に「作成先のフォルダURL」を入力して下さい" Exit Sub End If url = ws1.Range("B2").Value |
セルB2にフォルダパスが入力されていなければ、エラーメッセージ「セルB2に「作成先のフォルダURL」を入力して下さい」が出るようにします。
「If fs.FolderExists(folderspec:=Range(“B2”).Value) = False then」で「セルB2の値で指定したフォルダパスが存在しなければ」という意味です。
このプログラムを使って、セルB2にフォルダパスが正しく入力されていることを検証します。
もしフォルダパスが正しくなければ、「Exit Sub」でプログラムを強制終了させます。
問題なければ、変数urlにセルB2の値(フォルダパス)を入力します。
参考情報
フォルダの存在チェックは以下で詳しく説明しています。
プログラム7|Excelの記載チェック(同じ行に複数回記入されていないことを確認)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
For i = 5 To cmax x = 0 For j = 0 To cnt - 2 If ws1.Range("B" & i).Offset(0, j).Value <> "" Then x = x + 1 End If Next If x > 1 Then z = 1 End If Next |
同じ行に2つ以上のフォルダ名が入力されていると、正しくフォルダを作成できません。
そのため、同じ行に2つ以上のフォルダ名がエクセルに入力されている場合、エラーメッセージが出るようにします。
今回は変数zを判定値として使います。
もし同じ行に2つ以上のフォルダ名がエクセルに入力されている場合、z=1となるようにします。
この変数zの値を使ってプログラム8でエラーメッセージが出すかどうかを決定します。
プログラム8|同じ行に複数回記入されていた場合、処理を止める
1 2 3 4 |
If z = 1 Then MsgBox "入力情報を見直してください" Exit Sub End If |
プログラム7で変数zが1なら、「入力情報を見直してください」というエラーメッセージが出力されます。
そして「Exit Sub」でプログラムを強制終了させます。
プログラム9|階層別にフォルダを作成する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
For j = 0 To cnt - 2 For i = 5 To cmax s = "" If ws1.Range("B" & i).Offset(0, j).Value <> "" Then s1 = ws1.Range("B" & i).Offset(0, j).Value For k = 0 To j If k - j = 0 Then Exit For End If n1 = ws1.Range("B" & i).Offset(0, j - k - 1).End(xlUp).Row s1 = ws1.Range("B" & n1).Offset(0, j - k - 1).Value & "\" & s1 Next s = url & "\" & s1 If fs.FolderExists(folderspec:=s) = False Then fs.Createfolder s End If End If Next Next |
エクセルの入力情報をもとにフォルダを階層別に作成するプログラムです。
各行のデータを読み込んでフォルダを作成していきます。
なお、以下の記号はフォルダ名として使えません。そのため上手く動作せずエラーとなる場合があるため、注意が必要です。
¥ / : * ? ” < > |
大文字、小文字を問わず、上記の文字がエクセルに入力しないようする必要があります。
もしプログラムに詳しくない人に本プログラムを使ってもらうことがある場合、上記の文言が入力されていたら、強制終了させるプログラムを組んでおくことも一つの手です。
今回はそのプログラムは作成していません。
プログラム10|オブジェクト解放
1 |
Set fs = Nothing |
ここまで使用してきたFileSystemObjectに関するオブジェクトを解放します。
VBAの場合、このプログラムがなくてもエラーは表示されません。
しかし今後、他のプログラミング言語を学んでいくと、この解放作業が求められることは少なくありません。
そのため、ここでお作法として身に着けておくことをお勧めします。
プログラム11|プログラム終了
1 |
End Sub |
プログラム1と対になるプログラムで、プログラム終了させるための記述です。
「End Sub」を読み込むと、プログラムが終了します。
プログラムの解説はここまでです。
VBAでフォルダ操作する事例
VBAでフォルダを操作する事例について、以下で紹介しています。
本サイトで紹介しているVBAプログラムと解説ページ
内容としては、以下について紹介しています。
マクロVBAでセルの値(エクセル)で同じ階層に複数フォルダ一括作成
VBAで複数フォルダを階層別に一括作成|エクセルマクロ×フォルダ操作
VBAでフォルダ内のファイル名を取得!再帰的に階層別にサブフォルダも対象にしてエクセルへ一覧を出力
VBAでフォルダ内のファイル名とサブフォルダを取得し一覧化|拡張子も出力する方法
VBAでサブフォルダ含めフォルダ名とファイル名をテキストファイル出力
VBA×ファイル操作|フォルダ名とファイル名をテキストファイルへ出力
VBAでフォルダ内のフォルダ名・ファイル名を一括変更(まとめて変換)
VBAでShellを使ってフォルダを開く|最前面に表示(アクティブ化)
VBAでダイアログからフォルダ選択し複数ファイル名を取得・表示|エクセルに一覧化
VBAでフォルダ内のエクセルファイルを全てに処理するマクロを紹介
VBAでフォルダ内の全てのエクセルデータを一つにまとめる(集約)
エクセルVBA×Text|テキストファイルの文字列を一斉置換・変換
VBAでフォルダ内のファイル数とフォルダ数をカウントしてExcelに出力
VBAでフォルダ内のファイルや特定フォルダ(ファイルごと)一括削除
VBAで複数フォルダのセットを一括コピー(フォルダの名前変更も実行)
エクセルVBAで請求書PDF作成|複数の取引先別に自動転記(マクロテンプレートあり)
エクセルマクロVBAで資料送付状(Word)の作成・印刷を効率化
VBAでWord議事録メモを作成して最前面表示!ファイルコピーと一覧化で整理整頓
エクセルファイルをダウンロードしてそのままVBAを使えるようにしているので、ぜひご活用ください。
Excel VBAについて詳しく理解したいなら
VBAを活用すると、仕事を効率化できる幅を広げることができます。
たとえば私が実際にVBAを活用して効率化してきた作業は以下の記事で紹介しています。
興味がある人は以下の記事もご覧ください。
動画でも解説しています。
エクセルマクロVBAで出来ることを15の事例で紹介|日常業務をラクにするヒントを見つけよう!
(音声が小さいので、ボリュームを上げてご覧いただければと思います)
VBAの勉強方法
私はプログラミング初心者からVBAを勉強を始めて少しずつレベルアップしていきました。
成長の過程は以下で紹介しています。
学習の過程では、意識すべきポイントがあります。
特に独学の場合だと、勉強を優先してしまい、肝心な実践を疎かにしがちです。
私の経験では、実践から逆算した勉強が必要だと考えています。
目指すべきは会社でお金をもらいながら勉強することです。
要はVBAを仕事の一つとして上司に認めてもらうのです。
そうすればわざわざ高いお金を払って勉強をする必要がなくなります。
しかも作業を自動化して、会社やチームに貢献しつつ、自らのスキルアップできます。
そのために必要な考え方を以下で紹介しています。
とはいえ、プログラミング初心者でVBAについて知識ゼロの人もいるはずです。
いきなり会社でVBAで使うことさえ、とてつもなくハードルが高く見えてしまうものです。
その場合は、VBAの基本について学ぶ必要があります。
たとえば車の運転も慣れてしまえば、たいしたことではありません。
しかし教習所で運転の基本を学び、免許を取得することで、公道で運転できるようになります。
VBAも同じです。VBAに免許はありませんが、まずは基本を学ばないことには会社で使えるレベルにはなりません。
実際に私もプログラミング初心者のときは、動画を見たり書籍を読んだりして勉強しました。
今はオンラインの教材で無料で学習できるものも多いです。
上記のリンクでは、私の経験から勉強にオススメの教材を紹介しています。
興味がある人はご覧ください。