プログラミング

【PR】を含みます。

【VBA】確認メッセージを表示せずにシートを削除する方法

VBA 確認メッセージを表示せずにシートを削除する方法

VBAで確認メッセージを表示せずにシートを削除する方法を解説します。

配列(array)を使用して複数のシートを削除する方法や特定のシート以外を削除する方法も紹介します。

Excelでシートを削除するときの注意事項

エクセルでは、すべてのシートを削除することはできません。

最低でも1つのシートを残しておく必要があります。

VBA(Visual Basic for Applications)を使ってシートを削除するコードを書いた場合でも、最後のシートは削除できないように設計されています。

【実装コード】確認メッセージを表示せずにシートを削除

以下のコードは、シート名「Sheet1」を削除しています。

実際に使用する際は、Sheet1を削除したいシート名に置き換える必要があります。

VBA
Copy
  1. Sub sample()
  2.     Dim sheetName As String
  3.     sheetName = "Sheet1" ' 削除したいシートの名前を入力
  4.     
  5.     Application.DisplayAlerts = False ' 確認ダイアログを非表示にする
  6.     On Error Resume Next ' エラーハンドリング
  7.     ThisWorkbook.Sheets(sheetName).Delete
  8.     On Error GoTo 0 ' エラーハンドリングを解除
  9.     Application.DisplayAlerts = True ' 確認ダイアログを再表示する
  10. End Sub

コード解説

  1. sheetName

    削除したいシートの名前を指定します。

  2. Application.DisplayAlerts = False

    削除確認ダイアログを表示しないようにする設定です。

  3. On Error Resume Next

    エラーが発生しても次の行に進むための設定です。

  4. ThisWorkbook.Sheets(sheetName).Delete

    指定した名前のシートを削除します。

  5. On Error GoTo 0

    エラーハンドリングを解除します(On Error Resume Nextの設定を解除します)。

【実装コード】複数のシートを削除

以下のコードは、シート名「Sheet1」「Sheet2」を配列に指定して削除しています。

実際に使用する際は、Sheet1Sheet2を削除したいシート名に置き換える必要があります。

VBA
Copy
  1. Sub sample()
  2.     ' 削除したいシートの名前を配列に入力
  3.     Dim sheetNames As Variant
  4.     sheetNames = Array("Sheet1", "Sheet2")
  5.     
  6.     Application.DisplayAlerts = False ' 確認ダイアログを非表示にする
  7.     On Error Resume Next ' エラーハンドリング
  8.     
  9.     ' 配列内の各シートをループして削除
  10.     Dim sheetName As Variant
  11.     Dim sheet As Worksheet
  12.     
  13.     For Each sheetName In sheetNames
  14.         Set sheet = ThisWorkbook.Sheets(sheetName)
  15.         If Not sheet Is Nothing Then
  16.             sheet.Delete
  17.         End If
  18.     Next sheetName
  19.     
  20.     On Error GoTo 0 ' エラーハンドリングを解除
  21.     Application.DisplayAlerts = True ' 確認ダイアログを再表示する
  22. End Sub

【実装コード】特定のシート以外を削除

以下のコードはシート名「Sheet1」「Sheet2」を配列に指定して、シート名「Sheet1」「Sheet2」以外のシートを削除しています。

実際に使用する際は、Sheet1Sheet2を削除したくないシート名に置き換える必要があります。

VBA
Copy
  1. Sub sample()
  2.     ' 保持したいシートの名前を配列に入力
  3.     Dim keepSheets As Variant
  4.     keepSheets = Array("Sheet1", "Sheet2") ' ここに保持したいシート名を記入
  5.     
  6.     Application.DisplayAlerts = False ' 確認ダイアログを非表示にする
  7.     
  8.     ' 全シートをループ
  9.     Dim sheet As Worksheet
  10.     Dim keepSheet As Variant
  11.     Dim deleteSheet As Boolean
  12.     
  13.     For Each sheet In ThisWorkbook.Sheets
  14.         deleteSheet = True ' 初期設定は削除
  15.         
  16.         ' シート名が保持するリストにあるかをチェック
  17.         For Each keepSheet In keepSheets
  18.             If sheet.Name = keepSheet Then
  19.                 deleteSheet = False ' 保持するシートなので削除しない
  20.                 Exit For
  21.             End If
  22.         Next keepSheet
  23.         
  24.         ' 削除するシートの場合、削除を実行
  25.         If deleteSheet Then
  26.             sheet.Delete
  27.         End If
  28.     Next sheet
  29.     
  30.     Application.DisplayAlerts = True ' 確認ダイアログを再表示する
  31. End Sub

