定期的に送られてくる複数のExcelファイルを、以下のようにまとめるのは、手作業だと大変です。
ということで、「指定したフォルダ内のExcelファイルから、必要なデータを自動で抽出してまとめる仕組み」の実現方法 について解説していきます。
※こちらで実現したファイルは、記事の最後にて配布しています。
1. 開発準備
今回は、フォルダのパスをインプットボックスに入力してから実行するだけで、以下のシートに、該当する項目のデータを抽出する仕組みを、VBAを活用して実現します。
まずは、[開発]タブから[マクロ]を選択し、表示された画面の[マクロ名]に好みの名前(例:ImportSalesData)を入力して、[作成]を選択します。
以上の手順で、入力したマクロ名のプロシージャが表示されるため、そのプロシージャを活用します。 「Option Explicit」は、VBE(エディタ画面)の設定内容次第では表示されません。「Option Explicit」についての解説はこちらでは省略します。
2. コードの記述
以下のコードを記述します。
Sub ImportSalesData()
Dim fP As String , fN As String
fP = InputBox("フォルダパス")
fN = Dir(fP & "\*.xlsx")
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(1)
Dim r As Long , c As Long
r = 3
Do While fN <> ""
With Workbooks.Open(fP & "\" & fN)
For c = 2 To 5
ws.Cells(r, c).Value = _
.Worksheets(1).Cells(c, "C").Value
Next c
.Close
End With
r = r + 1
fN = Dir()
Loop
End Sub
では、コードについて解説していきます。
Dim fP As String , fN As String
fP = InputBox("フォルダパス")
fN = Dir(fP & "\*.xlsx")
対象のフォルダのパスを格納する用の変数「fP」と、そのフォルダ内の1つのExcelファイルの名前を格納する用の変数「fN」を用意しています。
そして、「fP」には、インプットボックスに入力した値(対象のフォルダのパスを入力する想定)を格納し、「fN」には、その「fP」のフォルダの中に格納されている1つ目のファイル名を格納しています。 「fP & “\*.xlsx”」で、「フォルダパス\*.xlsx」というファイルのパスを作成し、Dirで該当するファイルの名前を取得しています。 ※「*」は0文字以上の任意の文字という意味です。
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(1)
Dim r As Long , c As Long
r = 3
シート情報を格納する用の変数「ws」を用意し、抽出先のファイル(コードを記述している自分自身のファイル)の先頭のシート情報を格納しています。
次に、対象のシート(ws)に、抽出内容を入力するセルの位置を指定するための行番号と列番号を格納する用の変数「r:rowの略、c:columnの略」を用意しています。 行番号を格納する用の変数「r」には、予め「3」を格納しています。
Do While fN <> ""
'省略
fN = Dir()
Loop
指定したフォルダ内に該当するファイルが見つからない場合は、「fN」が空になります。 そのため、ここでは「fN」が空でない場合に、「Do」から「Loop」の中を実行するようにしています。
最後に「fN = Dir()」と記述することで、「fN」の中に次のファイル名が格納されます。 次のファイルが存在しない場合は、ファイル名を取得できないため、「fN」が空になります。
そして、再度、「Do」に戻り、「fN」が空になるまで繰り返して実行されます。
With Workbooks.Open(fP & "\" & fN)
For c = 2 To 5
ws.Cells(r, c).Value = _
.Worksheets(1).Cells(c, "C").Value
Next c
.Close
End With
r = r + 1
繰り返しの中で行う処理です。 「Workbooks.Open(fP & “\” & fN)」で、指定したフォルダ(fP)内の対象のファイル名(fN)のファイルを開いています。 「With」で指定することによって、「With」から「End With」の中で「.」から記述したコードは、開いたファイルの情報に対しての処理になります。
「For」から「Next」の中を、変数「c」の値を2から5まで順番に変化させて繰り返し実行しています。 「2から5」というのは、抽出先の表のB列からE列までの列番号になります。
「For」の中で、抽出先のシートの「r」行目「c」列目のセルに、開いたブックの先頭のシートの「c」行目C列にある値を入力しています。
抽出先のシートの2列目には、抽出元のシートの2行目、 抽出先のシートの3列目には、抽出元のシートの3行目、 という感じに行番号と列番号が、行と列が逆の関係にあるため、上記のような処理になります。
1つのファイルの内容の入力ができたら、次のファイルに移る前に「r = r + 1」で行番号に1を加えています。
3. 完成
以上の内容で実現できます。 実行する際は、[開発]タブの[マクロ]を選択し、表示された画面から開発したマクロ名を選択して[実行]を選択します。
次に、表示されたインプットボックスに、抽出元のファイルが格納されたフォルダのパスを入力して確定します。
これでだけで、以下のように、指定したフォルダ内のすべてのExcelファイルの内容を抽出することができます。
▼サンプルファイル▼