エクセルVBAでシートを削除するにはDeleteメソッドを利用します。
シートを削除するためには、要チェック項目や禁止項目もあります。
コード実行後は復元が出来ません。注意が必要です。
こんにちは じゅんぱ店長 (@junpa33) です。
エクセルBOOK内の整理整頓で、不要なシートを削除したい時があると思います。
また例えば、使い回しが必要なエクセルBOOKで、再利用時に一旦デフォルトの状態に戻すために、要らなくなったシートを削除したい場合もあると思います。
そんな時、シートを削除するために使うのは、「Deleteメソッド」です。
今回は、このDeleteメソッドについてです。
他にもシートをデフォルトに戻したいという場合、クリアーメソッドを使うパターンもあります。
こちらで説明しています。

コンテンツ
シートの削除にはDeleteメソッドを使う

Deleteでシートの削除を行うことが出来ます。
最大の注意点として、一度でもシートの削除を行うと、その削除されたシートは元に戻すことは出来ません。
エクセルBOOK内のすべてのシートを削除することは出来ません。最低1枚のシートは残さなければなりません。
Deleteメソッドの記述方法
シートオブジェクト.Delete
「Sheet1」を削除したい場合は、
Sub シートの削除1()
Worksheets("Sheet1").Delete
End Sub
Worksheets(“Sheet1”).Delete と記述します。
「Sheet1」が一番左にある時は、
Worksheets(1).Delete としてもOKです。
シートの削除の注意点
シートを削除する時の注意点は多々あります。
- シートを削除するとそのシートを復活させることは出来ない
- 削除実行時に「確認メッセージ」が表示されてVBAコード進行がSTOPする。
- VBAプログラム内で、削除シート名でコード指定(記述省略も含めて)していた場合は削除後はその指定部分からエラーが発生します。
- シートカウント(インデックス番号)でループなどを組み立てている場合は、シート数が減少するので、カウンター変数部分でコードの手直しチェックが必要になる。
- などなど
兎に角。オブジェクトが消滅することによって、そのシートの指定やシート内のセルの指定が全てコード実行時にエラーになりますので、十分な注意が必要になります。
VBAコードを組み立てる最初の時点で「シートの削除」を前提としたコード設計を行うようにしましょう。
確認メッセージの非表示方法
シートの削除コードを実行すると「確認メッセージ」が表示され、一旦コード実行がストップします。

「確認メッセージ」を非表示にするVBAコードを削除のコードより前に記述し、後に「確認メッセージ」の表示を戻すコードを付け加えます。
.DisplayAlerts = False で非表示
.DisplayAlerts = True で表示
になります。
Sub シートの削除2()
Application.DisplayAlerts = False
・・・・・
・・・・・
Application.DisplayAlerts = True
End Sub
複数のシートを同時に削除する場合
複数枚のシートを削除する場合は、Array関数でシートを指定することが出来ます。
Worksheets(Array( “シート名1” , “シート名2” ,・・・) ).Delete
シート名でもインデックス番号でも可です。
Sheet1からSheet4まであるエクセルBOOKで、Sheet2からSheet4までを一度に削除する、VBAコードの一つの記述例は次のようになります。
Sub シートの削除3()
Application.DisplayAlerts = False
Worksheets(Array("Sheet2", "Sheet3", "sheet4")).Delete
Application.DisplayAlerts = True
End Sub
1枚を残してそれ以外すべてのシートを削除する場合
エクセルBOOKで一枚のシートを残して他全てを削除するコードを考えます。
シートのインデックス番号を利用して、For~Nextでループを組みます。
ループさせる順はインデックス番号を降順で行います。(ループする毎にインデックス番号が減少していきます。)
カウンター変数とインデックス番号の最大値を一致させながらループすることで、実行時エラーを防止します。
Sub シートの削除4()
Dim i As Long
Application.DisplayAlerts = False
For i = Worksheets.Count To 2 Step -1
Worksheets(i).Delete
Next i
Application.DisplayAlerts = True
End Sub
削除しないシートを「Sheet3」に指定します。If条件文を使用します。
Sub シートの削除5()
Dim i As Long
Application.DisplayAlerts = False
For i = Worksheets.Count To 1 Step -1
If Worksheets(i).Name <> "Sheet3" Then
Worksheets(i).Delete
End If
Next i
Application.DisplayAlerts = True
End Sub
まとめ

シートの削除はエクセルを使用する上では、必ず必要となる知識と技術です。
Deleteメソッドを利用して行いますが、これはエクセルBOOKを構成するオブジェクトを削除するということです。
なので、シート名が無くなる、シート数が変わることで、VBAコード実行時に「実行時エラーNo.9」(インデックスか有効範囲外)が発生することが考えられます。
十分にVBAコードをチェックしたうえで、シート削除を行うことが重要です。
エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。

今回の記事はここまでです。 最後までご覧いただき有難うございました。