この関数について
ExcelVBA(マクロ)でフォルダやファイルの存在を確認するためには「Dir」という非常に便利な備え付けの関数があります。しかしこの関数には非常に重大な落とし穴があります。Dir関数はマクロの動作中にプロシージャが変わっても状態を保持し続けます。要は、呼び出し元でDir関数を使用した後、呼び出し先でもDir関数を使用すると呼び出し元のDir関数の状態を上書きしてしまいます。この特性を理解していればDir関数は非常に高速で強力な関数ですが、理解せずに使うと事故の元です。ここで紹介する関数はDir関数を使わずに、フォルダ内にあるフォルダの一覧を取得することができます。
関数コピペ ~コードをクリックするだけでコピー完了!~
使い方 ①引数
引数名 | 型 | 参照 | 省略 | 内容 |
---|---|---|---|---|
target_folder_path | String | ByVal | 不可 | フォルダの絶対パスを指定します。このフォルダ内から次に指定する条件に合致するフォルダを探索します。 |
wild_card | String | ByVal | 不可 | 探索したいフォルダ名を指定します。ワイルドカードを使用できます。 |
使い方 ②戻り値
状態 | 型 | 内容 |
---|---|---|
正常 | String() | フォルダ名が格納された配列を返します。Base:0 |
例外 | String | 例外は想定されていません |
エラー | String | エラー処理は行いません |
サンプルコード(クリックでコピー)
【結果】フォルダ名の一覧を取得することができました
サンプルコードを実行するとイミディエイトウィンドウにマクロと同じ階層にあるフォルダ名の一覧が出力されます。Dir関数とは異なり呼び出し元・呼び出し先など意識することなく使用できます。
おまけ:Dir関数の落とし穴
検証の際に作成した、Dir関数だと失敗する例を残しておきます。参考:VBA.Dir
サンプルコード(クリックでコピー)
Private Sub Test_Dir()
Dim parent_dir As String
parent_dir = Dir(ThisWorkbook.Path & "\*", vbDirectory)
Do While parent_dir <> ""
Debug.Print parent_dir
Call Test_DirSub(ThisWorkbook.Path & "\" & parent_dir)
parent_dir = Dir
Loop
End Sub
Private Sub Test_DirSub(ByVal parent_path As String)
Dim child_dir As String
child_dir = Dir(parent_path & "\*")
Do While child_dir <> ""
Debug.Print child_dir
child_dir = Dir
Loop
End Sub
このコードはエラーが発生します
上段のプロシージャは、Dir関数を使用してマクロと同じ階層にあるフォルダ名を1つずつ取得します。取得したフォルダ名を下段のプロシージャへ渡して呼び出し、下段のプロシージャは受け取ったフォルダ内にあるファイル名をこれもまたDir関数を使用して取得し、イミディエイトウィンドウに出力します。ここで下段のプロシージャで使用されたDir関数は上段で使用していたDir関数の状態を上書きするため、このコードは1つ目のフォルダを処理した後、2つ目のフォルダ名を取得することができず、エラーが発生します。
関数リファレンスにはコピペで使用可能な便利関数を多数掲載!
関数リファレンスでは私が開発の中で必要になったコード部品を汎用化・関数化して公開しています。この記事で紹介した関数以外にもコピペで利用できる関数を多数用意しています。検索窓から必要な機能を検索してみましょう!解説記事も続々公開中。
Comment