「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 再帰的」
といった検索をした方は、この解決方法を探していたのだろうと私は推測しています。
深い階層のフォルダーを作成するサンプルマクロ
階層の深いフォルダーを作成するには、以下のようなマクロです。
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
上記のマクロを実行すると、「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にどのような文字列が格納されているかを確認しながら、ステップ実行してみてください。
- Newer:Dictionaryオブジェクトを利用する参照設定
- Older:隣のセルの値をコピーするExcelマクロ
Home » エクセルマクロ・Excel VBAの使い方 » VBA関数 » MkDirで階層の深いフォルダーを作成する