こんにちは、Ryoです。
VBAでファイル処理を行っていると当然ながら特定名のファイルを検索したり、関連する
フォルダを検索したいことが多々あるかと思います。
そんな時に使用するのが今回解説するDir関数で、この関数を使って処理すれば簡単にファイルやフォルダを抽出してくれますのでかなり便利です。
今回はDir関数の解説と実用例、フォルダを新設する処理等もサンプルコードを交えて
ご紹介したいと思います。
1.Dir関数について
◆構文
Dir[(pathname[, attributes])
引数pathname・・・検索したいファイル・フォルダを「フルパス」で指定
引数attributes・・・検索対象の属性を指定(複数指定も可 例:vbNormal+vbHidden)
【引数attributesに指定する値】
値 | 説明 |
vbNormal | 標準ファイル |
vbHidden | 隠しファイル |
vbSystem | システムファイル |
vbVolume | ボリュームラベル指定すると全ての属性を無視 |
vbDirectory | フォルダ |
Dir関数で検索し対象が見つかった場合はファイル・フォルダ名を返しますが、見つからない
場合は「長さ0の文字列」を返します。
この「長さ0の文字列」を有効利用しLen関数により「文字列長さ」を判定して「0」で
なければ見つかったと判定させることが出来ます。
2.サンプルコード
◆ファイル存在確認のサンプルコード
Sub File_DirSample() Dim flSample, fname As String '検索対象のファイル名 fname = "DirSample.xlsx" 'ファイル名の取得 flSample = Dir(ThisWorkbook.Path & "/" & fname) 'ファイルの存在有無を判定 If Len(flSample) <> 0 Then '「有り」の結果をメッセージボックスで表示 MsgBox (flSample & "の存在を確認しました。"), vbInformation Else '「無し」の結果をメッセージボックスで表示 MsgBox (fname & "は存在しません"), vbCritical End If End Sub
これはVBAの実行ファイルと同じパスに”DirSample.xlsx”というファイルが存在するかどうかについてDir関数にて検索し、Len関数で判定した結果をメッセージボックスで表示します。
有りの場合は、
MsgBox (flSample & “の存在を確認しました。”), vbInformation
この様に記述していますが、対象が見つかった場合はファイル名を返しますので、「flSample」でOKです。
無しの場合は長さ0の文字列が返ってきてしまうので、コード冒頭に記述したfnameを
使っています。
MsgBox (fname & “は存在しません”), vbCritical
◆フォルダ確認のサンプルコード
Sub Folder_DirSample() Dim folSample, folname As String '検索対象のフォルダ名 folname = "DirFolSample" 'フォルダ名の取得 folSample = Dir(ThisWorkbook.Path & "/" & folname, vbDirectory) 'フォルダの存在有無を判定 If Len(folSample) <> 0 Then '「有り」の結果をメッセージボックスで表示 MsgBox (folSample & "の存在を確認しました。"), vbInformation Else '「無し」の結果をメッセージボックスで表示 MsgBox (folname & "は存在しません"), vbCritical End If End Sub
こちらはファイルのサンプルコードをフォルダ用に書き換えたものです。
ほぼ同様のコードとなっていますが、一部異なるのは
folSample = Dir(ThisWorkbook.Path & “/” & folname, vbDirectory)
フォルダの検索ですので、引数に「vbDirectory」を使います。
ファイルとフォルダの検索ではやや指定が異なりますので、ご注意ください。
これらを踏まえた実用例としては、検索対象のフォルダが見つからない場合に、
「フォルダを新規作成」してしまえば良いので、そのサンプルコードを以下に記します。
◆フォルダが見つからない⇒フォルダの新規作成サンプルコード
Sub NewFolder_DirSample() Dim folSample, folname As String '検索対象のフォルダ名 folname = "New_FolSample" 'フォルダ名の取得 folSample = Dir(ThisWorkbook.Path & "/" & folname, vbDirectory) 'フォルダの存在有無を判定 If Len(folSample) <> 0 Then '「有り」の結果をメッセージボックスで表示 MsgBox (folSample & "の存在を確認しました。"), vbInformation Else Set FSO = CreateObject("Scripting.FileSystemObject") If Dir(ThisWorkbook.Path & "/" & folname, vbDirectory) = "" Then FSO.CreateFolder ThisWorkbook.Path & "/" & folname End If Set FSO = Nothing If Len(Dir(ThisWorkbook.Path & "/" & folname, vbDirectory)) <> 0 Then MsgBox (folname & "の存在を確認しました。"), vbInformation Else MsgBox "フォルダ生成に失敗しました", vbCritical End If End If End Sub
フォルダ検索のサンプルコードに対し、フォルダ存在有無を判定する
If Len(folSample) <> 0 Then
ここの条件分岐「Else」に以下を追加しています。
Set FSO = CreateObject(“Scripting.FileSystemObject”)
If Dir(ThisWorkbook.Path & “/” & folname, vbDirectory) = “” Then
FSO.CreateFolder ThisWorkbook.Path & “/” & folname
End If
Set FSO = Nothing
If Len(Dir(ThisWorkbook.Path & “/” & folname, vbDirectory)) <> 0 Then
MsgBox (folname & “の存在を確認しました。”), vbInformation
Else
MsgBox “フォルダ生成に失敗しました”, vbCritical
End If
詳細な解説は割愛しますが、フォルダ・ファイルなどを操作できるオブジェクトとして、
FileSystemObjectを使用します。
これを使用することで、指定したパスにフォルダが存在しない場合にCreateFolderを
使って新規にフォルダを生成するものです。
その後、Set FSO = Nothingで解放しLen関数とDir関数で再度フォルダの存在を確認して
結果をメッセージボックスで表示するものです。
このサンプルコードを実行すると、コード内で指定している「New_FolSample」フォルダが
生成されますので試してみてくださいね。
実用上ではファイルの保存処理等で月別フォルダや製品名別フォルダを検索して対象が無ければ新規に生成するという形で使いえますので、知っておくと何かと便利です。
以上がファイル・フォルダの存在をDir関数で確認し、Len関数で判定する処理の解説です。
参考までにフォルダの新規生成サンプルコードも載せましたが、何かと使えますから
機会があればぜひ試してみてくださいね。
今回の記事が何かの参考になれば幸いです。
Ryo