「フォルダの中身をすべてエクセルシート上に出力したい。」
「指定した拡張子のファイルをすべて削除したい。」
こんな作業をエクセルVBAで行うとき、Dir関数を使うと非常に便利です。
すでにDir関数の基本的な使い方は以下の記事で解説していますが、これだけでDir関数のすべてを理解し、応用していくのは困難でしょう。
【DIr関数説明 基礎編】
【VBA】Dir関数の特性を詳細解説!ファイル確認や一括処理に超便利!
というわけでこの記事では、Dir関数に対する理解をさらに深めることを目的として、Dir関数を使ったファイル探索事例を5つご紹介していきます。
※基本的には先ほど紹介した基礎編の内容は理解されていることを前提に、この記事を書いています。
「Dir関数について全く詳しくない。」
「Dir関数がなんなのをまず詳しく知りたい。」
という方はまずは先ほど紹介した基礎編からご覧ください。
それでは早速やっていきます!
はじめに
さまざまな状況に対応できるように以下の5つのパターンに分けてVBAコードをご紹介していきます。
◆本記事での紹介事例5つ
指定したフォルダ内にある・・・
①ファイルだけを出力する
②ファイルとフォルダを出力する
③フォルダだけを出力する
④指定した拡張子のファイルだけを出力する
⑤ファイル名に指定文字が含まれるものだけを出力する
今回は、VBAコードが正しく動いているかを確認するために、あるフォルダ内にさまざまなファイルを格納しています。(以下の画像参照)
このフォルダに対して、さきほど紹介したような5つのパターンを適用し、ファイル名をセルに出力できるか確認していきます。
また、今回は以下のようにA2セルに探索するフォルダのフルパスが記載されていることを想定してコードを書いています。
また、条件に応じて取得されたファイルやフォルダの名前は順番にA4セル以降に出力されるように記述しています。
事前説明はこれくらいにして、ここからは実際のコード解説に移っていきましょう。
事例①ファイルだけを出力する
まずはじめにファイルだけを出力するコードです。
Sub test_dir1()
'変数の型宣言
Dim base_folder As String
Dim file_name As String
Dim i As Integer
i = 0
'探索フォルダ指定
base_folder = Cells(2, 1) & "\"
'ファイルのみを探索させる
file_name = Dir(base_folder, vbNormal)
'繰り返し処理でセルにファイル名を出力
Do Until file_name = ""
Cells(4 + i, 1) = file_name
i = i + 1
file_name = Dir()
Loop
End Sub
実際に実行してみましょう。
以下のように3つのフォルダを除いて、その他のすべてのファイルがセルに出力されていることが確認できました。
事例②ファイルとフォルダを出力する
先ほどの例はファイルだけでしたが、次はフォルダも含めてコードです。
Sub test_dir2()
'変数の型宣言
Dim base_folder As String
Dim file_name As String
Dim i As Integer
i = 0
'探索フォルダ指定
base_folder = Cells(2, 1) & "\"
'ファイルとフォルダをを探索させる
file_name = Dir(base_folder, vbDirectory)
'繰り返し処理でセルにファイル名を出力
Do Until file_name = ""
If file_name <> "." And file_name <> ".." Then
Cells(4 + i, 1) = file_name
i = i + 1
End If
file_name = Dir()
Loop
End Sub
※コード中にでてくる”.” とか”..”は以下の基礎編で解説していますので、わからない方は参考にしてください。
【VBA】Dir関数の特性を詳細解説!ファイル確認や一括処理に超便利!
それでは実際に実行してみましょう。
以下のようにフォルダ内のデータすべてが出力されました。
※フォルダ内では上にフォルダ、下にファイルとなっていますが、Dir関数を使って出力する際は基本的にファイル(フォルダ)名に応じて勝手に順番が決まります。
例えば以下のような状況だとフォルダが上にきます。
もしどんな状況においてもフォルダを上に出力したい、という状況があれば、次に紹介するフォルダだけを表示する方法とさきほど紹介したファイルだけを出力する方法を順番に行うことで解決できるはずです。
※出力するセルの位置なんかの工夫はいりますが。
事例③フォルダだけを出力する
先ほどの事例ではフォルダもファイルも一括で出力されましたが、ここではフォルダだけを出力する方法をご紹介します。
ここはすこし複雑なので解説しておきます。
基本的にDir関数にはファイルだけを出力しろ、という命令はありますが、フォルダだけを出力しろ!という命令はありません。
そのためDir関数で取得したファイル名のデータはただのファイルなのかフォルダなのかを判定する作業が必要になります。
その作業がGrtAttr・・・の部分です。
このGetAttrはフルパスで指定したデータがファイルなのかフォルダなのかを判定することができる関数です。
このGetAttrを使い、Dir関数で取得したファイル名のデータがなにものなのかを判定し、その判定結果をIF文に反映させることで、フォルダだけを取り出すことが可能になります。
Sub test_dir3()
'変数の型宣言
Dim base_folder As String
Dim file_name As String
Dim i As Integer
i = 0
'探索フォルダ指定
base_folder = Cells(2, 1) & "\"
'ファイルとフォルダをを探索させる
file_name = Dir(base_folder, vbDirectory)
'繰り返し処理でセルにファイル名を出力
Do Until file_name = ""
'.と..を除外&ファイルを除外
If file_name <> "." And file_name <> ".." And _
GetAttr(base_folder & file_name) = vbDirectory Then
Cells(4 + i, 1) = file_name
i = i + 1
End If
file_name = Dir()
Loop
End Sub
すこし難しかったと思いますが、とりあえず実行してみましょう。
きちんと以下のようにフォルダだけが出力されました。
事例④指定した拡張子のファイルだけを出力する
ここまでは、ファイルだけ、フォルダだけというような仕分け方でしたが、次は拡張子に応じて仕分けしてみましょう。
今回準備したフォルダの中には、.txtという拡張子と.pyという拡張子のデータがはいっています。
ここでは.pyという拡張子のデータだけ取り出すコードをご紹介します。
※指定拡張子を変更したければ、kakuchoshi=””の部分を変更すればOKです。
Sub test_dir4()
'変数の型宣言
Dim base_folder As String
Dim file_name As String
Dim kakuchoshi As String
Dim i As Integer
i = 0
'拡張子を指定する
kakuchoshi = ".py"
'探索フォルダ指定
base_folder = Cells(2, 1) & "\"
'ファイルのみを探索させる
file_name = Dir(base_folder, vbNormal)
'繰り返し処理でセルにファイル名を出力
Do Until file_name = ""
If InStr(file_name, kakuchoshi) <> 0 Then
Cells(4 + i, 1) = file_name
i = i + 1
End If
file_name = Dir()
Loop
End Sub
以下が実際の実行結果です。
きちんと拡張子が.pyのファイルだけを取得していますね。
事例⑤ファイル名に指定文字が含まれるものだけを出力する
最後は、さきほどとほとんど同じですが、ファイル名に指定文字が含まれるものだけを出力してみましょう。
今回はBという文字が含まれているファイルだけを出力するようにしています。
※指定文字を変更したい場合はpicup_str=””の部分を変更すればOKです。
Sub test_dir5()
'変数の型宣言
Dim base_folder As String
Dim file_name As String
Dim picup_str As String
Dim i As Integer
i = 0
'拡張子を指定する
picup_str = "B"
'探索フォルダ指定
base_folder = Cells(2, 1) & "\"
'ファイルのみを探索させる
file_name = Dir(base_folder, vbNormal)
'繰り返し処理'繰り返し処理でセルにファイル名を出力
Do Until file_name = ""
If InStr(file_name, picup_str) <> 0 Then
Cells(4 + i, 1) = file_name
i = i + 1
End If
file_name = Dir()
Loop
End Sub
実行結果は以下のようになりました。
Bが含まれる文字だけが出力されていますね。
念のため以下のように変更して実行してみましょう。
picup_str = “B”⇒picup_str = “test”
結果は以下のようになりました。
testという文字はすべてのファイルに含まれているので、すべて出力されていますね。
※今回はvbNormalを指定しているのでフォルダは出力されません。
おわりに
というわけで今回はDir関数の使ったファイルの出力事例を5つご紹介しました。
今回はセルにファイル名を出力するだけでしたが、このスキルを応用することで、指定した拡張子のファイルだけを削除したり、指定文字が含まれるファイルを読み込んだりといろいろな応用ができるようになります。
ぜひ、Dir関数を完全マスターしておきましょう。
このように私のブログではエクセルスキルはもちろん、様々なプログラミングスキルを紹介しています。
・日々の残業時間を減らしたい。
・業務をもっと効率的にこなしたい。
・もっと勉強する時間を作りたい。
こんな思いを持っている人は、ぜひ他の記事も見てみてくださいね。
この記事が役に立ったという方は、ぜひ応援よろしくお願いします。
↓ 応援ボタン
それではまた!
コメント