VBAでシートの追加と削除

投稿日: 2024年6月16日

Excelのシートを追加や削除もVBAでは可能になります。
VBAでワークシートの追加や削除、コピー、移動などの操作を行う場合は、Worksheetオブジェクトを使います。

シートの追加方法

最もシンプルなシートの追加

新しいシートを現在のブックに追加する基本的な方法です。

Sub AddNewSheet()
    Worksheets.Add
End Sub

「Worksheets.Add」これは新しいシートを追加する命令です。

シートに名前を付けて追加

新しいシートを追加し、そのシートに名前を付ける方法です。

Sub AddNewSheetWithName()
    Dim newSheet As Worksheet
    Set newSheet = Worksheets.Add
    newSheet.Name = "MyNewSheet"
End Sub

「newSheet.Name = “MyNewSheet”」は 新しいシートの名前を”MyNewSheet”に設定します。名前は自由に変更できます。

特定の位置にシートを追加

新しいシートを特定の位置(例えば、最後に追加)に挿入する方法です。

Sub AddSheetAtEnd()
    Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = "LastSheet"
End Sub

このコードを実行するとWorksheets.Addが新しいシートが現在のブックの一番前に追加されます。そして次にAfterプロパティでシートを特定の位置に追加します。Worksheets.Countでシート全部をカウントしその最後にシートがきます。

プロパティ詳細
Before指定したシートの前に、新しい シートを追加。
After指定したシートの後に、新しいシートを追加。

シートの削除方法

Excel VBAを使ってシートを削除する方法について説明します。

シートを削除する基本的なコード
Sub DeleteSheet()
    Worksheets("Sheet1").Delete
End Sub

「Worksheets(“Sheet1”).Delete」 これは名前がSheet1のシートを削除する命令です。Sheet1の部分は削除したいシートの名前に置き換えてください。

確認メッセージを抑制してシートを削除

マクロを組み込んでシートの削除をするときに確認メッセージが表示されると処理が途中で止まってしまいます。シートを削除する際に表示される確認メッセージを表示しないようにするには、以下のようにコードを追加します。

Sub DeleteSheetWithoutPrompt()
    Application.DisplayAlerts = False
    Worksheets("Sheet1").Delete
    Application.DisplayAlerts = True
End Sub

「Application.DisplayAlerts = False」 確認メッセージを表示しないように設定します。

プロパティ詳細
Application.DisplayAlerts = False確認メッセージを表示しない
Application.DisplayAlerts = True確認メッセージを表示
削除するシートが存在しない場合

削除するシートが存在しない場合にエラーが発生します。エラー処理を加えることで、指定したシートが存在しない場合でも、スムーズに処理を続けることができます。
エラーハンドリングを使って、削除するシートが存在しない場合にエラーをキャッチし、適切なメッセージを表示する方法です。

Sub DeleteSheetIfExists()
    Dim sheetName As String
    sheetName = "Sheet1" ' 削除したいシート名を指定

    On Error Resume Next ' エラーハンドリング開始
    Application.DisplayAlerts = False ' 確認メッセージを表示しない
    Worksheets(sheetName).Delete
    Application.DisplayAlerts = True ' 確認メッセージを再度有効にする

    If Err.Number <> 0 Then
        MsgBox "シート '" & sheetName & "' は存在しません。", vbExclamation
    Else
        MsgBox "シート '" & sheetName & "' が削除されました。", vbInformation
    End If
End Sub

エラーハンドリングを使わない方法もあります。

シートの存在を確認してから削除する方法

シートの存在を確認し、存在する場合にのみ削除を実行する方法です。

Sub DeleteSheetIfExists()
    Dim sheetName As String
    sheetName = "Sheet1" ' 削除したいシート名を指定
    
    If SheetExists(sheetName) Then
        Application.DisplayAlerts = False ' 確認メッセージを表示しない
        Worksheets(sheetName).Delete ' シートを削除
        Application.DisplayAlerts = True ' 確認メッセージを再度有効にする
        MsgBox "シート '" & sheetName & "' が削除されました。", vbInformation
    Else
        MsgBox "シート '" & sheetName & "' は存在しません。", vbExclamation
    End If
End Sub

Function SheetExists(sheetName As String) As Boolean
    Dim ws As Worksheet
    SheetExists = False
    For Each ws In Worksheets
        If ws.Name = sheetName Then
            SheetExists = True
            Exit Function
        End If
    Next ws
End Function

「Function SheetExists」 シートの存在を確認する関数を定義します。
「If SheetExists(sheetName) Then」 シートの存在を確認し、存在する場合に削除を実行します。

シートのコピー方法

シートのコピーは、新しいシートとしてブック内に追加することができます。

シートをコピーする基本的なコード
Sub CopySheet()
    Worksheets("Sheet1").Copy After:=Worksheets(Worksheets.Count)
End Sub

「Worksheets(“Sheet1”).Copy After:=Worksheets(Worksheets.Count)」 これはSheet1という名前のシートをコピーし、そのコピーをブックの最後に追加する命令です。
Sheet1の部分はコピーしたいシートの名前に置き換えてください。

注意
コピー元の名前が存在しないとエラーになります。

コピーしたシートに名前を付ける

コピー先のシート名を任意につけたい場合があります。「newSheet.Name = “CopiedSheet”」 はコピーされたシートの名前を設定します。名前は自由に変更できます。

Sub CopySheetWithName()
    Dim newSheet As Worksheet
    Worksheets("Sheet1").Copy After:=Worksheets(Worksheets.Count)
    Set newSheet = Worksheets(Worksheets.Count) ' コピーされたシートを取得
    newSheet.Name = "CopiedSheet"
End Sub
シートをコピーし、重複しない名前を付けるコード

コピー先に同じ名称のシートが存在する場合に、エラーが発生しないように対処する方法

Sub CopySheetWithUniqueName()
    Dim newSheet As Worksheet
    Dim baseName As String
    Dim newName As String
    Dim i As Integer

    baseName = "Sheet1" ' コピー元のシート名を指定
    newName = baseName & " - Copy"
    i = 1

    ' シート名が重複しない名前を生成
    Do While SheetExists(newName)
        newName = baseName & " - Copy (" & i & ")"
        i = i + 1
    Loop

    ' シートをコピーし、新しい名前を設定
    Worksheets(baseName).Copy After:=Worksheets(Worksheets.Count)
    Set newSheet = Worksheets(Worksheets.Count)
    newSheet.Name = newName
End Sub

Function SheetExists(sheetName As String) As Boolean
    Dim ws As Worksheet
    SheetExists = False
    For Each ws In Worksheets
        If ws.Name = sheetName Then
            SheetExists = True
            Exit Function
        End If
    Next ws
End Function

「Function SheetExists」はシート名の存在を確認する関数です。
Do While SheetExists(newName): SheetExists関数を使ってシート名の存在を確認します。重複する場合は名前を変更します。
「newName = baseName & ” – Copy (” & i & “)”」は 重複する場合、新しい名前を生成します(例:Sheet1 – Copy (1))。

これで、コピー先に同じ名前のシートが存在する場合に、エラーが発生しないように対処する方法です。

記事