shikumika’s diary

日々の事務作業で手間なことを簡単にできる仕組み(自動化、方法など)、困ったことの解決方法を調べた備忘録

【Excel VBA】複数ブックのシートを一つのブックにまとめるサンプル

Excelのデータ集計業務は、Power Queryを使うことで効率化が図れる場面が多くあります。

しかし、Power Queryでは扱いにくいデータ操作もあり、自動化を考慮するとVBAの活用が効率的となることもあります。

特に、いわゆる「神エクセル」と言われるような、紙印刷のレイアウトを前提にしたExcelシートの集計は、Power Queryでも集計が難しい(慣れの問題と思うが、VBAの方が容易な印象)。

データ収集の段階で集計しやすい回収方法に変更できることが理想ですが、「紙印刷のレイアウトのExcelシートに記入依頼、回収、転記・集計する」という場面も、まだ多い状況。このような状況なので、VBAを使用した効率化の備忘録。

今回は、複数ブックのシートを 一つのブックにまとめるVBAのサンプル。

 

サンプルの前提

  • 紙印刷のレイアウト 「単票形式」(1票1枚)を前提にしたExcelシートが複数ある。
  • 各ファイルには、シート「日報」があり、他にシートはない。
  • ファイル名はそれぞれ異なる名称。
    シート名はファイル名称(拡張子なし)に変更。

これらを一つのブックにまとめるまでを実施。後工程はExcelの「3D参照(串刺し計算)」機能や、追加でVBAでの処理等を想定。

複数のファイルがあり、中身は同じ様式のファイル

サンプルの前提イメージ

VBAサンプル

Option Explicit
Option Base 1
    Dim 対象ファイル名 As Variant
    Dim 対象ブック As Workbook
    Dim 対象シート As Worksheet
    Dim i As Long

Sub 複数のブックを一つにまとめる()
              
'ファイルの読み込み'
    対象ファイル名 = Application.GetOpenFilename( _
        FileFilter:="(*.xls; *.xlsx), *.xls; *.xlsx", _
        Title:="読み込むブックを選択して下さい(複数選択可)", _
        MultiSelect:=True)
    If TypeName(対象ファイル名) = "Boolean" Then Exit Sub
        
    Application.ScreenUpdating = False

    For i = 1 To UBound(対象ファイル名)
        Application.StatusBar = i & " / " & UBound(対象ファイル名) & " ファイル処理中"
             
        Workbooks.Open fileName:=対象ファイル名(i), ReadOnly:=True
        Set 対象ブック = ActiveWorkbook
        Set 対象シート = 対象ブック.ActiveSheet
        対象シート.Name = Left(対象ブック.Name, InStrRev(対象ブック.Name, ".") - 1)
        対象シート.Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
        対象ブック.Close SaveChanges:=False
    
    Next i

    Application.StatusBar = False
    Application.ScreenUpdating = True

End Sub

サンプルの補足説明

高速化と進捗状況を把握するため、「Application.ScreenUpdating」「Application.StatusBar」も利用。

なお、紙印刷のレイアウト 「単票形式」(1票1枚)ではなくリスト形式のような場合は、Power Queryが適している見込。

以上、Excel VBAで、複数ブックのシートを一つのブックにまとめるサンプルでした。

 

また、Excelで複数ブックのデータ(単票)を一覧表にまとめる方法にはいくつかの選択肢があるので以下に対応例をまとめました。

shikumika.org