今回は一括処理,バルク処理などと呼ばれる手法について紹介したいと思います. 一括処理やバルク処理というのは言葉の通り,複数のファイルに対して同一(ファイルごとに処理を変えることも可能)の処理をまとめて実行するというものです.
例えば,1か月単位でエクセルファイルやテキストファイルにまとめられている気象データが10年分あるとしたら,12か月×10年で120個のファイルが存在することになります. 当然ですが,120個すべてのファイルを一つ一つ開いては処理し,閉じるという作業を繰り返すのは非効率的ですし,めんどくさいですよね.
そこで,登場するのが一括処理,バルク処理といった手法です.
今回紹介するプログラムは,あるフォルダ内のある拡張子(例えば,.xls(エクセル)や.txt(テキストファイル))をもつファイルに対して一括で処理をするというものです. 処理したいファイルがあるフォルダ(ディレクトリ)と処理したいファイルの拡張子,処理内容を書くことでバルク処理が可能となります.
気象観測や水文観測などでは測定結果がエクセルファイルやcsvファイルで出力されることが多いので,VBAとの相性が良く,そこそこ有用なプログラムになっていると思います. ご自由にお使いください.
標準モジュールに貼り付けて使用してください.
Function FileNameCollectionVer3(ByVal FP As String, ByRef FN() As String, ByRef Cnt As Integer, ByVal Exp As String)
'20200812作成
'指定したディレクトリ内のファイル名を取得するための関数
'FP:ファイルパス(ディレクトリ)
'FN():ディレクトリ内の各ファイルの名前
'Cnt:ディレクトリ内のファイルの数
'Exp:拡張子
'*******************************************変数の定義*******************************************
Dim buf As String, Path As String
Dim k As Long, i As Integer, j As Integer, n As Integer
Application.ScreenUpdating = False
Application.DisplayAlerts = False
'変数の初期化
k = 2
Cnt = 0
Path = FP
'ファイルの数を取得
buf = Dir(Path & "*" & Exp)
Do While buf <> ""
buf = Dir()
Cnt = Cnt + 1
Loop
'動的配列の再定義
ReDim FN(1 To Cnt)
'ファイル名の取得と格納
n = 1
buf = Dir(Path & "*" & Exp)
Do While buf <> ""
FN(n) = buf
n = n + 1
buf = Dir()
Loop
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Function
Sub BulkProcessing()
'20200812更新
'指定したディレクトリ(Path,FP)における任意の拡張子(Exp)を持つファイルに対して一括処理を行うためのプログラム
'**************************************使用上の注意**************************************
'★★★★★マークをつけたところは実行前に確認
Dim i As Long, j As Long, n As Integer, Cntg As Long, k As Integer, b As Integer 'カウントなど
Dim FP As String '一括処理したいファイルがあるディレクトリ(関数呼び出し用)
Dim FN() As String '指定ディレクトリ内の各ファイルの名前
Dim Cnt As Integer '指定ディレクトリ内のファイル数
Dim Path As String '一括処理したいファイルがあるディレクトリ
Dim Exp As String '拡張子
Debug.Print "開始時刻"; Now
Application.ScreenUpdating = False
'**************************************ディレクトリを指定**************************************
FP = "C:\Users\xxx\Desktop" & "\" '★★★★★
Path = FP
Exp = ".xlsx" '★★★★★
'**************************************ディレクトリ内のファイル名とファイル数を取得**************************************
Call FileNameCollectionVer3(FP, FN(), Cnt, Exp)
Debug.Print "ファイル名取得完了"; Now
'**************************************各ファイルに対して処理を実行**************************************
For b = 1 To Cnt
Workbooks.Open (Path & FN(b))
'**************************************処理内容をここに書く**************************************
'★★★★★
Workbooks(FN(b)).Close savechanges:=False
Next b
DoEvents
Debug.Print "終了時刻"; Now
Application.ScreenUpdating = True
End Sub
今回は短い記事となり,説明も簡素なものでしたがお付き合いいただきありがとうございました. また,次回の記事でお会いしましょう.
記事の内容に関して,お気付きの点がありましたら,ご連絡いただけますと幸いです.