Excel ブックに複数のワークシートがある場合、シートごとに個別の .xlsx ファイルとして一括保存できると便利です。たとえば部署別シートを各部署に配布するとき、手作業では「シートを右クリック → 移動またはコピー → 新しいブック → 名前を付けて保存」をシートの数だけ繰り返す必要があります。
この記事では、VBA マクロを使ってすべてのワークシートを個別ファイルに分割保存する方法を紹介します。コードをコピーして貼り付けるだけで使えます。
3 つのシート(Tokyo・Osaka・Nagoya)を持つ売上集計ブックです。記事と同じ手順を試すときにお使いください。

マクロの完成コード
以下のコードをコピーして、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. コードを貼り付ける
上の「マクロの完成コード」をコピーし、コードウィンドウに貼り付けます。

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

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

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

コードの解説
このマクロの核心は ws.Copy(引数なし)の挙動です。引数なしで実行すると、そのシートだけを含む新しいブックが自動的に作成されます。
主要行の意味
| コード | 意味 |
|---|---|
ThisWorkbook.Path | マクロが入っているブックの保存先フォルダのパス |
For Each ws In ThisWorkbook.Worksheets | すべてのワークシートを 1 枚ずつ処理するループ。グラフシートは含まれない |
ws.Copy(引数なし) | シートを新しいブックにコピー。実行直後、その新ブックが ActiveWorkbook になる |
ActiveWorkbook.SaveAs | Copy で生成された新ブックを名前を付けて保存 |
xlOpenXMLWorkbook | .xlsx 形式で保存する定数。VBA は含まれない |
ActiveWorkbook.Close False | 保存確認を出さずに新ブックを閉じる |
On Error GoTo Cleanup | エラー発生時に Cleanup ラベルへジャンプし、表示設定を確実に復元する |
ThisWorkbook と ActiveWorkbook の違い
ThisWorkbook は「マクロが書かれているブック」を常に指します。一方 ActiveWorkbook は「今アクティブなブック」で、ws.Copy の直後は Copy で生成された新しいブックに切り替わります。
この違いを理解しておかないと、誤って元のブックを上書きしてしまうことがあります。
Worksheets と Sheets の違い
このマクロは ThisWorkbook.Worksheets をループしているため、処理されるのはワークシートだけです。ブックにグラフシートが含まれている場合、グラフシートは分割の対象になりません。
グラフシートも含めてすべてのシートを分割したい場合は、Worksheets を Sheets に変更し、変数の型を Object に変えてください。
別シートを参照する数式がある場合の注意
元のブックで =Tokyo!B2 のように別シートを参照する数式が含まれている場合、分割後のファイルではその数式が外部参照(=[元ブック名.xlsx]Tokyo!B2)に変わります。
分割後のファイルを開くと「リンクの更新」を確認するダイアログが表示されることがあります。これを避けるには、マクロ実行前に数式を値として貼り付け(ホーム → 貼り付け → 値の貼り付け、またはキーボードで Alt→E→S→V→Enter)で変換しておきます。
カスタマイズ例
特定のシートだけ除外する
「集計」シートや目次シートなど、分割したくないシートがある場合は 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 Case や InStr で条件を追加します。
ファイル名に日付を追加する
ファイル名の先頭に実行日の日付を付けると、いつ分割したかが一目でわかります。同名ファイルの上書きを防ぐ効果もあります。
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 コレクションにはグラフシートが含まれない | Worksheets を Sheets に変更し、変数の型を Object にする |
Excel のシート名には " < > |(ダブルクォーテーション、不等号、パイプ)を使うことができますが、これらは Windows のファイル名としては使えません。シート名にこれらの文字が含まれていると、SaveAs でエラーになります。
心配な場合は、SaveAs の前に Replace 関数でファイル名を安全な文字に置換してください。
まとめ
ws.Copy(引数なし)で、シートを含む新しいブックが自動的に作成される- ループ対象は
Worksheetsコレクション。グラフシートは含まれない ThisWorkbook.Pathで保存先を取得するため、先にブックを保存しておくことが前提- 同名ファイルがすでにある場合は確認なしで上書きされる点に注意
- 別シートを参照する数式がある場合は、分割前に値として貼り付けを推奨
- 特定シートの除外、日付プレフィックスの追加、保存先フォルダの指定など、用途に合わせてカスタマイズ可能
逆に、フォルダ内のバラバラのファイルを 1 つのブックに集約したい場合は、以下の記事を参照してください。
コメント