Home » エクセルマクロ・Excel VBAの使い方 » VBA関数 » MkDirで階層の深いフォルダーを作成する

MkDirで階層の深いフォルダーを作成する

対象:Excel2007, Excel2010, Excel2013, Windows版Excel2016

MkDirで階層の深いフォルダーを作成する

「vba mkdir 階層」
「vba mkdir 中間ディレクトリ」
「vba フォルダ作成 mkdir サブフォルダ」
といった検索で、このサイト・インストラクターのネタ帳へのアクセスが時折あります。

VBA(Visual Basic for Applications)のMkDirステートメントで、階層の深いフォルダーを作成するには、どのようなコードを書けばいいのかを探している方による検索でしょうか。

「vba mkdir 再帰的」
といった検索も、おそらく同じだろうと推測しています。

[スポンサードリンク]

MkDirのパスが見つかりませんエラー

例えば「C:\LOG\2016\09」といったフォルダーを作成しようと考えて、
  MkDir "C:\LOG\2016\09"
というステートメントを実行すると、条件によって「パスが見つかりません。」という実行時エラーが発生するときがあります。

どういうときにエラーになるかというと、途中のフォルダーが存在しないときです。

例えば、
「C:\LOG」が存在しないとき、
「C:\LOG」は存在するけれど「C:\LOG\2016」は存在しないとき
いずれも、
  MkDir "C:\LOG\2016\09"
を実行するとエラーが発生します。

MkDirステートメントは、階層の深いフォルダーを一気に作成することはできず、階層を追って順番に作成しなければならないからです。

「vba mkdir 階層」
「vba mkdir 中間ディレクトリ」
「vba フォルダ作成 mkdir サブフォルダ」
「vba mkdir 再帰的」
といった検索をした方は、この解決方法を探していたのだろうと私は推測しています。

深い階層のフォルダーを作成するサンプルマクロ

階層の深いフォルダーを作成するには、以下のようなマクロです。

Sub MkDirで階層の深いフォルダーを作る()

 Dim full_path As String ' 作成するフォルダーのフルパス
 Dim tmp_path As String
 Dim arr() As String
 Dim i As Long

 full_path = "C:\LOG"
 full_path = full_path & "\" & Format(Date, "yyyy")
 full_path = full_path & "\" & Format(Date, "mm")

 arr = Split(full_path, "\")
 tmp_path = arr(0) ' ドライブ名の代入

 For i = 1 To UBound(arr)
  tmp_path = tmp_path & "\" & arr(i)
  If Dir(tmp_path, vbDirectory) = "" Then
   MkDir tmp_path
  End If
 Next i

End Sub

上記のマクロを実行すると、「C:\LOG\2016\09」のような形で、Cドライブの「LOG」フォルダーの下に、マクロを実行した日の年のフォルダーが作成され、年のフォルダーの下に月のフォルダーが作成されます。

サンプルマクロの解説

まず最終的に作成したいフォルダーのフルパスを変数・full_pathに格納しています。
  full_path = "C:\LOG"
  full_path = full_path & "\" & Format(Date, "yyyy")
  full_path = full_path & "\" & Format(Date, "mm")

作成したフルパスを、Split関数を使ってフォルダーごとに配列にして、
  arr = Split(full_path, "\")
変数・tmp_pathにドライブ名を格納しておきます。
  tmp_path = arr(0)

配列の2つ目の要素から、最後の要素までFor~Nextループを回して、深い階層のフォルダーを順番に作成する処理に入ります。
  For i = 1 To UBound(arr)

作成したいフォルダーのパスを変数・tmp_pathに格納して、
   tmp_path = tmp_path & "\" & arr(i)

そのフォルダーが存在するかどうかをDir関数で調べて、
   If Dir(tmp_path, vbDirectory) = "" Then

存在しなかったときに、フォルダーを作成しています。
    MkDir tmp_path

ローカルウィンドウで、配列変数・arrの各要素にどのような文字列が格納されているか、For~Nextループが回るごとに、変数・tmp_pathにどのような文字列が格納されているかを確認しながら、ステップ実行してみてください。

[スポンサードリンク]

Home » エクセルマクロ・Excel VBAの使い方 » VBA関数 » MkDirで階層の深いフォルダーを作成する

「VBA関数」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.

.