実務で使用しやすいようにシート削除を関数化

VBA
Copy
  1. Public Function delete_sheets(ByVal sheetNames As Variant, Optional ByVal keepSheetsFlag As Boolean = False)
  2.     Dim targetSheets As Variant
  3.     
  4.     If IsArray(sheetNames) Then
  5.         ' sheetNamesが配列の場合
  6.         targetSheets = sheetNames
  7.     Else
  8.         ' sheetNamesが配列でない場合
  9.         targetSheets = Array(sheetNames)
  10.     End If
  11.     
  12.     Application.DisplayAlerts = False ' 確認ダイアログを非表示にする
  13.     
  14.     Dim targetSheet As Variant
  15.     Dim sheet As Worksheet
  16.     
  17.     If keepSheetsFlag Then
  18.         ' keepSheetsFlagがTrueの場合、targetSheetsに指定されているシート以外を削除
  19.         
  20.         ' 全シートをループ
  21.         Dim deleteSheet As Boolean
  22.         
  23.         For Each sheet In ThisWorkbook.Sheets
  24.             deleteSheet = True ' 初期設定は削除
  25.             
  26.             ' シート名が保持するリストにあるかをチェック
  27.             For Each targetSheet In targetSheets
  28.                 If sheet.Name = targetSheet Then
  29.                     deleteSheet = False ' 保持するシートなので削除しない
  30.                     Exit For
  31.                 End If
  32.             Next targetSheet
  33.             
  34.             ' 削除するシートの場合、削除を実行
  35.             If deleteSheet Then
  36.                 sheet.Delete
  37.             End If
  38.         Next sheet
  39.     Else
  40.         ' keepSheetsFlagがFlaseの場合、targetSheetsに指定されているシートを削除
  41.         On Error Resume Next ' エラーハンドリング
  42.         For Each targetSheet In targetSheets
  43.             Set sheet = ThisWorkbook.Sheets(targetSheet)
  44.             If Not sheet Is Nothing Then
  45.                 sheet.Delete
  46.             End If
  47.             Set sheet = Nothing
  48.         Next targetSheet
  49.         On Error GoTo 0 ' エラーハンドリングを解除
  50.     End If
  51.     
  52.     Application.DisplayAlerts = True ' 確認ダイアログを再表示する
  53. End Function

delete_sheets関数の使用方法

第一引数のsheetNamesに対象となるシート名を指定します。

第二引数のkeepSheetsFlagは必要に応じて指定します。

各引数について

  1. sheetNames (必須)
    対象となるシート名を指定します。
    複数のシートを対象とする場合、配列で指定します。
    対象となるシートが1つの場合、配列か文字列で指定します。

  2. keepSheetsFlag (省略可)
    引数を省略orFalseを指定した場合、sheetNamesで指定したシートが削除されます。
    Trueを指定した場合、sheetNamesで指定したシート以外が削除されます。

【サンプル】delete_sheets関数で特定のシートを削除

以下のコードは、シート名「Sheet1」と「Sheet2」を削除しています。

