エクセルのワークシートを削除する方法について説明しています。警告を出さずにシートを削除する方法や複数シートの指定方法、ループ処理でシート名を調べてから削除する方法など紹介しています。
シートを削除する方法(警告メッセージを出さない)
ワークシートを削除する方法は「Worksheets(“Sheet1”)」で対象のシートを指定して、「Delete」メソッドを使用して削除します。
'シートを削除する(シート名を指定)
Worksheets("Sheet1").Delete
ところが、単純に上のコードを実行するとシートの削除を実行したときにExcelから「このシートは完全に削除されます。続けますか?」の警告メッセージのウィンドウが表示されマクロが停止してしまいます。
そのため、あらかじめ警告メッセージを表示しないように「DisplayAlerts」を「False」に設定しておく必要があります。
'アラートを表示しない
Application.DisplayAlerts = False
'シートを削除する(シート名を指定)
Worksheets("Sheet1").Delete
'アラートを表示する
Application.DisplayAlerts = True
コードを実行すると警告メッセージが表示されずにシートの削除ができました。
シートの指定方法いろいろ
削除するシートの指定の方法はいくつかあります。
シート名を指定する場合は「Worksheets(“シート名“)」のように記述します。
'シートを削除する(シート名を指定)
Worksheets("Sheet1").Delete
シートの位置で指定する場合は「Worksheets(“左から数えた番号“)」のように記述します。
'シートを削除する(1つ目のシート)
Worksheets(1).Delete
アクティブシートを削除する場合は下のように記述します。
'シートを削除する(アクティブシート)
ActiveSheet.Delete
複数シートを削除する方法(Array)
複数シートを削除する場合はArrayを使用してカンマ区切りで指定します。
'アラートを表示しない
Application.DisplayAlerts = False
'シートを削除する
Worksheets(Array("Sheet1", "Sheet3")).Delete
'アラートを表示する
Application.DisplayAlerts = True
▽マクロ実行後
「Sheet1」と「Sheet3」が削除されました。
シートがあるか確認してから削除する方法(For~Eachループ)
削除するために指定したシートがなかった場合、エラーが発生してしまいます。
たとえば下のExcelには「Sheet5」がありません。
この状態で「Worksheets(“Sheet5”).Delete」を実行してみます。
すると実行時エラー9「インデックスが有効範囲にありません。」が表示されました。
下のコードはエラーにならないように、シート名を調べて対象のシート名があったら削除を実行するようにしています。
For~Eachを使用してすべてのワークシートをループし、If関数でシート名が「Sheet5」かどうかを判定しています。一致した場合のみワークシートの削除が行われます。
Dim ws As Worksheet
'アラートを表示しない
Application.DisplayAlerts = False
'指定したシート名があったら削除する
For Each ws In Worksheets
If ws.Name = "Sheet5" Then
ws.Delete
Exit For
End If
Next ws
'アラートを表示する
Application.DisplayAlerts = True
特定のシート名のものだけ削除する(ワイルドカード・複数シート)
次はFor~Eachループを使用して、特定の文字のシート名の場合に削除を行います。
シート名の中に特定の文字があるかどうかを判定する方法として、Left関数やRight関数で~文字で始まる、~文字で終わる、で判定する方法と、Instr関数で文字が含まれるか判定する方法があります。
▽Left関数を使用して、シート名「Sheet」で始まるものを削除するコード
Dim ws As Worksheet
'アラートを表示しない
Application.DisplayAlerts = False
'指定したシート名があったら削除する(指定した文字で始まる)
For Each ws In Worksheets
If Left(ws.Name, 5) = "Sheet" Then ws.Delete
Next ws
'アラートを表示する
Application.DisplayAlerts = True
▽Instr関数を使用して「Sheet」の文字がある場合に削除するコード
Dim ws As Worksheet
'アラートを表示しない
Application.DisplayAlerts = False
'指定したシート名があったら削除する(指定した文字を含む)
For Each ws In Worksheets
If InStr(ws.Name, "Sheet") > 0 Then ws.Delete
Next ws
'アラートを表示する
Application.DisplayAlerts = True
上の2つのコードはどちらも結果は同じです。
先頭にある「シート」というシートだけが残り、「Sheet1~3」のシートは削除が行われました。
シートを削除するときの注意点
上で紹介した「Worksheets(”シート名”).Delete」などのコードはワークシートを対象に指定して削除を行うコードです。グラフシートを削除したい場合は「Sheets(”シート名”).Delete」と指定してください。
シートの削除は削除した後に何か1つシートが残っていないとエラーになってしまいます。
実行時エラー1004
WorksheetクラスのDeleteメソッドが失敗しました。
このエラーを避けるため、削除したあとにシートが1つ以上残るように考慮して実行してください。
※コードのコピー利用について
・コードのコピーは自由におこなっていただけます。
・気を付けて作成はしていますがコードには誤りがある可能性があります。
・自身の環境で動作確認をしていますが、すべての方の環境で同様に動くことは保証できません。
・データの破損等の責任は負いかねますのでご自身の責任のもとお使いください。