4/08/2021

Excel。VBA。フォルダー内にある別ファイルのシートを一つのファイルに集めたい【File combination】

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

開いたファイルを閉じます。


現場には、簡単な処理でも、量が増えると面倒な作業は多いと思いますので、マクロを作ってみるといいかもしれませんね。