VBA
Copy
  1. Sub sample()
  2.     Dim sheetList As Variant
  3.     sheetList = Array("Sheet1", "Sheet2")
  4.     
  5.     Call delete_sheets(sheetList, True)
  6. End Sub
  7.  
  8. Public Function delete_sheets(ByVal sheetNames As Variant, Optional ByVal keepSheetsFlag As Boolean = False)
  9.     Dim targetSheets As Variant
  10.     
  11.     If IsArray(sheetNames) Then
  12.         ' sheetNamesが配列の場合
  13.         targetSheets = sheetNames
  14.     Else
  15.         ' sheetNamesが配列でない場合
  16.         targetSheets = Array(sheetNames)
  17.     End If
  18.     
  19.     Application.DisplayAlerts = False ' 確認ダイアログを非表示にする
  20.     
  21.     Dim targetSheet As Variant
  22.     Dim sheet As Worksheet
  23.     
  24.     If keepSheetsFlag Then
  25.         ' keepSheetsFlagがTrueの場合、targetSheetsに指定されているシート以外を削除
  26.         
  27.         ' 全シートをループ
  28.         Dim deleteSheet As Boolean
  29.         
  30.         For Each sheet In ThisWorkbook.Sheets
  31.             deleteSheet = True ' 初期設定は削除
  32.             
  33.             ' シート名が保持するリストにあるかをチェック
  34.             For Each targetSheet In targetSheets
  35.                 If sheet.Name = targetSheet Then
  36.                     deleteSheet = False ' 保持するシートなので削除しない
  37.                     Exit For
  38.                 End If
  39.             Next targetSheet
  40.             
  41.             ' 削除するシートの場合、削除を実行
  42.             If deleteSheet Then
  43.                 sheet.Delete
  44.             End If
  45.         Next sheet
  46.     Else
  47.         ' keepSheetsFlagがFlaseの場合、targetSheetsに指定されているシートを削除
  48.         On Error Resume Next ' エラーハンドリング
  49.         For Each targetSheet In targetSheets
  50.             Set sheet = ThisWorkbook.Sheets(targetSheet)
  51.             If Not sheet Is Nothing Then
  52.                 sheet.Delete
  53.             End If
  54.             Set sheet = Nothing
  55.         Next targetSheet
  56.         On Error GoTo 0 ' エラーハンドリングを解除
  57.     End If
  58.     
  59.     Application.DisplayAlerts = True ' 確認ダイアログを再表示する
  60. End Function

【サンプル】delete_sheets関数で特定のシート以外を削除

以下のコードは、シート名「Sheet1」と「Sheet2」以外を削除しています。

VBA
Copy
  1. Sub sample()
  2.     Dim sheetList As Variant
  3.     sheetList = Array("Sheet1", "Sheet2")
  4.     
  5.     Call delete_sheets(sheetList)
  6. End Sub
  7.  
  8. Public Function delete_sheets(ByVal sheetNames As Variant, Optional ByVal keepSheetsFlag As Boolean = False)
  9.     Dim targetSheets As Variant
  10.     
  11.     If IsArray(sheetNames) Then
  12.         ' sheetNamesが配列の場合
  13.         targetSheets = sheetNames
  14.     Else
  15.         ' sheetNamesが配列でない場合
  16.         targetSheets = Array(sheetNames)
  17.     End If
  18.     
  19.     Application.DisplayAlerts = False ' 確認ダイアログを非表示にする
  20.     
  21.     Dim targetSheet As Variant
  22.     Dim sheet As Worksheet
  23.     
  24.     If keepSheetsFlag Then
  25.         ' keepSheetsFlagがTrueの場合、targetSheetsに指定されているシート以外を削除
  26.         
  27.         ' 全シートをループ
  28.         Dim deleteSheet As Boolean
  29.         
  30.         For Each sheet In ThisWorkbook.Sheets
  31.             deleteSheet = True ' 初期設定は削除
  32.             
  33.             ' シート名が保持するリストにあるかをチェック
  34.             For Each targetSheet In targetSheets
  35.                 If sheet.Name = targetSheet Then
  36.                     deleteSheet = False ' 保持するシートなので削除しない
  37.                     Exit For
  38.                 End If
  39.             Next targetSheet
  40.             
  41.             ' 削除するシートの場合、削除を実行
  42.             If deleteSheet Then
  43.                 sheet.Delete
  44.             End If
  45.         Next sheet
  46.     Else
  47.         ' keepSheetsFlagがFlaseの場合、targetSheetsに指定されているシートを削除
  48.         On Error Resume Next ' エラーハンドリング
  49.         For Each targetSheet In targetSheets
  50.             Set sheet = ThisWorkbook.Sheets(targetSheet)
  51.             If Not sheet Is Nothing Then
  52.                 sheet.Delete
  53.             End If
  54.             Set sheet = Nothing
  55.         Next targetSheet
  56.         On Error GoTo 0 ' エラーハンドリングを解除
  57.     End If
  58.     
  59.     Application.DisplayAlerts = True ' 確認ダイアログを再表示する
  60. End Function

Excel VBAで初心者を卒業したいという方におすすめの1冊

アイコン画像

もみじ

入門書レベルの内容を理解できる方におすすめの1冊で、実務で必要なスキルを学ぶことができます。

具体的には、コーディングの作法や効率的なコーディング方法、CSVやWeb上のデータとの連携方法、そしてマクロの高速化などの実務で役立つスキルを学ぶことができます。

-プログラミング
-,