ワークシートの追加

にメンテナンス済み

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文字以内で、: \ / ? * [ ] は使えず、重複もできない
  • 同名シートのエラーは、追加前の存在確認で防ぐ
#vba #excel #worksheet #ワークシート