【VBAリファレンス】Excel VBAで複数ブックからデータを自動収集する:業務効率を極限まで高める実践テクニック

スポンサーリンク

概要

日々の業務で、各部署から送られてくる数十、数百のExcelファイルを開き、手作業で「コピペ」を繰り返していませんか?これは、多くの事務職や管理職が抱える「定型作業の悪夢」です。Excel VBAを活用すれば、この作業を数秒で完了させることが可能です。本稿では、指定したフォルダ内の複数ブックからデータを自動的に抽出し、集約用ブックに転記するプロフェッショナルな手法を解説します。単に動くコードを書くのではなく、エラーに強く、拡張性の高いプログラムを構築するための設計思想を学びましょう。

詳細解説:複数ブック集約の設計思想

複数ブックからデータを集める仕組みは、大きく分けて「FileSystemObject(FSO)によるファイル探索」と「ブックの開閉制御」、そして「データ転記の最適化」という3つのフェーズで構成されます。

多くの初心者が陥る罠は、毎回ブックを「開いて、選択して、コピーして、閉じる」という手順を繰り返すことです。これでは画面描画が発生し、処理が極端に低速化します。プロフェッショナルな設計では、`Application.ScreenUpdating = False` を使用して画面描画を停止させ、さらに `Application.DisplayAlerts = False` で保存確認メッセージを抑制することで、処理速度を劇的に向上させます。

また、ファイルパスをハードコーディング(コードに直接記述)するのは厳禁です。実行時にユーザーがフォルダを選択できる `FileDialog` オブジェクトを使用し、汎用性の高いツールを作成することが重要です。

サンプルコード:フォルダ内全ブックのデータ集約

以下のコードは、選択したフォルダ内の全Excelファイルをループ処理し、特定のシートからデータを取得して、実行ブックの「集約シート」に追記していく標準的な構成です。


Sub CollectDataFromFiles()
    Dim fso As Object
    Dim folderPath As String
    Dim targetFolder As Object
    Dim fileItem As Object
    Dim wb As Workbook
    Dim wsMaster As Worksheet
    Dim lastRowMaster As Long
    Dim lastRowData As Long
    
    ' 画面更新を停止して高速化
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    
    ' フォルダ選択ダイアログの表示
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "集約するファイルが入っているフォルダを選択してください"
        If .Show = -1 Then
            folderPath = .SelectedItems(1)
        Else
            Exit Sub
        End If
    End With
    
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set targetFolder = fso.GetFolder(folderPath)
    Set wsMaster = ThisWorkbook.Sheets("集約シート")
    
    ' フォルダ内の全ファイルをループ
    For Each fileItem In targetFolder.Files
        ' Excelファイルのみを対象にする
        If LCase(fso.GetExtensionName(fileItem.Name)) Like "xls*" Then
            ' 非表示でブックを開く
            Set wb = Workbooks.Open(fileItem.Path, ReadOnly:=True)
            
            ' データシートから情報を取得(例:1シート目)
            With wb.Sheets(1)
                lastRowData = .Cells(.Rows.Count, 1).End(xlUp).Row
                ' ヘッダーを除いて転記
                If lastRowData > 1 Then
                    lastRowMaster = wsMaster.Cells(wsMaster.Rows.Count, 1).End(xlUp).Row + 1
                    .Range("A2:D" & lastRowData).Copy wsMaster.Cells(lastRowMaster, 1)
                End If
            End With
            
            wb.Close SaveChanges:=False
        End If
    Next fileItem
    
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
    
    MsgBox "データの収集が完了しました。", vbInformation
End Sub

実務アドバイス:堅牢性を高めるためのチェックリスト

コードを実務で運用する際は、以下のポイントを必ず確認してください。

1. **データ形式の不整合への対策**:各ブックのレイアウトが微妙に異なる場合、そのままコピーすると集約シートが崩れます。列のインデックスを固定するのではなく、ヘッダー名を検索して列番号を動的に取得する(`Match`関数を使用する)仕組みを導入しましょう。
2. **エラーハンドリングの徹底**:ブックが破損している場合や、パスワードで保護されている場合、プログラムは強制終了します。`On Error Resume Next` を適切に配置し、エラーが発生したファイル名をログに出力して処理を継続する設計が不可欠です。
3. **パスの正規化**:ファイルパスの末尾に「\」が含まれているか否かでエラーになることがよくあります。`fso.BuildPath` メソッドを使用すると、OSの仕様を意識せずに安全にパスを結合できます。
4. **メモリ解放の意識**:大規模なデータを扱う場合、オブジェクト変数の解放(`Set wb = Nothing`)を忘れずに行いましょう。Excelはメモリ消費が激しいアプリケーションであるため、不要な参照を保持し続けるとクラッシュの原因となります。

さらなるレベルアップに向けて

上記コードは「コピー&ペースト」を基本としていますが、さらに高度な手法として「Power Query」との併用を推奨します。VBAは「ファイルを開いて加工する」という柔軟な自動化が得意ですが、単純な集計作業であればPower Queryの方が高速で、かつメンテナンスも容易です。

VBAの真価は、Power Queryでは対応できない「複雑な条件分岐が必要な転記」や「転記後に特定の計算式を埋め込む」といった動的な処理にあります。つまり、すべての作業をVBAで行うのではなく、「Power Queryで下処理を行い、仕上げにVBAで制御する」といったハイブリッドな設計こそが、現代のExcel業務におけるベストプラクティスです。

まとめ

複数ブックからのデータ集約は、VBA習得の登竜門であり、かつ実務での費用対効果が最も高いタスクの一つです。今回紹介したFileSystemObjectによるファイル巡回と、画面更新停止による高速化手法をマスターすれば、あなたのExcelスキルは飛躍的に向上します。

重要なのは、コードを書くことそのものよりも、「どの作業が繰り返されているのか」「どのデータが可変なのか」を整理する論理的思考です。まずはこのサンプルコードをベースに、ご自身の業務に合わせて書き換えてみてください。エラーを一つずつ解決していく過程こそが、あなたを真のVBAエンジニアへと成長させる最短ルートです。明日からの業務が、クリック一つで終わる快感をぜひ体験してください。

タイトルとURLをコピーしました