実践編1-1では指定したファイルを開いて編集するということを行いました。
その際、ファイル名自体を固定したのですが、フォルダにあるファイルすべてを編集したい場合には使用できません。
そこで次にするのが、フォルダにあるファイル名をすべて取得するという処理です。
ファイル名と言っていますが、ファイルを開くためにはパスが必要なので正確にはファイル名までを含めたパスになります。
この処理はVBAでは必ずといっていうほど使うので、コードを暗記するぐらいでも大丈夫です。
今回はDir関数を使って実践していきます。
目次
フォルダのファイル名を取得するVBAコード
フォルダにあるファイル名を取得する処理の全コードはこちら。
Sub GetFileNames()
Dim folderPath As String
folderPath = "C:\movie_retal\incomplete\"
'指定したフォルダの中にある拡張子が「csv」のファイル名を取得する
Dim buf As String
buf = Dir(folderPath & "*.csv")
Dim i As Long
i = 2
'フォルダ内のファイル数がなくなるまで繰り返す
Do While buf <> ""
Thisworkbook.Worksheets("Sheet1").Cells(i, 1) = folderPath & buf
i = i + 1
buf = Dir()
Loop
End Sub
VBAコードの解説
今回の処理のポイントはDir関数を使ってファイル名を取得し、ループですべてのファイル名を取得することです。
繰り返し処理はfor文とWhile文がありますが、今回のようにファイルがいくつあるかわからない場合は、While文を使い、ファイルがなくなるまで繰り返すやり方で取得します。
指定したフォルダ内にあるファイル名を取得する
Dim folderPath As String
folderPath = "C:\movie_retal\incomplete\"
'指定したフォルダの中にある拡張子が「csv」のファイル名を取得する
Dim buf As String
buf = Dir(folderPath & "*.csv")
Dir関数を使って、フォルダ内にあるファイル名を取得します。
Dir関数は、引数に指定したファイル名が存在した場合、ファイル名を返してくれる関数です。
通常、引数には「〇〇.xls」のようにファイル名を指定しますが、ワイルドカード「*」を使った指定もできます。
ワイルドカードとは、検索したい文字列の代わりになる記号です。
「*」を1つ入力することで0文字以上の文字と同じ意味になります。
例えば、「神奈川県」「千葉県」など、件名を検索したいという場合は、「*県」とします。
今回はcsvファイルを検索したいので、「*.csv」として指定したフォルダ内のcsvファイルの名前を取得します。
フォルダ内のすべてファイルを取得する
Dim i As Long
i = 2
'フォルダ内のファイル数がなくなるまで繰り返す
Do While buf <> ""
Thisworkbook.Worksheets("Sheet1").Cells(i, 1) = folderPath & buf
i = i + 1
buf = Dir()
Loop
Dir関数でフォルダ内のすべてのファイル名を取得するには、ループを行います。
Dir関数には以下の特徴があります。
- 引数を省略すると直前に指定した引数が指定
- 一度取得したファイルは除く
この2つの特徴を使い、フォルダ内のファイルをすべて取得し終わる、つまりDir()の戻り値が空になるまで繰り返します。
取得できたファイル名は、フォルダのパスとつなげてシートに入力していきます。
まとめ
今回は実践編として、VBAでよく行われる処理であるフォルダ内のファイルを取得する方法を紹介しました。
これを前回紹介した別ファイルの編集と組み合わせることで、たくさんのファイルを一気に処理することができます。
Dir関数の使い方を覚えて、活用してみてください。