VBAで複数のシートをそれぞれ別のファイルに保存するには、シートを ws.Copy でコピーして SaveAs でファイル名をつけて保存する、という流れを繰り返します。シート名がそのままファイル名になるので、シート名を整理しておくのがポイントです。
この記事では、次の内容を順番に解説します。
- 全シートを別ファイルに保存する基本のコード
- 保存先フォルダを自分で選べるようにする方法
- シート名に使えない文字が含まれているときの対処
シートごとに別ファイルとして保存するには?
次のコードを実行すると、マクロファイルと同じフォルダに、シート名がついたExcelファイルが1枚ずつ保存されます。
Sub SaveEachSheetAsFile()
Dim wb As Workbook
Dim ws As Worksheet
Dim newWb As Workbook
Dim path As String
Set wb = ThisWorkbook
path = wb.Path & "¥"
For Each ws In wb.Worksheets
' 表示されているシートだけを対象にする
If ws.Visible = xlSheetVisible Then
' シートをコピーして新しいファイルとして開く
ws.Copy
Set newWb = ActiveWorkbook
' 確認ポップアップを出さずに保存して閉じる
Application.DisplayAlerts = False
newWb.SaveAs Filename:=path & ws.Name & ".xlsx", FileFormat:=xlOpenXMLWorkbook
newWb.Close SaveChanges:=False
Application.DisplayAlerts = True
End If
Next ws
MsgBox "各シートを個別ファイルとして保存しました!"
End Sub
コードの流れ
- マクロが入っているファイルの場所を
wb.Pathで取得して、保存先として使います。 - すべてのシートを左から順番に確認していき、表示されているシートだけを対象にします。
ws.Copyでそのシートだけの新しいファイルを作ります。- シート名をファイル名にして
.xlsx形式で保存します。 Application.DisplayAlerts = Falseは「上書きしますか?」などのポップアップを自動でOKにする設定です。処理が終わったら必ずTrueに戻します。
保存先フォルダを自分で選べるようにするには?
マクロファイルと同じ場所ではなく、毎回保存先を選びたい場合は、前のコードの path の部分をフォルダ選択画面に変えます。
Dim path As String
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "保存先フォルダを選択してください"
If .Show = -1 Then
path = .SelectedItems(1) & "¥"
Else
MsgBox "保存処理を中断しました。"
Exit Sub
End If
End With
この部分をコードの最初に追加して、path = wb.Path & "¥" と入れ替えるだけで対応できます。
シート名に使えない文字が含まれているときは?
ファイル名には使えない記号(¥ / * ? [ ] など)がシート名に含まれていると、保存するときにエラーになります。あらかじめそういった文字を取り除いておくと安心です。
Dim sheetName As String
sheetName = ws.Name
sheetName = Replace(sheetName, "¥", "")
sheetName = Replace(sheetName, "/", "")
sheetName = Replace(sheetName, "*", "")
sheetName = Replace(sheetName, "?", "")
sheetName = Replace(sheetName, "[", "")
sheetName = Replace(sheetName, "]", "")
この処理を追加したら、ws.Name の代わりに sheetName をファイル名として使います。
取り除く記号が多い場合は、次のようにリストにまとめて書く方法もあります。記号を増やしたいときはリストに追加するだけで済むので、管理しやすくなります。
Dim charList As Variant
Dim c As Variant
Dim sheetName As String
sheetName = ws.Name
' 取り除きたい記号をまとめてリストにする
charList = Array("¥", "/", "*", "?", "[", "]")
For Each c In charList
sheetName = Replace(sheetName, c, "")
Next c
まとめ
VBAを使えば、複数のシートをまとめて別ファイルに保存する作業をボタンひとつで終わらせられます。毎月の帳票を部署別に配布するような作業にとても便利です。
- 基本の流れ:
ws.Copyでシートをコピー →SaveAsでシート名をつけて保存 →Closeで閉じる、を全シート分繰り返す。 - 保存先を選びたい場合:
FileDialogと組み合わせてフォルダ選択画面を表示する。 - シート名に記号が含まれている場合:
Replaceで取り除いてからファイル名に使う。
よくある質問
保存したファイルに数式ではなく値だけを入れたい場合は?
シートをコピーしたあと、Cells.Copy → Cells.PasteSpecial xlPasteValues で値だけに変換できます。数式や書式を引き継がずに渡したい場合に使います。
特定のシートだけ保存対象から外したい場合は?
If ws.Visible = xlSheetVisible Then の条件に、シート名のチェックを追加します。たとえば「マスタ」というシートを除きたい場合は If ws.Visible = xlSheetVisible And ws.Name <> "マスタ" Then と書くだけです。
ファイル名に今日の日付をつけたい場合は?
ws.Name & ".xlsx" の部分を ws.Name & "_" & Format(Date, "yyyymmdd") & ".xlsx" に変えると、たとえば「売上_20250901.xlsx」のようなファイル名で保存されます。
保存形式をxlsxではなくマクロ付き(xlsm)にしたい場合は?
FileFormat:=xlOpenXMLWorkbook を FileFormat:=xlOpenXMLWorkbookMacroEnabled に変えて、拡張子も .xlsm にします。ただし、コピーしたシートにマクロが含まれていない場合は .xlsx で保存するのが一般的です。
元のファイルが変わってしまうことはある?
ws.Copy はシートをコピーして新しいファイルを作るだけなので、元のファイルは変わりません。ただし念のため、マクロを実行する前にファイルのバックアップを取っておくと安心です。
動画で学びたい方へ
「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。
VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。



