EXCEL VBAで一括集計プログラムシート「かんたん一括集計クン」を作る（初心者向け）

# この記事はなにか

割と[以前書いた記事](https://qiita.com/takachan_coding/items/2acee1271556b7671eb4)の閲覧数がいい感じなので、
EXCELでの取りまとめ業務の効率化のために作った一括集計機能のマクロ、
その名も**かんたん一括集計クン**を記事化したものです。

# 作成した背景

上から突如降りかかる「これ〇〇までに取りまとめ（ヒアリング）よろしく～」という大号令。しかも大量に。
EXCELという名の集計フォーマットで末端まで行くと数百・数千の取りまとめ先があるものの、少しでも楽をしたい&してもらいたい。
どげんかせんといかんということで週末サンマルクに籠もり、この一括集計プログラムシートを作成。

[一括印刷プログラムシート](https://qiita.com/takachan_coding/items/2acee1271556b7671eb4)よりは汎用性は低いかもですが、
そのままでも使えますし、色々アレンジしても使えるかと思います。
私と同じ業務効率化が趣味の方、ぜひご活用ください！

# 使用イメージ

まとめましたので下記ご覧ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/6f49948f-f7f5-fabb-009a-b0b091a5ef51.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/15418be0-d3d9-47f2-fa88-b67d7e3c8074.png)

補足

- シート全体を集計…同じフォーマットを埋め合わせるイメージ（通常の取りまとめ）
- 継ぎ足し…どんどん下に継ぎ足すイメージ（データ加工などでよく使用）

# 「かんたん一括集計クン」の作り方

【作成手順】
1. Excelファイルを作成（拡張子は*.xlsm）
2. 一括集計ユーザーフォームの作成
3. 一括集計機能起動ボタンの作成
（尚、MacのExcelではユーザーフォームが使えないと思うのでWindowsでお願いします…）

## 1. EXCELファイルを作成
マクロ有効ファイルの拡張子（*.xlsm）で作成します。
ファイル名はなんでも大丈夫です！ Ex)一括集計クンプログラムシート.xlsm

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/66bc57c5-238a-573a-b218-088ad9ab8593.png)

## 2. 一括集計ユーザーフォームの作成

開発タブ→Visual Basic→VBA project(一括集計クンプログラムシート.xlsm)→
右クリック→挿入→UserFormを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/f38db739-0827-d8c5-2018-c5bd6a6fcd32.png)

そうするとユーザーフォームの雛形ができたと思います。
オブジェクト名はそのまま`UserForm1`としてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/b2330adc-2030-5e0f-318e-bafc14e37f29.png)

以下の画像の様にユーザーフォームを作成します。必要なのはボタンの部分だけですのでほかは省いても大丈夫です。
逆にボタン`CommandButton1`（シート全体を集計）、`CommandButton2`（継ぎ足し集計）は使用するので必ず設置してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/1715ac28-465c-eb79-2df4-80df30f647fa.png)

フォームをダブルクリックするとコードが表示されます。
そこに以下のコードを貼り付けてください。

```.vb
Private Sub CommandButton1_Click()

    '■ シート全体を集計 ■
    Application.ScreenUpdating = False '画面更新を停止してスピードアップする
        
    Dim i As Long
    Dim bookname As String
    Dim matomesheet As Workbook
    Set matomesheet = ActiveWorkbook
        
    For i = 1 To 500
        
        On Error GoTo myerror
            
        bookname = Dir(ThisWorkbook.Path & "\未処理\")
        Workbooks.Open ThisWorkbook.Path & "\未処理\" & bookname '「未処理」からひとつのファイルを選んで開く
            
        If ActiveSheet.FilterMode = True Then
            ActiveSheet.ShowAllData 'フィルターがかかっていたら解除する
        End If
            
        Cells.Select '全てのセルを選択
        Selection.Copy 'コピーする
        
        matomesheet.Activate  '一括集計クンブックを開く
        Worksheets("まとめシート").Activate  'まとめシートを開く
        Cells.Select  '全てのセルを選択する
        Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
            True, Transpose:=False '貼り付けを行う（コピー元の空欄は無視する）
            
        bookname = Dir(ThisWorkbook.Path & "\未処理\")
        Workbooks.Open ThisWorkbook.Path & "\未処理\" & bookname  '「未処理」からひとつのファイルを選んで開く
            
        ActiveWorkbook.Close savechanges:=True 'シートを保存して閉じる
        Name ThisWorkbook.Path & "\未処理\" & bookname _
        As ThisWorkbook.Path & "\処理済\" & bookname '処理が終わったファイルを「未処理」から「処理済」に移す
                
    Next
         
myerror:
    Cells.Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
    Application.CutCopyMode = False
    Range("A1").Select
    MsgBox "完了しました"  '「完了しました」と表示
    
End Sub


Private Sub CommandButton2_Click()

    '■ 継ぎ足しで集計 ■
    '★『元シートによって要変更』★という箇所はファイルによって変更ください｡デフォルトは60列まで集計。

Application.ScreenUpdating = False '画面更新を停止してスピードアップする
    
    Dim i As Long
    Dim bookname As String
    Dim rw As Long
    Dim matomesheet As Workbook
    Set matomesheet = ActiveWorkbook
    
    For i = 1 To 500
        
        On Error GoTo myerror
            
        bookname = Dir(ThisWorkbook.Path & "\未処理\")
        Workbooks.Open ThisWorkbook.Path & "\未処理\" & bookname '「未処理」からひとつのファイルを選んで開く
        
        If ActiveSheet.FilterMode = True Then
            ActiveSheet.ShowAllData 'フィルターがかかっていたら解除する
        End If
        
        Rows.Hidden = False '行の非表示を解除
        Columns.Hidden = False '列の非表示を解除
            
        rw = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).row + 1  '一番最後の行の数値を取得する
        Range(Cells(1, 1), Cells(rw, 60)).Select 'A1からAI（60列目）の最終行までの範囲（コピーしたい範囲）を選択★『元シートによって要変更』★
        Selection.Copy '選択した範囲をコピーする
            
        matomesheet.Activate  '一括集計クンブックを開く
        Worksheets("まとめシート").Activate  'まとめシートを開く
            
        rw = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).row + 1  '一番最後の行の数値を取得する
        Cells(rw, 1).Select '記入されている一番最後のセルの一つ下を選択
            
        Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
            True, Transpose:=False '貼り付けを行う（コピー元の空欄は無視する）
            
        bookname = Dir(ThisWorkbook.Path & "\未処理\")
        Workbooks.Open ThisWorkbook.Path & "\未処理\" & bookname  '「未処理」からひとつのファイルを選んで開く
            
        ActiveWorkbook.Close savechanges:=True 'シートを保存して閉じる
        Name ThisWorkbook.Path & "\未処理\" & bookname _
        As ThisWorkbook.Path & "\処理済\" & bookname '処理が終わったファイルを「未処理」から「処理済」に移す
        
    Next
         
myerror:
        MsgBox "完了しました"  '「完了しました」と表示
        
        '★ここからはシート再計算、セル分割、計算式を値に変更のマクロ
        
        ActiveSheet.Calculate
        Cells.Select
        Selection.UnMerge
        Cells.Select
        Selection.Copy
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
        Application.CutCopyMode = False
        Range("A1").Select
    
End Sub

```

