Excelが大好きだ!

Excel大好き経理マンがExcelの事を書き綴っていきます。


スポンサードリンク

Dirを利用したファイル検索(ファイル検索比較1)

これから何回かに渡ってVBAでのファイル検索の方法を検証してみようと思います。

まずはDir関数からです。

Dir関数の使用方法

Dir関数

Dir ( [pathname], [ attributes VbFileAttribute = vbNormal ]) as String
引数 内容
pathname 省略可能。検索したいファイル・フォルダ名の一部ないし全部を指定します。
attributes 省略可能。検索対象とするファイル属性をVbFileAttribute列挙型で指定します。
・vbNormal 0((既定値) 属性のないファイル)
・vbReadOnly 1(属性のないファイルと読み取り専用のファイル)
・vbHidden 2(属性のないファイルと隠しファイル)
・vbSystem 4(属性のないファイルとシステム ファイル )
・vbVolume 8(ボリューム ラベル。他の属性を指定した場合は無視されます )
・vbDirectory 16(属性のないファイルとディレクトリまたはフォルダー)

引数pathnameは省略可能だが、Dir関数の初回使用時は必ず指定する必要がある。

最初に一致した検索結果のファイル・フォルダ名のみを文字列型で返します。

2つ目以降の検索結果を抽出する場合は引数指定なしで再度Dir関数を実行することで抽出することができる。

検索に一致するものが無くなると、Dir関数は長さ0の文字列(””)を返します。

使用例

Sub DirSearch()
     Dim myCol As Collection
     Dim myFileName As String
     Set myCol = New Collection
     
     '該当フォルダ以内の拡張子xlsのファイルを検索
     '検索結果にxlsmのファイルが抽出されている件はリンク先参照
     myFileName = Dir("C:\Users\ユーザー名\Desktop\Dircheck\*.xls", vbNormal)
     Do Until myFileName = ""
          myCol.Add myFileName
          myFileName = Dir
     Loop
     
     '検索結果を蓄積していたCollectionから配列へ転記してからセルへ一括転記
     Dim myItem As Variant
     Dim myVar As Variant
     Dim i As Long: i = 1
     ReDim myVar(1 To myCol.Count, 1 To 1)
     For Each myItem In myCol
          myVar(i, 1) = myItem
          i = i + 1
     Next
     
     Range("A1").Resize(UBound(myVar), 1).Value = myVar
End Sub

Dir関数は一回使用しただけでは最初に一致した検索結果のみを返すので、

・検索結果を一旦Collectionへ転記して蓄積

・Dir関数を引数無しで再実行

・検索結果が「""」になるまでループ処理

以上で最初に指定したフォルダ内を全て検索することが出来ます。

使用結果

この状態のフォルダに上記のコードを実行すると
f:id:ExcelLover:20190217005006j:plain

このようになります。
f:id:ExcelLover:20190217005528j:plain

まとめ

このままでは最初に指定したフォルダ内のみを検索することになり、フォルダ内のフォルダの中を検索することが出来ない。

次回は再帰処理を利用したフォルダ内フォルダの検索について調べてみます。

コード中に記載したxlsを検索しているのにxlsm拡張子のファイルも表示されている件は以下を参照

docs.microsoft.com