VBAでフォルダ内のファイルをループで検索する方法を使っていますか?便利な方法なので、使い方と使いどころをマスターしましょう。今回はきょうの日付が付いたファイルをループで検索します。
目次
フォルダの中をループで検索する方法
今回の概要
今回やりたい事は売上実績データ20190913.xlsxの様に固定の文字列に本日の日付を表す8桁のついたファイルを開くと言うようなことです。これを実現する方法として、2つの方法がすぐに思いつきます。
- 売上実績データ20190913にあたる、文字列+YYYYMMDDの文字列を作成してからを作成してからWorkbooks.Openを使ってファイルを開く方法
- フォルダ内のファイルの名前を順次調べて、本日の日付をファイル名に含むときにそのファイルを開く方法
本日のファイルを開くだけなら1つめの方法が簡単で無駄がありません。しかし、2つめの方法だと全てのファイルに同じ作業を施すなど応用が利くので、今回はフォルダ内のファイルを順次調べていく方法を解説します。具体例を挙げてイメージがわきやすいように説明しますので、安心して見ていきましょう。
これができれば、タスクスケジューラーである時刻にエクセルマクロブックを開くように設定し、そのエクセルにブックを開いたらマクロを自動で起動する様にすることで、パソコンにログインさえしておけば、勝手にマクロが起動するところから作業完了まで、人がパソコンを操作することなく作業を終えることができます。
マクロの起動から完了まで完全に自動化できれば、これはちょっとした便利ツール以上のものでしょう。
Dir関数の挙動を復習する
Dir関数は、引数にフルパスを渡し、フォルダ内にそのファイルが存在すれば、ファイル名、つまり、フルパスの一番右の\または¥マークの右の文字から一番最後までを返します。
ポイントは引数をとらなければカレントディレクトリの適当なファイルのファイル名を返すことです。
Do~Loopステートメントの内側で引数なしで記述した場合、カレントディレクトリ内の中のファイルを、ランダムな順にに、しかしダブりなく探してフルパスを返そうとします。全てのファイルをチェックし終わると、空の文字列””を返します。
Do ~Loopステートメントでループを生成する
具体的にサンプルコードを提示します。
Sub フォルダ内で昨日の勤務実績データを探して開く() '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 'このプロシジャは「勤務実績YYYYMMDD.xlsx」のファイルをフォルダから検索する 'YYYYMMDDは日付で、最新の勤務実績(大抵は昨日)のファイルを開きたいが、 '会社休日に対応するため、最近のファイルを開くことにしたい '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Const folder As String = "C:\Users\hogehoge\Desktop\勤務実績\" 'ここは実際のフォルダ名にする Dim 日付の8桁 As Long Dim 直近の日付 As Long '初期値は0が入る Dim temp_file As String '順にファイルをチェックしていくときに、 'ファイル名(勤務実績YYYYMMDD.xlsxの部分)を一時的に格納する 'ここから本番 temp_file = Dir(folder & "勤務実績*") '初期設定。 Do While temp_file <> "" 'Dirが何も返さなくなるまで、つまりファイルを全てチェックし終わるまで繰り返す 日付の8桁 = Mid(temp_file, 5, 8) 'ファイル名の5文字目から8文字目までがYYYYMMDD If 直近の日付 < 日付の8桁 Then 'このプロシジャの肝。日付を単に数字の大小で比較している 直近の日付 = 日付の8桁 End If temp_file = Dir() '引数をとらなければ次の未検索のファイルを探す。未検索のファイルがなくなると””を返す Loop 'ループを抜けた時点で最新の日付が得られた Workbooks.Open Filename:=folder & "勤務実績" & 直近の日付 & ".xlsx" End Sub
ファイル名が判明しているのが分かっているファイルのみを操作する場合はこういったループによる処理は必要ありません。しかし、今月のファイルを全て処理するというような場合は必要となります。たとえば、DateSerial関数を組み合わせ、毎月月末のファイルだけを順に開いて、今年度の累積勤務時間を求める、と言うようなことです。
他に、今回の事例に近い例で言えば、月初から昨日までの売上実績を順に開いて累計として一つのファイルにまとめる、と言った事が考えられます。DateSerial関数についてはVBA Dateserial関数とFormat関数を使って日付を自在に操るで詳しく解説していますので、よろしければご参照下さい。
<ゆんの電子書籍>ゆんの電子書籍はすべてKindle unlimitedで読み放題です!