【初心者向け】Excel VBAを使って複数のExcelファイルへの同一作業を自動化してみた

##この記事を読んでできるようになること
- 基礎的な処理を大体網羅しているので、下記に載せたコードを読みながら勉強すれば手を動かしながらVBAを学べます。
- いろんな実験データをまとめる自動化の基礎がわかります。

###環境
Windows10
Macでも同様の自動化はできるが、ディレクトリの構造などパスの扱い方がWindowsとは異なるため注意が必要。

##前提とやりたいこと
「試験データ」フォルダに入っているExcelファイルのデータを転記し、計算結果をまとめたシートを「結果まとめ」フォルダに新たに作成したい。

試験データが入ってるブックに新しくシート作って計算結果もそこに自動で入るようにしたらええやん！という意見もあるかもしれないが、今回は試験データと結果をまとめたデータは独立させたいという考えがあるという前提。

フォルダの構造は以下の通り。
「結果まとめ」フォルダは初めは空で、マクロを実行するとExcelファイルが生成される。
![スクリーンショット 2021-01-09 174045.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712635/76415c3e-a2ff-203d-64df-76c53d2b2306.png)

![スクリーンショット 2021-01-09 174110.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712635/37704d10-8efd-1136-425d-536792196def.png)

- BookA：マクロ実行用File
- テンプレート：試験データ転記、計算結果まとめ用のテンプレート
![スクリーンショット 2021-01-09 174533.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712635/88ab0f34-c15b-6a78-c7c8-90d192f2b850.png)
![スクリーンショット 2021-01-09 174501.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712635/9be568c5-299f-7fc6-9cbd-35cd5080dab7.png)

- 試験データ/Book●：実験データのマスタ
![スクリーンショット 2021-01-09 174411.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712635/f700eb36-f974-b34a-299d-7caa4e65eaaa.png)

##Code
実際に組んだマクロはこちら
ファイルのパスは各自のPCをみて適宜変更すること

※ヘッダーとかは適当に入れているので各値を求める実際の計算式とは異なる。

```
Sub data_calc()
    '用いたい変数を定義
    Dim last_column As Long
    Dim data_amount As Long
    Dim ws1 As Worksheet
    Dim ws2 As Worksheet
    '試験データと結果を入れるフォルダパス
    Const data_path As String = "C:\Users\user\Desktop\マクロ\抽出練習\試験データ\"
    Const result_path As String = "C:\Users\user\Desktop\マクロ\抽出練習\結果まとめ\"
    Dim data_fileName As String
    Dim result_fileName As String
    'data_pathに存在する、拡張子がxlsxのファイルをすべて取ってくる
    data_fileName = Dir(data_path & "*.xlsx")
    Dim fileNumber As Long
    fileNumber = 1
    Do While data_fileName <> ""
        FileCopy "C:\Users\user\Desktop\マクロ\抽出練習\テンプレート.xlsx", "C:\Users\user\Desktop\マクロ\抽出練習\結果まとめ\結果" & fileNumber & ".xlsx"
        result_fileName = "結果" & fileNumber & ".xlsx"
        '結果の中の話
        Workbooks.Open (result_path & result_fileName)
        'オブジェクトの代入はSetを用いる
        Set ws1 = Worksheets("計算結果")
        Set ws2 = Worksheets("コピー先")
        'データの中の話
        Workbooks.Open (data_path & data_fileName)
        data_amount = Range("A1").CurrentRegion.Rows.Count - 1
        Range("A2").Resize(data_amount, 4).Copy Destination:=ws2.Cells(2, 1)
        ActiveWorkbook.Close False
        'テーブルの最下行の行数
        last_column = ws2.Range("A1").CurrentRegion.Rows.Count
        '見出し行を除いたデータ数
        data_amount = last_column - 1
        Dim num As Long
        For num = 2 To last_column
            'データを用いてws1に計算する
            '容量の計算
            ws1.Range("A" & num) = ws2.Range("A" & num) * ws2.Range("B" & num)
            '電力の計算
            ws1.Range("B" & num) = ws2.Range("B" & num) * ws2.Range("C" & num)
        Next num
        data_fileName = Dir
        fileNumber = fileNumber + 1
        ActiveWorkbook.Close True
    Loop
End Sub
```

##実行結果
「結果まとめ」フォルダに試験データのファイル数分結果をまとめたシートが作成できた。
![スクリーンショット 2021-01-09 182254.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712635/92809597-1dc6-99fc-d1e5-6ab7cf4bfe70.png)

![スクリーンショット 2021-01-09 174339.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712635/240f529f-18d4-d22d-100b-d08772e0c7df.png)

![スクリーンショット 2021-01-09 174356.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712635/ceb326bb-f5ed-6e41-1258-cb64231b7ca9.png)

##最後に
ここまで読んでいただきありがとうございました。
もっとこうしたらいいよ、などコメント等ありましたらお待ちしております。
この記事が何かの役に立てれば幸いです。

参考テキスト
[できる イラストで学ぶ 入社1年目からのExcel VBA できる イラストで学ぶシリーズ](https://www.amazon.co.jp/%E3%81%A7%E3%81%8D%E3%82%8B-%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88%E3%81%A7%E5%AD%A6%E3%81%B6-%E5%85%A5%E7%A4%BE1%E5%B9%B4%E7%9B%AE%E3%81%8B%E3%82%89%E3%81%AEExcel-VBA-%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88%E3%81%A7%E5%AD%A6%E3%81%B6%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-ebook/dp/B07L8D5NGC/ref=sr_1_2?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=vba&qid=1610185171&s=books&sr=1-2 "amazon")