以上でユーザーフォームの設定は終わりです！

## 3. 一括集計機能起動ボタンの作成

先程ユーザーフォームを作った要領と同じやり方でモジュールを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/0494288f-6ce7-fcb7-b3b3-09c89a01b644.png)

作成したモジュールの名前はそのまま`Module1`にしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/226cfcc7-a706-a0e8-fcff-77e2cb605670.png)

モジュールをダブルクリックし、コード編集画面を開いて下記コードをコピペします。

```.vb
Sub かんたん一括集計クン表示()

    Dim ws As Worksheet
    Dim flag As Boolean
    UserForm1.Show vbModeless
    
    On Error Resume Next
    MkDir (ThisWorkbook.Path & "\未処理\")  '「未処理」フォルダーを作る
    On Error Resume Next
    MkDir (ThisWorkbook.Path & "\処理済\")  '「処理済」フォルダーを作る
    
    For Each ws In Worksheets
    
      If ws.Name = "まとめシート" Then flag = True
    
    Next ws
    
    If flag = True Then
    
        Sheets("まとめシート").Visible = True
        Sheets("まとめシート").Activate
        MsgBox "「まとめシート」にデータが集計されます。" & vbCrLf & "未処理フォルダに集計したいファイルを入れ、" & vbCrLf & "集計したい種類のボタンを押してください。"
    
        Exit Sub
    
    Else
    
        ActiveWorkbook.Sheets.Add
        On Error Resume Next
        ActiveSheet.Name = "まとめシート"
    
        MsgBox "「まとめシート」にデータが集計されます。" & vbCrLf & "未処理フォルダに集計したいファイルを入れ、" & vbCrLf & "集計したい種類のボタンを押してください。"
    
    End If

End Sub
```

次に、シート上に起動するためのボタンを作成します。シート名はそのままSheet1でも起動シートでも何でもかまいません。
シートに戻り、開発タブ→挿入→左上のボタンのアイコンをクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/03bba130-f1a9-fa30-cc34-b86f23d80f94.png)

以下の図のようにボタンを設置し、マクロを割り当てます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/2b927f47-e6f8-5802-1526-a5e034b0ddc9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/19703ac6-45a0-776e-a3ea-acb349313e0a.png)

以上で完成です！
起動ボタンを押して作成したユーザーフォームが出てくれば完成です！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/e6990fc0-aad5-fc1d-11a2-43d4e69b5e43.png)

取りまとめ用のシートは`まとめシート`という名前で自動で挿入されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/4774dfa6-7338-27b5-f52f-7f55788d0516.png)

また、同じフォルダ内に`未処理`と`処理済`フォルダが生成されます。
使用する場合は、取りまとめたいファイルを`未処理`フォルダに入れて処理を実行してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/c8246689-eee8-92d3-dba1-cafcab1e7d3c.png)

# 所感

EXCELでの集計というのは時に非常に難しく感じます。
WEBアプリとかGoogleフォームで集計できれば良いのでしょうが、それができない場合もあります。
また、フォーマットに制限かけているにもかかわらずかなり自由にアレンジしてくる方もいらっしゃいます。
結局のところ、そのような想定もしっかり行った上で準備をする、
取りまとめる側の事前の発信の方法ですべてが決まってくるのかもしれません。
それだけ**責任が大きいもの**だということですね！

できなかったり、不明点などあればコメント欄などに記載ください。