VBAでシートごとに別ファイルに保存する方法|全シートを自動で一括保存するマクロ

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.CopyCells.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:=xlOpenXMLWorkbookFileFormat:=xlOpenXMLWorkbookMacroEnabled に変えて、拡張子も .xlsm にします。ただし、コピーしたシートにマクロが含まれていない場合は .xlsx で保存するのが一般的です。

元のファイルが変わってしまうことはある?

ws.Copy はシートをコピーして新しいファイルを作るだけなので、元のファイルは変わりません。ただし念のため、マクロを実行する前にファイルのバックアップを取っておくと安心です。


動画で学びたい方へ

「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。

VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。

動画で学ぶExcelマクロ|JIMOVEオンラインスクール

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール