店舗一覧、支店一覧、物件一覧など、シートをまとめて追加する必要があるものの、数が多すぎて1つ1つ追加してシート名を設定するのが大変...こんな経験はないでしょうか。
この記事では、あらかじめセルに書き出したシート名のリストから、複数シートをまとめて作成する方法をご紹介します。
VBAを使う方法と、VBAに馴染みがない方向けにピボットテーブルを使う方法も記載しています。
この記事の要点
- ピボットテーブルによりシートを一括追加する方法
- 追加したいシート名の一覧をセルにリストとして書き出す
- 上記のリスト範囲を選択し、ピボットテーブルを作成
- 右側の[ピボットテーブル フィールド]で、対象フィールドを[フィルター]にドラッグ
- 画面上部の[ピボットテーブル分析]タブ→[オプション]→[レポート フィルター ページの表示]→表示されるダイアログをOK
- シートが追加されるため、不要な見出しはホームタブ「すべてクリア」等で削除
- VBAによりシートを一括追加する方法
- シートのA1セルから追加したいシート名のリストを記載する
- Alt+F11を押してVBE画面を呼び出し、挿入タブ→標準モジュール
- 記事下部のコードをコピーペーストしてF5キーで実行
以下では画像付きで詳細に説明します。VBAの抵抗がない方はVBAを使った方法を、そうでない方はピボットテーブルを使う方法が便利です。
ピボットテーブルのレポートフィルターページの表示を使う方法
追加したいシート名の一覧をリストに書き出します。

リストに書き出した範囲からピボットテーブルを作成します。
1番上の項目は見出し名となり、その名前のシートは作成されないため、その1つ下から追加したいシート名を記載してください。

右側のピボットテーブル フィールドで、フィールドを[フィルター]にドラッグします。

続いて画面上部[ピボットテーブル分析]タブから、[レポートフィルターページの表示]をクリックします。

[レポートフィルターページの表示]をクリックすると、ダイアログが開くのでOKをクリックします。

フィルターの各項目ごとに、ピボットテーブルを含むシートが自動生成されます。

1行目に不要な項目が記載されているため、グループ化(複数シート選択)してホームタブから「すべてクリア」等で削除します。その後グループ化の解除は忘れないようにご注意ください。

不要な見出しが削除され、白紙のシートが完成します。

VBAを使う方法
シートのA1セルから追加したいシート名のリストを記載します。

そのシートをアクティブにしたまま、以下のコードを実行することで、リスト通りの名称のシート一覧が追加されます。
Alt+F11
挿入タブ→標準モジュール
F5でコード実行
----------------------------------------------------------------------
Option Explicit
Public Sub CreateSheetsFromList()
Dim wsList As Worksheet
Dim lastRow As Long
Dim rng As Range, c As Range
Dim rawName As String, sheetName As String
' リストがあるシート(必要なら変更)
Set wsList = ActiveSheet
' リスト範囲(A1から最終行まで)
lastRow = wsList.Cells(wsList.Rows.Count, "A").End(xlUp).Row
If lastRow < 1 Then Exit Sub
Set rng = wsList.Range("A1:A" & lastRow)
Application.ScreenUpdating = False
Application.DisplayAlerts = False
For Each c In rng.Cells
rawName = Trim$(CStr(c.Value))
If Len(rawName) = 0 Then
GoTo ContinueLoop
End If
sheetName = CleanSheetName(rawName)
If Len(sheetName) = 0 Then
GoTo ContinueLoop
End If
' 既に同名シートがあればスキップ
If Not SheetExists(sheetName) Then
Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = sheetName
End If
ContinueLoop:
Next c
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
Private Function CleanSheetName(ByVal s As String) As String
' Excelシート名として使えない文字を置換し、31文字に切り詰める
Dim bad As Variant, ch As Variant
bad = Array(":", "\", "/", "?", "*", "[", "]")
For Each ch In bad
s = Replace$(s, ch, " ")
Next ch
' 前後空白の除去&連続スペースを詰める
s = Application.WorksheetFunction.Trim(s)
' 先頭/末尾がアポストロフィになるのを避ける(見た目のトラブル回避)
Do While Len(s) > 0 And Left$(s, 1) = "'"
s = Mid$(s, 2)
Loop
Do While Len(s) > 0 And Right$(s, 1) = "'"
s = Left$(s, Len(s) - 1)
Loop
If Len(s) > 31 Then s = Left$(s, 31)
CleanSheetName = s
End Function
Private Function SheetExists(ByVal sheetName As String) As Boolean
Dim ws As Worksheet
On Error Resume Next
Set ws = Worksheets(sheetName)
SheetExists = Not ws Is Nothing
On Error GoTo 0
End Function
----------------------------------------------------------------------
大量のシートを一括で追加したい場合にはぜひお試しください。


