Article

【Excel VBA】全ワークシートを個別のブックファイルに分割保存するマクロ

この記事で分かること

Excel ブックの全ワークシートを、シート名をファイル名にした個別の .xlsx ファイルとして一括保存する VBA マクロです。コピペで使える完成コードと、シート除外・日付付与・フォルダ指定のカスタマイズ例を紹介します。

Excel ブックに複数のワークシートがある場合、シートごとに個別の .xlsx ファイルとして一括保存できると便利です。たとえば部署別シートを各部署に配布するとき、手作業では「シートを右クリック → 移動またはコピー → 新しいブック → 名前を付けて保存」をシートの数だけ繰り返す必要があります。

この記事では、VBA マクロを使ってすべてのワークシートを個別ファイルに分割保存する方法を紹介します。コードをコピーして貼り付けるだけで使えます。

この記事で使うサンプルブック

3 つのシート(Tokyo・Osaka・Nagoya)を持つ売上集計ブックです。記事と同じ手順を試すときにお使いください。

3つのシート(Tokyo・Osaka・Nagoya)を持つ元のExcelブック
元のブック。Tokyo・Osaka・Nagoya の 3 シートがある

マクロの完成コード

以下のコードをコピーして、VBE(Visual Basic Editor)の標準モジュールに貼り付けてください。実行すると、元のブックと同じフォルダにシートごとの .xlsx ファイルが作成されます。

Sub SplitSheetsToFiles()
    Dim ws As Worksheet
    Dim savePath As String

    '未保存のブックでは Path が空文字になるため先にチェック
    If ThisWorkbook.Path = "" Then
        MsgBox "先にブックを保存してから実行してください。", vbExclamation
        Exit Sub
    End If

    savePath = ThisWorkbook.Path & ""

    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    On Error GoTo Cleanup

    For Each ws In ThisWorkbook.Worksheets
        ws.Copy  '引数なしで新規ブックにコピー
        ActiveWorkbook.SaveAs savePath & ws.Name & ".xlsx", xlOpenXMLWorkbook
        ActiveWorkbook.Close False
    Next ws

Cleanup:
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True

    If Err.Number <> 0 Then
        '途中でエラーが起きた場合、Copy で開いた新ブックを閉じる
        If ActiveWorkbook.Name <> ThisWorkbook.Name Then
            ActiveWorkbook.Close False
        End If
        MsgBox "エラーが発生しました。" & vbCrLf & _
               "シート名: " & ws.Name & vbCrLf & _
               Err.Description, vbExclamation
    Else
        MsgBox ThisWorkbook.Worksheets.Count & " 個のファイルを作成しました。" & vbCrLf & _
               "保存先: " & savePath, vbInformation
    End If
End Sub
同名ファイルの上書きに注意

このマクロは Application.DisplayAlerts = False の状態で SaveAs を実行するため、保存先に同じ名前のファイルがすでにある場合は確認なしで上書きされます。初回実行で問題なくても、2 回目以降は既存ファイルが置き換わる点に注意してください。

上書きを避けたい場合は、「カスタマイズ例」の日付プレフィックスを付ける方法を使うか、保存先フォルダを毎回変えてください。

マクロの実行手順

VBA マクロを初めて使う方は、以下の手順で実行してください。

手順1. VBE(Visual Basic Editor)を開く

分割したいブックを開いた状態で、キーボードの Alt+F11 を押します。VBE が起動します。

手順2. 標準モジュールを挿入する

VBE のメニューで 挿入標準モジュール をクリックします。右側にコードウィンドウが開きます。

手順3. コードを貼り付ける

上の「マクロの完成コード」をコピーし、コードウィンドウに貼り付けます。

VBEの標準モジュールにマクロコードを貼り付けた状態
標準モジュールにコードを貼り付けた状態

手順4. マクロを実行する

F5 キーを押すか、メニューの 実行Sub/ユーザー フォームの実行 をクリックします。完了すると、作成されたファイル数と保存先がメッセージボックスに表示されます。

マクロ実行完了のメッセージボックス。3個のファイルを作成しました、保存先が表示されている
実行完了メッセージ。ファイル数と保存先が表示される

