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