シートを追加する
「新しいシートを作る」「末尾に入れる」「名前を付ける」「複数追加する」——初心者がつまずきやすいポイントを、確実に動くコード例とテンプレートでわかりやすく解説します。
基本:最短でシートを1枚追加する
すぐ試せる最小コード
Sub AddSheet_Basic()
Sheets.Add 'アクティブなシートの前に1枚追加
End Sub
VB- ポイント:
Sheets.Add(またはWorksheets.Add)で追加できます。引数なしだと「今アクティブなシートの直前」に新規シートが入ります。Worksheetsはワークシート限定、Sheetsはグラフシートなども含むコレクションです。
位置を指定して追加する
先頭/末尾に追加
Sub AddSheet_Position()
'先頭に追加
Sheets.Add Before:=Sheets(1)
'末尾に追加
Sheets.Add After:=Sheets(Sheets.Count)
End Sub
VB- ポイント:
BeforeかAfterに既存シートを指定します。末尾はSheets.Countで最後のシートを指すのが定番です。- 慣例的に「出力シート」は末尾に追加すると見つけやすく管理しやすいです。
名前を付けて追加する(重複・禁止文字に配慮)
追加してすぐ命名
Sub AddSheet_WithName()
Dim ws As Worksheet
Set ws = Worksheets.Add(After:=Worksheets(Worksheets.Count))
ws.Name = "月次レポート"
End Sub
VB- ポイント:
Worksheets.Addの返り値(追加されたシート)をWorksheet変数に受け取り、Nameで命名します。- シート名は重複不可。禁止文字(: / \ ? * [ ])と31文字上限に注意しましょう。
安全テンプレート:なければ作る、あれば再利用
Try-Add命名の基本雛形
Function GetOrCreateSheet(sheetName As String, Optional wb As Workbook) As Worksheet
Dim ws As Worksheet
If wb Is Nothing Then Set wb = ThisWorkbook
'既存確認(エラー回避)
On Error Resume Next
Set ws = wb.Worksheets(sheetName)
On Error GoTo 0
If ws Is Nothing Then
Set ws = wb.Worksheets.Add(After:=wb.Worksheets(wb.Worksheets.Count))
'安全な名前に整形してから命名
ws.Name = SanitizeSheetName(sheetName, wb)
End If
Set GetOrCreateSheet = ws
End Function
Function SanitizeSheetName(rawName As String, wb As Workbook) As String
Dim safe As String
safe = rawName
'禁止文字を置換
safe = Replace(safe, ":", "_")
safe = Replace(safe, "/", "_")
safe = Replace(safe, "\", "_")
safe = Replace(safe, "?", "_")
safe = Replace(safe, "*", "_")
safe = Replace(safe, "[", "_")
safe = Replace(safe, "]", "_")
'長さ制限(31文字)
If Len(safe) > 31 Then safe = Left$(safe, 31)
'重複回避(末尾に連番)
Dim i As Long
Dim base As String: base = safe
i = 1
Do While SheetExists(safe, wb)
i = i + 1
If Len(base) > 28 Then
safe = Left$(base, 28) & "_" & CStr(i)
Else
safe = base & "_" & CStr(i)
End If
Loop
SanitizeSheetName = safe
End Function
Function SheetExists(name As String, wb As Workbook) As Boolean
Dim t As Worksheet
On Error Resume Next
Set t = wb.Worksheets(name)
SheetExists = Not t Is Nothing
On Error GoTo 0
End Function
VB- ポイント:
- 「存在チェック → 追加 → 命名」をひとまとめ。使い回ししやすい定番テンプレート。
- 禁止文字と31文字制限、重複時の連番付与まで面倒を見ます。
Worksheets.Addの返り値を受けると、そのシートだけに続けて操作しやすいです。
複数枚を一気に追加する
指定枚数を連続追加
Sub AddMultipleSheets(countToAdd As Long)
Dim i As Long
For i = 1 To countToAdd
Worksheets.Add After:=Worksheets(Worksheets.Count)
Next i
End Sub
VB- ポイント:
- 単純ループでOK。末尾追加に統一すると管理しやすいです。
名前リストから一括追加(重複・禁止文字対応)
Sub AddSheetsFromArray()
Dim names As Variant
names = Array("売上", "在庫/速報", "顧客一覧", "週報*2025")
Dim i As Long
Dim ws As Worksheet
For i = LBound(names) To UBound(names)
Set ws = GetOrCreateSheet(CStr(names(i)))
'追加直後に初期レイアウトなどの設定も可能
ws.Range("A1").Value = "初期化済み"
Next i
MsgBox "追加(または再利用)が完了しました。"
End Sub
VB- ポイント:
- バラついた入力名にも強い。既存なら再利用、なければ安全に命名して作成。
- 「初期化」や見出しの書き込みなどをループ内で並行して行うのが実務的。
追加と同時にテンプレートを使う(Type指定)
ひな形シートから新規作成
Sub AddFromTemplate()
'テンプレート用のチャートシートやワークシートをTypeで指定する方法もあります
'一般的にはひな形シートをコピーして作るのが扱いやすい
Worksheets("Template").Copy After:=Worksheets(Worksheets.Count)
ActiveSheet.Name = SanitizeSheetName("レポート", ThisWorkbook)
End Sub
VB- ポイント:
Sheets.Add(Before, After, Count, Type)のType引数で種類指定も可能だが、既存の「テンプレートシート」をCopyするほうが現場では実用的です。- 書式・数式・レイアウトを丸ごと継承できます。
例題で練習
例題1:月次レポートを自動作成して初期化
Sub CreateMonthlyReport()
Dim target As String
target = Format(Date, "yyyy-mm") & "_レポート"
Dim ws As Worksheet
Set ws = GetOrCreateSheet(target)
With ws
.Range("A1").Value = "作成日"
.Range("B1").Value = Date
.Range("A2").Value = "担当"
.Range("B2").Value = Environ$("Username")
.Range("A4").Value = "サマリー"
End With
MsgBox "レポートシートを準備しました: " & ws.Name
End Sub
VB- ポイント:
- 月名(年月)を含む安定した命名規則で運用すると管理が楽。
- 初期項目を一括でセットして、毎月の「開始作業」をゼロに。
例題2:ボタンひとつで「週報」を5週分自動生成
Sub CreateWeeklyReports()
Dim i As Long, name As String, ws As Worksheet
For i = 1 To 5
name = "週報_" & CStr(i)
Set ws = GetOrCreateSheet(name)
ws.Range("A1").Value = "週番号"
ws.Range("B1").Value = i
Next i
MsgBox "週報シートを作成/更新しました。"
End Sub
VB- ポイント:
- 連番での大量生成は「重複対策済みテンプレート」を使うと事故が少ない。
- 後から順番を入れ替えてもシート名で識別できる。
実務の落とし穴と対策
- 禁止文字・長さ制限:
- シート名は: / \ ? * [ ]が使えず、31文字上限。入力を整形してから命名しましょう。
- 重複命名でエラー:
- 既存と同名はエラー。存在チェックして連番を付けるのが安全です。
- SheetsとWorksheetsの違い:
Sheetsはグラフシート等も含む。通常はWorksheetsで十分。種類を明示的に扱う場合のみSheetsを使うと混乱が減ります。
- 追加位置のデフォルト:
- 引数なし
Addはアクティブシートの直前に入るため、意図した場所に置きたいときはBefore/Afterを必ず指定しましょう。
- 引数なし
次の一歩(小課題)
- 課題1:
InputBoxで受け取った文字列をSanitizeSheetNameに通し、末尾に安全追加するマクロを書いてみる。 - 課題2: 「Template」という見出し付きシートを作り、月次名で
Copyし、A1に年月を自動入力。 - 課題3: 名前配列(例: Array(“売上”, “在庫”, “顧客”))を一括で
GetOrCreateSheet処理し、各A1に作成時刻を記録。
