PR

【ExcelVBA】シートを削除する方法(特定の文字を含むシートを削除)

シートの操作

エクセルのワークシートを削除する方法について説明しています。警告を出さずにシートを削除する方法や複数シートの指定方法、ループ処理でシート名を調べてから削除する方法など紹介しています。

スポンサーリンク

シートを削除する方法(警告メッセージを出さない)

ワークシートを削除する方法は「Worksheets(“Sheet1”)」で対象のシートを指定して、「Delete」メソッドを使用して削除します。

'シートを削除する(シート名を指定)
Worksheets("Sheet1").Delete

ところが、単純に上のコードを実行するとシートの削除を実行したときにExcelから「このシートは完全に削除されます。続けますか?」の警告メッセージのウィンドウが表示されマクロが停止してしまいます。

ExcelVBA-シートの削除-警告メッセージ

そのため、あらかじめ警告メッセージを表示しないように「DisplayAlerts」を「False」に設定しておく必要があります。

'アラートを表示しない
Application.DisplayAlerts = False

'シートを削除する(シート名を指定)
Worksheets("Sheet1").Delete

'アラートを表示する
Application.DisplayAlerts = True

コードを実行すると警告メッセージが表示されずにシートの削除ができました。

ExcelVBA-シートの削除-警告メッセージを出さずに削除
シートの指定方法いろいろ

削除するシートの指定の方法はいくつかあります。

シート名を指定する場合は「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」が削除されました。

ExcelVBA-シートの削除-複数シートの削除
スポンサーリンク

シートがあるか確認してから削除する方法(For~Eachループ)

削除するために指定したシートがなかった場合、エラーが発生してしまいます。

たとえば下のExcelには「Sheet5」がありません。
この状態で「Worksheets(“Sheet5”).Delete」を実行してみます。
すると実行時エラー9「インデックスが有効範囲にありません。」が表示されました。

ExcelVBA-シートの削除-シートがない場合のエラーメッセージ

下のコードはエラーにならないように、シート名を調べて対象のシート名があったら削除を実行するようにしています。

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」のシートは削除が行われました。

ExcelVBA-シートの削除-特定のシート名のものだけ削除
スポンサーリンク

シートを削除するときの注意点

上で紹介した「Worksheets(”シート名”).Delete」などのコードはワークシートを対象に指定して削除を行うコードです。グラフシートを削除したい場合は「Sheets(”シート名”).Delete」と指定してください。

シートの削除は削除した後に何か1つシートが残っていないとエラーになってしまいます。

実行時エラー1004
WorksheetクラスのDeleteメソッドが失敗しました。

ExcelVBA-シートの削除-シートがなくなってしまう場合のエラー

このエラーを避けるため、削除したあとにシートが1つ以上残るように考慮して実行してください。

スポンサーリンク

※コードのコピー利用について

・コードのコピーは自由におこなっていただけます。
・気を付けて作成はしていますがコードには誤りがある可能性があります。
・自身の環境で動作確認をしていますが、すべての方の環境で同様に動くことは保証できません。
・データの破損等の責任は負いかねますのでご自身の責任のもとお使いください。

タイトルとURLをコピーしました