エクセルVBAマクロで複数Excelシートをひとつに集める方法

 

エクセルの便利な機能の一つに、複数Excelシートをひとつにすることがありますが、その効率的な利用にはVBAマクロの利用です。VBAマクロを活用して複数Excelシートをひとつに集める方法で、あなたのスキル向上と業務効率化をサポートする情報をお届けします。

 

 

VBAマクロを使った複数Excelシートをひとつに集める|利用シーン

複数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マクロを使った複数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で自動化し、時間を有効活用しませんか?Excel VBAエキスパート資格取得問題集を活用して資格取得、そして効率的な仕事を実現しましょう!

VBAエキスパート資格は、日常業務でExcelを多用し、手動作業を減らしたいと考えている方には価値あるものです。

ExcelVBAエキスパートベーシック
仕事の効率をあげるためにExcelVBAを利用する人が対象の問題集です。


ExcelVBAエキスパートスタンダード

ExcelVBAの開発を仕事にする人が対象の問題集です。

 

Excel  VBA エキスパート資格について知りたい方は、下記「Excel VBAスキルアップを目指すなら知っておきたいVBAエキスパート」をご確認ください。

 

ExcelVBAの学習方法で効果的な学び方を知りたい方は、下記「Excel VBA初心者のための効果的な学習ガイド」をご確認ください。

 

 

この記事はお役に立ちましたか?さらに詳しく知りたいことや、エクセルVBAマクロで取り上げてほしい内容があれば、以下の「ExcelVBAアンケート」から、是非お知らせください。※「ExcelVBAアンケート」は別ウインドウで開きます

ここであげたエクセルVBAマクロで効率化できるコードは、ほんの一部に過ぎません。VBAコードをさらに習得し、業務効率を飛躍的に向上させたい方は、VBAエキスパート資格に挑戦してみませんか?下記のボタンをクリックして、VBAのスキルを次のレベルへ引き上げましょう!