4/15/2019

Excel。マクロ043。フォルダー内のブックを新しいブックにコピーしてまとめてみる【COPY】

Excel。マクロ043。フォルダー内のブックを新しいブックにコピーしてまとめてみる

<マクロ:Excel VBA>

日ごろ、面倒だなぁ~という処理をマクロで実行できたらなぁ~と思うことって、結構あるのですが、今回は、フォルダー内にあるブックのシートを新しいシートにコピーしたいというケースをご紹介してきます。

フォルダーに、次のようなファイル(ブック)があります。

集計.xlsmには、Excel VBAを作っていくファイルです。

現在は、集計と抽出というシートが2枚あるだけです。

各店舗のファイルも確認しておきましょう。

このように、各ブックには、シートがあって、このシートを集計という新しいブックにまとめたいわけです。

通常処理で考えると、シート名の上で右クリックして、「シートの移動またはコピー」を使って、一つずつ設定しなければいけません。

2~3個のブックだったら、根性で処理してもいいのですが、10個とかになると面倒以外の何物でもありません。

それでは、Excel VBAで作っていきます。
Sub ブック結合()
    Dim f_name As String
    f_name = Dir("C:\Users\店舗データ\*.xlsx")
   
    Do While f_name <> ""
   
        Workbooks.Open "C:\Users\" & 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

たったこれだけですが、これで、一つのブックにまとめることができます。

まずは、実行してみましょう。

このように、集計.xlsmにまとめることができました。

作業効率も一気に改善して、『時短』することができちゃいます。

それでは、プログラム文を確認しておきましょう。

それぞれのファイル名を入れる変数が必要なので、f_nameというのを用意しました。
Dim f_name As String

そのf_nameという変数に、データの場所(パス)を含めたファイル名を格納します。
f_name = Dir("C:\Users\店舗データ\*.xlsx")

ただし今回は、Excelファイルをまとめるようにしますので、*.xlsxとワイルドカードを使います。
そして、Excelファイルなので、拡張子は、xlsxとします。

なので、今回実行するときの注意点なのですが、該当以外の拡張子がxlsxのファイルをいれておくと、マクロが正常に稼働することができません。

それと、"C:\Users\店舗データ\ は、今回実行しているPCの環境なので、実際には、それぞれの環境のパスを入力設定する必要がありますので、ここも注意してください。

フォルダー内に該当のファイルがある間は処理を繰り返させたいので、DO While文をつかって繰り返し処理を設定してきましょう。

Do While f_name <> ""~Loop
これで、該当のデータがある間は繰り返し処理を行うことができます。

この繰り返し処理の中が、主な処理にあたります。
Workbooks.Open "C:\Users\" & f_name
これは、該当のファイルを開きます。

Workbooks(f_name).Worksheets(1).Copy before:=ThisWorkbook.Worksheets(1)

開いたファイルのシートをコピーして、ThisWorkbook(集計ファイル)のシートのbefore(前)に貼り付けを行う処理をする構文です。

ThisWorkbook.Worksheets(1).Name = Replace(f_name, ".xlsx", "")
ついでなので、挿入(コピー)したシート名をファイル名と同じように変更しておきます。

Replace(f_name, ".xlsx", "")は、Relace関数を使うことで、xlsxという文字を空白に置き換える処理をしています。

Workbooks(f_name).Close False
コピーが終わりましたので、開いているファイルを閉じます。Falseは、メッセージなしで閉じることができます。

f_name = Dir()
次のファイル名のための準備の構文ですね。一度、f_nameをクリアーしておきます。

このように短めの構文で『時短』できるところが、マクロ:Exce VBAの醍醐味ですね。