元のブックと同じフォルダに、シート名がファイル名になった .xlsx ファイルが作成されます。

マクロ実行後のフォルダ。Tokyo.xlsx、Osaka.xlsx、Nagoya.xlsx の3ファイルが生成されている
実行後のフォルダ。シートごとの .xlsx ファイルが生成された

生成されたファイルを開くと、元のシートのデータがそのままコピーされています。

分割されたTokyo.xlsxの中身。元のTokyoシートのデータがそのまま入っている
分割された Tokyo.xlsx。元のデータがそのまま保持されている

コードの解説

このマクロの核心は ws.Copy(引数なし)の挙動です。引数なしで実行すると、そのシートだけを含む新しいブックが自動的に作成されます。

主要行の意味

コードの読み方
コード意味
ThisWorkbook.Pathマクロが入っているブックの保存先フォルダのパス
For Each ws In ThisWorkbook.Worksheetsすべてのワークシートを 1 枚ずつ処理するループ。グラフシートは含まれない
ws.Copy(引数なし)シートを新しいブックにコピー。実行直後、その新ブックが ActiveWorkbook になる
ActiveWorkbook.SaveAsCopy で生成された新ブックを名前を付けて保存
xlOpenXMLWorkbook.xlsx 形式で保存する定数。VBA は含まれない
ActiveWorkbook.Close False保存確認を出さずに新ブックを閉じる
On Error GoTo Cleanupエラー発生時に Cleanup ラベルへジャンプし、表示設定を確実に復元する

ThisWorkbook と ActiveWorkbook の違い

ThisWorkbook は「マクロが書かれているブック」を常に指します。一方 ActiveWorkbook は「今アクティブなブック」で、ws.Copy の直後は Copy で生成された新しいブックに切り替わります。

この違いを理解しておかないと、誤って元のブックを上書きしてしまうことがあります。

Worksheets と Sheets の違い

このマクロは ThisWorkbook.Worksheets をループしているため、処理されるのはワークシートだけです。ブックにグラフシートが含まれている場合、グラフシートは分割の対象になりません。

グラフシートも含めてすべてのシートを分割したい場合は、WorksheetsSheets に変更し、変数の型を Object に変えてください。

別シートを参照する数式がある場合の注意

注意

元のブックで =Tokyo!B2 のように別シートを参照する数式が含まれている場合、分割後のファイルではその数式が外部参照=[元ブック名.xlsx]Tokyo!B2)に変わります。

分割後のファイルを開くと「リンクの更新」を確認するダイアログが表示されることがあります。これを避けるには、マクロ実行前に数式を値として貼り付けホーム貼り付け値の貼り付け、またはキーボードで AltESVEnter)で変換しておきます。

カスタマイズ例

特定のシートだけ除外する

「集計」シートや目次シートなど、分割したくないシートがある場合は If 文で除外できます。

Sub SplitSheetsExclude()
    Dim ws As Worksheet
    Dim savePath As String

    If ThisWorkbook.Path = "" Then
        MsgBox "先にブックを保存してから実行してください。", vbExclamation
        Exit Sub
    End If

    savePath = ThisWorkbook.Path & ""

    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    On Error GoTo Cleanup

    For Each ws In ThisWorkbook.Worksheets
        If ws.Name <> "Summary" Then  '除外するシート名を指定
            ws.Copy
            ActiveWorkbook.SaveAs savePath & ws.Name & ".xlsx", xlOpenXMLWorkbook
            ActiveWorkbook.Close False
        End If
    Next ws

Cleanup:
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
    If Err.Number <> 0 Then
        If ActiveWorkbook.Name <> ThisWorkbook.Name Then ActiveWorkbook.Close False
        MsgBox "エラー: " & Err.Description, vbExclamation
    Else
        MsgBox "完了しました。", vbInformation
    End If
End Sub

複数のシートを除外したい場合は、Select CaseInStr で条件を追加します。

ファイル名に日付を追加する

ファイル名の先頭に実行日の日付を付けると、いつ分割したかが一目でわかります。同名ファイルの上書きを防ぐ効果もあります。

