Excel。VBA。フォルダー内にある別ファイルのシートを一つのファイルに集めたい
<Excel VBA>
何気ない操作も繰り返す回数が増えると、面倒以外の何物でもありませんね。
例えば、フォルダー内に各店舗のファイルがあって、それぞれのファイルにあるシートを、一つのファイルに集めたい・コピーしたいというのも、その一つだと思います。
今回は、渋谷店・新宿店・品川店のファイルにあるシートを全店舗というファイルに集めたい・コピーするケースでご紹介していきます。
ファイルを開いて、シート名の上で右クリックして、シートのコピーをしていく作業をたった3回かもしれませんが、面倒ですし、ファイル数が増えれば増えるほど、面倒から【苦痛】へと変わっていきます。
全店舗ファイルを開いて、現状を確認しておきます。
集計シートのみしかないことが確認できます。
各店舗のデータも確認しておきましょう。
新宿店のファイルですが、4月シートがあります。他のファイルも同様の構成になっています。
ますは、プログラム文を確認しておきましょう。
Sub ブック結合()
Dim f_name As String
Dim path_name As String
Dim i As Long
For i = 1 To 1
path_name = Workbooks(i).Path
Next j
f_name = Dir(path_name & "¥*.xlsx")
Do While f_name <> ""
Workbooks.Open path_name & "¥" & f_name
Workbooks(f_name).Worksheets(1).Copy before:=ThisWorkbook.Worksheets(1)
ThisWorkbook.Worksheets(1).Name = Replace(f_name, ".xlsx", "")
Workbooks(f_name).Close False
f_name = Dir()
Loop
End Sub
説明の前に、実行してみます。
このように、あっという間に、一つのファイルに集めることができました。
プログラム文を確認しておきましょう。
Dim f_name As String
Dim path_name As String
Dim i As Long
お馴染みの変数宣言ですね。
For i = 1 To 1
path_name = Workbooks(i).Path
Next j
For~To~Next文で繰り返しをしていますが、何をしているのかというと、ファイルがあるパス名を取得するためです。
ファイル名だけでは、処理をしてくれません。
そのファイルが、どこのフォルダーにあるのかという情報のパスを取得する必要があるわけです。
変数名のpath_nameは、そのパスを代入するものです。
Workbooks(i).Path
で、そのファイルのあるパスの情報を得ることができます。
確認を続けていきます。
f_name = Dir(path_name & "¥*.xlsx")
先程取得した、パス名と拡張子名を結合させることで、収集元のファイル名を変数名f_nameに代入させます。
なお、マクロファイルの場合には、拡張子は「xlsm」と変更します。
拡張子を設定しておかないと、フォルダー内に関係ないファイルがある場合には、それも該当してしまうので、エラーになってしまいます。
なお、「¥(円マーク)」ですが、半角だと「円マーク」で表示してくれないので「全角の¥」にしておりますので、ご注意ください。
Do While f_name <> "" ~ Loop は、該当するファイルがある間繰り返し処理をするという意味です。
Workbooks(f_name).Worksheets(1).Copy before:=ThisWorkbook.Worksheets(1)
コピー元のシートを、コピー先の1枚目のシートの「before(前:左側)」にコピーします。
ThisWorkbook.Worksheets(1).Name = Replace(f_name, ".xlsx", "")
シート名の重複というわけにはいきませんので、今回は、コピーしたシートのシート名をファイル名に置換する(Replace)作業をしております。
Workbooks(f_name).Close False
開いたファイルを閉じます。
現場には、簡単な処理でも、量が増えると面倒な作業は多いと思いますので、マクロを作ってみるといいかもしれませんね。