Excel VBAを使って、指定した名前(シート名)のシートを削除するのを、最近はちょっと面倒に感じています。
Worksheet.Deleteでシートを削除しようとすると……
シートの削除は、Worksheet.Deleteメソッドを使えば済むのですが、
以下のようなマクロでは、「新規シート」という名前のシートがない場合に、
Sub sample()
Const TGT_SHT = "新規シート"
Sheets(TGT_SHT).Delete
End Sub
「実行時エラー'9': インデックスが有効範囲にありません。」
実行時エラーが発生してしまいます。
ですから、指定した名前のシートが存在しているのか事前にチェックしなければなりません。
また、いざWorksheet.Deleteメソッドで削除しようとすると
「このシートは完全に削除されます。続けますか?」
確認メッセージが表示されます。
この制御も必要です。
指定した名前のシートを削除するサンプルマクロ
以上のような点を考慮すると、最低でも以下のようなマクロにせざるを得ません。
Const TGT_SHT = "新規シート"
Dim sht As Worksheet
For Each sht In Sheets
If sht.Name = TGT_SHT Then
Application.DisplayAlerts = False
sht.Delete
Application.DisplayAlerts = True
End If
Next
End Sub
For Each~Nextループで、順番にワークシートを取得して、
Dim sht As Worksheet
For Each sht In Sheets
Worksheet.Nameプロパティで取得できるシート名が、指定した名前だったときに、
If sht.Name = TGT_SHT Then
削除の確認メッセージが表示されないように設定変更を行ってから、
Application.DisplayAlerts = False
削除を実行しています。
sht.Delete
その後、確認メッセージが表示されるように設定変更を行っています。
Application.DisplayAlerts = True
指定した名前のシートを削除して同じ名前のシートを作り直すサンプルマクロ
実務でありがちなのが、指定した名前のシートを削除して、同じ名前のシートを作り直すといった処理です。
その場合、以下のようなマクロでしょうか。
Const TGT_SHT = "新規シート"
Dim sht As Worksheet
For Each sht In Sheets
If sht.Name = TGT_SHT Then
Application.DisplayAlerts = False
sht.Delete
Application.DisplayAlerts = True
End If
Next
Sheets.Add Before:=Sheets(1)
ActiveSheet.Name = TGT_SHT
End Sub
先ほどのマクロの最後に
Sheets.Add Before:=Sheets(1)
ActiveSheet.Name = TGT_SHT
先頭にワークシートを追加して、名前を変更する処理を追加しています。
最終更新日時:2023-07-07 14:38
Home » エクセルマクロ・Excel VBAの使い方 » Sheets・Worksheet » VBAで指定した名前のシートを削除するのは意外と面倒