Sub SplitSheetsWithDate()
    Dim ws As Worksheet
    Dim savePath As String
    Dim prefix As String

    If ThisWorkbook.Path = "" Then
        MsgBox "先にブックを保存してから実行してください。", vbExclamation
        Exit Sub
    End If

    savePath = ThisWorkbook.Path & ""
    prefix = Format(Date, "yyyymmdd") & "_"

    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    On Error GoTo Cleanup

    For Each ws In ThisWorkbook.Worksheets
        ws.Copy
        ActiveWorkbook.SaveAs savePath & prefix & ws.Name & ".xlsx", xlOpenXMLWorkbook
        ActiveWorkbook.Close False
    Next ws

Cleanup:
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
    If Err.Number <> 0 Then
        If ActiveWorkbook.Name <> ThisWorkbook.Name Then ActiveWorkbook.Close False
        MsgBox "エラー: " & Err.Description, vbExclamation
    Else
        MsgBox "完了しました。", vbInformation
    End If
End Sub

たとえば 2026 年 4 月 12 日に実行すると、20260412_Tokyo.xlsx のようなファイル名になります。

保存先フォルダを選択する

元のブックと違うフォルダに保存したい場合は、フォルダ選択ダイアログを使います。

Sub SplitSheetsToFolder()
    Dim ws As Worksheet
    Dim savePath As String

    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "保存先フォルダを選択してください"
        If .Show = 0 Then Exit Sub  'キャンセル時
        savePath = .SelectedItems(1) & ""
    End With

    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    On Error GoTo Cleanup

    For Each ws In ThisWorkbook.Worksheets
        ws.Copy
        ActiveWorkbook.SaveAs savePath & ws.Name & ".xlsx", xlOpenXMLWorkbook
        ActiveWorkbook.Close False
    Next ws

Cleanup:
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
    If Err.Number <> 0 Then
        If ActiveWorkbook.Name <> ThisWorkbook.Name Then ActiveWorkbook.Close False
        MsgBox "エラー: " & Err.Description, vbExclamation
    Else
        MsgBox "完了しました。" & vbCrLf & "保存先: " & savePath, vbInformation
    End If
End Sub

うまく動かないときの確認ポイント

症状原因対処
「先にブックを保存して…」と表示されるマクロ実行前にブックが未保存ブックを名前を付けて保存してから実行する
実行時エラー 1004 が出るシート名にファイル名で使えない文字(" < > |)が含まれているシート名を変更するか、コード内で Replace 関数を使って置換する
分割後のファイルにマクロが含まれているSaveAs の形式が xlOpenXMLWorkbook.xlsx)でない第 2 引数に xlOpenXMLWorkbook を指定する
数式が壊れている・リンクの更新を求められる別シートを参照する数式が外部参照に変わったマクロ実行前に数式を値に変換しておく
グラフシートが分割されないWorksheets コレクションにはグラフシートが含まれないWorksheetsSheets に変更し、変数の型を Object にする
シート名の禁止文字について

Excel のシート名には " < > |(ダブルクォーテーション、不等号、パイプ)を使うことができますが、これらは Windows のファイル名としては使えません。シート名にこれらの文字が含まれていると、SaveAs でエラーになります。

心配な場合は、SaveAs の前に Replace 関数でファイル名を安全な文字に置換してください。

まとめ

  • ws.Copy(引数なし)で、シートを含む新しいブックが自動的に作成される
  • ループ対象は Worksheets コレクション。グラフシートは含まれない
  • ThisWorkbook.Path で保存先を取得するため、先にブックを保存しておくことが前提
  • 同名ファイルがすでにある場合は確認なしで上書きされる点に注意
  • 別シートを参照する数式がある場合は、分割前に値として貼り付けを推奨
  • 特定シートの除外、日付プレフィックスの追加、保存先フォルダの指定など、用途に合わせてカスタマイズ可能

逆に、フォルダ内のバラバラのファイルを 1 つのブックに集約したい場合は、以下の記事を参照してください。

【Excel VBA】フォルダ内の全ブックからセルの値を集めるマクロ

コメント