エクセルの便利な機能の一つに、複数Excelシートをひとつにすることがありますが、その効率的な利用にはVBAマクロの利用です。VBAマクロを活用して複数Excelシートをひとつに集める方法で、あなたのスキル向上と業務効率化をサポートする情報をお届けします。
目次
VBAマクロを使った複数Excelシートをひとつに集める|利用シーン
複数のExcelファイルのシートから売上データを集めて一つのシートにする。このエクセルVBAマクロで、売上データの集計が手動作業から解放され効率が大幅に向上します。
日々の売上データを担当者別のExcelファイルで管理して、月末でまとめて集計しないといけないとき、いままでのコピペなどの手作業は、一瞬でシートひとつにまとめられるので、大幅な時間短縮になります。
VBAマクロを使った複数Excelシートをひとつに集める|サンプルコード
指定したフォルダ内のすべてのExcelファイルを順番に開き、各ファイルのデータを1つのシートにまとめる処理です。最初のファイルのヘッダー行は一度だけコピーし、それ以降のファイルはデータのみを追加していきます。すべてのファイルを処理し終えると、統合されたデータが1つのシートに集まります。
サンプルのキャプチャ
「挿入」クリック>プルダウン表示>「ユーザーフォーム」クリック>「ツールボックス」からコントロールを選び、デザインした画面(デザインは、上から下、左右がある場合は、1段目右から1段目左、2段目右から2段目左・・・処理順がわかるようにするといいです)
「収集ボタン」をクリック>右クリック>プルダウン表示>コードの表示>ここからコード入力します
コード入力したキャプチャ
サンプルコード
Option Explicit
Private Sub CommandButton1_Click()
Dim ws As Worksheet
Dim FolderPath As String
Dim FilePath As String
Dim lastRow As Long
Dim targetSheet As Worksheet
Dim isFirstFile As Boolean
' 統合先のシートを指定
Set targetSheet = ThisWorkbook.Sheets("SalesData")
' フォルダパスを指定
FolderPath = "C:\Users\User\Desktop\SalesData\"
FilePath = Dir(FolderPath & "*.xlsx")
' 初回ファイルフラグをTrueに設定
isFirstFile = True
' ファイルが存在する限りループ
Do While FilePath <> ""
' ファイルを開いて、最初のシートを取得
Set ws = Workbooks.Open(FolderPath & FilePath).Sheets(1)
' 統合先のシートの最終行を取得
lastRow = targetSheet.Cells(targetSheet.Rows.Count, "A").End(xlUp).Row
If isFirstFile Then
' 見出し行を最初の1回のみコピー
ws.Rows(1).Copy targetSheet.Rows(1)
isFirstFile = False
End If
' データ行をコピー(見出し行を除く)
ws.Range("A2:L" & ws.Cells(ws.Rows.Count, "A").End(xlUp).Row).Copy _
targetSheet.Cells(lastRow + 1, 1)
' ファイルを閉じる(保存しない)
Workbooks(FilePath).Close False
' 次のファイルを取得
FilePath = Dir
Loop
End Sub
営業部から「作業時間がかかりすぎる」と相談された係長の佐藤さん。繰り返し作業を効率化するVBAの必要性を感じていましたが、「難しそう」と一歩を踏み出せずにいました。 実際、VBAを実際に使いこなせる人は5割以下。独学で進められる人は3割程度という調査結果もあり、不安が募るばかり。 そんな中、佐藤さんは「Excel VBAエキスパート資格」の学習を開始。初心者向けの基礎から実践的な応用まで体系的に学べる内容に助けられ、資格取得を目指すことでモチベーションを維持しながらスキルを習得しました。 今では営業部の課題を次々と解決し、職場で信頼される存在に成長した佐藤さん。「難しそう」と感じていた不安はいつしか自信に変わり、業務効率化が職場全体の活気を生むきっかけになりました。 Excel VBAで業務を変える佐藤さんの挑戦 基本的な文法やVBAの実践的な応用までを網羅的に学習できる方法は、ExcelVBAエキスパート資格の取得を目指すこと。学習を通して、より効率的に、着実に基礎を身につけることが可能です。資格取得すれば、スキルの証明にもなり、職場での評価アップにも繋がるため、勉強を進めるモチベーションにもなります。
本サイト参考:マクロ知識がないから「何から学べば良いのかわからない」という人におすすめの記事
VBAマクロを使った複数Excelシートをひとつに集める|サンプルコード解説
ユーザーフォーム
1. Option Explicit
・変数を使用する前に必ず宣言するよう強制する命令です。これにより、スペルミスなどによるエラーを防ぐことができます。
2. Private Sub CommandButton1_Click()
・この行は、Excelのユーザーフォームやシートに配置されたボタン(CommandButton1)がクリックされたときに実行される処理を定義しています。
3. 変数の宣言
Dim ws As Worksheet
Dim FolderPath As String
Dim FilePath As String
Dim lastRow As Long
Dim targetSheet As Worksheet
Dim isFirstFile As Boolean
・ws
現在開いているExcelファイルのシートを指します。
・FolderPath
取り込みたいExcelファイルが格納されているフォルダのパスを文字列として保存します。
・FilePath
現在処理中のファイルのパスを保存します。
・lastRow
データを貼り付ける際に使用するシートの最終行を示します。
・targetSheet
データを統合する対象のシートを指します。
・isFirstFile
最初のファイルかどうかを判別するためのフラグです。
4. 統合先のシートを指定
Set targetSheet = ThisWorkbook.Sheets("SalesData")
・現在のブック(ThisWorkbook)の最初のシートをデータ統合のためのターゲットシートとして設定しています。
5. フォルダパスを指定
FolderPath = "C:\Users\User\Desktop\SalesData\"
FilePath = Dir(FolderPath & "*.xlsx")
・FolderPathには、データを取り込むExcelファイルが保存されているフォルダのパスを設定します。
・FilePathには、フォルダ内の最初のExcelファイルのパスを設定します。Dir(FolderPath & "*.xlsx")は、指定したフォルダ内の全てのExcelファイル(拡張子が.xlsx)を取得します。
6. 初回ファイルフラグを設定
isFirstFile = True
・isFirstFileをTrueに設定することで、最初のファイルかどうかを判別します。最初のファイルの場合のみ、ヘッダー行(見出し行)を統合先にコピーします。
7. ファイルが存在する限りループ
Do While FilePath <> ""
・この行から始まるDo Whileループは、FilePathが空でない限り、つまりフォルダ内に処理すべきファイルが残っている限りループを続けます。
8. ファイルを開いて、最初のシートを取得
Set ws = Workbooks.Open(FolderPath & FilePath).Sheets(1)
・Workbooks.Openでファイルを開き、その中の最初のシートをwsに設定します。このシートからデータをコピーします。
9. 統合先のシートの最終行を取得
lastRow = targetSheet.Cells(targetSheet.Rows.Count, "A").End(xlUp).Row
・targetSheetの列Aの最終行を取得します。データを貼り付ける位置を特定するために使います。
10. 見出し行を最初の1回のみコピー
If isFirstFile Then
ws.Rows(1).Copy targetSheet.Rows(1)
isFirstFile = False
End If
・最初のファイルの場合、シートの1行目(ヘッダー行)をtargetSheetの1行目にコピーします。そしてisFirstFileをFalseに設定して、次のファイルからは見出し行をコピーしないようにします。
11. データ行をコピー(見出し行を除く)
ws.Range("A2:L" & ws.Cells(ws.Rows.Count, "A").End(xlUp).Row).Copy _
targetSheet.Cells(lastRow + 1, 1)
・wsのデータ行(2行目以降)を範囲指定してコピーし、targetSheetのlastRow + 1行目から貼り付けます。これにより、データが順番に追加されていきます。
12. ファイルを閉じる(保存しない)
Workbooks(FilePath).Close False
・データをコピーした後、処理したファイルを保存せずに閉じます。
13. 次のファイルを取得
FilePath = Dir
・Dir関数で次のファイルを取得し、ループが続きます。
14. ループの終了
Loop
・すべてのファイルが処理されるまでループが続き、処理するファイルがなくなるとループが終了します。
このようにして、複数のExcelファイルのシートから、ひとつのExcelファイルのシートひとつに、データをまとめることができます。
Excel VBAで自動化するコードのベースを習得したい方におすすめ!
VBAエキスパート資格は、日常業務でExcelを多用し、手動作業を減らしたいと考えている方には価値あるものです。
ExcelVBAエキスパートベーシック
仕事の効率をあげるためにExcelVBAを利用する人が対象の問題集です。
ExcelVBAエキスパートスタンダード
ExcelVBAの開発を仕事にする人が対象の問題集です。
Excel VBA エキスパート資格について知りたい方は、下記「Excel VBAスキルアップを目指すなら知っておきたいVBAエキスパート」をご確認ください。