ワークシートの追加
VBA でワークシートを追加するには、Worksheets.Add メソッドを使います。
引数を省略すれば最低限の追加ができますが、実務では「シート名を付ける」「末尾に追加する」「同名のシートがあるときの扱い」まで考える必要があります。
本記事では、基本コードから名前・位置の指定、複数シートの追加、エラーの対処法までをコード例付きで解説します。
ワークシートを追加する基本コード
Private Sub AddWorksheet()
ThisWorkbook.Worksheets.Add
End Sub
このコードを実行すると、ThisWorkbook(マクロを記述したブック)のアクティブシートの前に新しいワークシートが追加され、追加されたシートがアクティブになります。
Worksheets.Addのようにブックを省略すると、マクロを記述したブックではなく、その時点でアクティブなブックにシートが追加されます。複数のブックを開いて操作する場合は、ThisWorkbookやActiveWorkbookを明示してください。
Worksheets.Addメソッドの引数
Add メソッドには次の引数があり、すべて省略可能です。
| 引数 | 内容 |
|---|---|
Before | 指定したシートの前に追加する |
After | 指定したシートの後ろに追加する |
Count | 追加するシートの枚数(省略時は 1) |
Type | シートの種類(Worksheets.Add では通常ワークシートのため省略可) |
Before と After は同時に指定できません。どちらも省略した場合は、アクティブシートの前に追加されます。
ワークシートに名前を付ける
Worksheets.Add は追加したワークシートを返すため、そのまま名前を設定できます。
Private Sub AddNamedWorksheet()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets.Add
ws.Name = "新しいシート"
End Sub
名前を引数で受け取る形にすれば、使い回しやすくなります。
Private Sub AddNamedWorksheetByArg(ByVal sheetName As String)
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets.Add
ws.Name = sheetName
End Sub
シート名には次の制限があります。違反すると実行時エラー1004になります。
- 1 〜 31 文字以内
: \ / ? * [ ]は使えない- 空にはできない
- 先頭・末尾に
'(シングルクォート)は使えない - 既存のシート名と重複できない(大文字・小文字は区別されない)
- 「履歴」(History)は予約語のため使えない
指定の位置にワークシートを追加する
Before または After で、追加位置を指定します。
Private Sub AddWorksheetAtPosition()
Dim ws As Worksheet
' 先頭に追加
Set ws = ThisWorkbook.Worksheets.Add(Before:=ThisWorkbook.Worksheets(1))
ws.Name = "先頭"
' 1 番目のシートの後ろに追加
Set ws = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Worksheets(1))
ws.Name = "1番目の後ろ"
' 末尾に追加
Set ws = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count))
ws.Name = "末尾"
End Sub
末尾に追加するときは、Worksheets.Count(シートの枚数)を使って最後のシートを指定します。
複数のワークシートを追加する
名前を付けながら複数枚追加する場合は、ループで1枚ずつ追加します。
Private Sub AddMultipleWorksheets()
Dim i As Long
Dim ws As Worksheet
For i = 1 To 5
Set ws = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count))
ws.Name = "シート" & i
Next i
End Sub
このコードを実行すると、「シート1」から「シート5」までの5つのワークシートが末尾に順番に追加されます。名前が不要なら、Worksheets.Add Count:=5 で一括追加できます。
ワークシートを追加する具体例
データ入りのシートを作成する
見出し行とデータを持つシートを自動で生成する例です。
Private Sub AddAndFillWorksheet()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets.Add
ws.Name = "データシート"
' 見出し行を追加
ws.Cells(1, 1).Value = "ID"
ws.Cells(1, 2).Value = "名前"
ws.Cells(1, 3).Value = "年齢"
' データ行を追加
Dim data As Variant
data = Array( _
Array(1, "田中太郎", 30), _
Array(2, "山田花子", 25), _
Array(3, "佐藤次郎", 35) _
)
Dim i As Long
For i = 0 To UBound(data)
ws.Cells(i + 2, 1).Value = data(i)(0)
ws.Cells(i + 2, 2).Value = data(i)(1)
ws.Cells(i + 2, 3).Value = data(i)(2)
Next i
End Sub
「データシート」という名前のワークシートが追加され、見出し行とデータ行が入力されます。
条件に基づいてワークシートを追加する
アクティブシートのセル A1 の値が「追加」のときだけシートを追加する例です。
Private Sub AddWorksheetIfConditionMet()
If ActiveSheet.Range("A1").Value = "追加" Then
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets.Add
ws.Name = "条件付きシート"
End If
End Sub
トラブルシューティング
ワークシートの名前重複エラー
既存のシートと同じ名前を設定すると、実行時エラー1004が発生します。しかも、Add で追加したシートは名前が付かないまま残ってしまいます。
これを避けるには、追加する前に同名のシートがないか確認します。
Private Function SheetExists(ByVal sheetName As String) As Boolean
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
If StrComp(ws.Name, sheetName, vbTextCompare) = 0 Then
SheetExists = True
Exit Function
End If
Next ws
End Function
Private Sub AddUniqueWorksheet()
Const SHEET_NAME As String = "ユニークシート"
If SheetExists(SHEET_NAME) Then
MsgBox "同じ名前のシートが既に存在します"
Exit Sub
End If
ThisWorkbook.Worksheets.Add.Name = SHEET_NAME
End Sub
シート名の大文字・小文字は区別されないため、StrComp に vbTextCompare を指定して比較しています。
ワークシートを追加できない
ブック構成が保護されていると、シートを追加できません。その場合は ThisWorkbook.Unprotect で保護を解除してから追加します。
追加位置が意図と違う
Before / After を省略すると、アクティブシートの前に追加されます。位置が重要な場合は、必ず Before か After を指定してください。
まとめ
- ワークシートの追加は
Worksheets.Add。対象ブックはThisWorkbookなどで明示する - 追加位置は
Before/After、枚数はCountで指定する。省略時はアクティブシートの前に追加される - シート名は31文字以内で、
: \ / ? * [ ]は使えず、重複もできない - 同名シートのエラーは、追加前の存在確認で防ぐ