指定したシート以外を削除
VBAでプログラムを組んでいると、シートをコピーしてデータを貼り付けるような場面が出てきます。一度だけ実行するようなケースでは良いのですが、データを変えて何度も使い回したい時、前回実行した時にコピーしたシートが邪魔になることがあります。

そのような時に、特定のシート以外のシートを削除する方法です。
特定のシート名を配列に入れて管理したり、InStr関数を使ってシート名とキーワードを比較する方法を試してみました。
ワークシートの削除
まずは単純にワークシートを削除する方法です。何番目のシートか?どんな名前のシートか?で特定して、あとはDeleteメソッドで削除できます。
ただ、そのままですと「本当に削除しますか?」というアラートが出ますので、シートを何枚も削除する場合は回避したいところです。
そこで、Application.DisplayAlerts で囲んでアラートを出ないようにします。
Sub worksheetDeleteTest()
Application.DisplayAlerts = False ' メッセージを非表示
'Worksheets(1).Delete '何番目かで指定
Worksheets("Sheet1").Delete 'シート名で指定
Application.DisplayAlerts = True ' メッセージを表示
End Sub
配列に定義した名前以外のシート名を削除
あらかじめ残しておきたいシート名を配列に列挙しておき、それ以外のシート名であれば削除するようなプログラムです。
'配列に定義したシート名前以外のシートを削除
Sub noListName()
Dim i As Long
Dim arr, sh, shName
arr = Array("Sheet1", "Sheet2", "data")
Application.DisplayAlerts = False ' メッセージを非表示
For Each sh In Worksheets
For Each shName In arr
If sh.Name = shName Then GoTo LABEL
Next shName
'// arrに名前が無ければここに来る
'Debug.Print sh.Name
sh.Delete
LABEL:
Next sh
Application.DisplayAlerts = True ' メッセージを表示
End Sub
シート名にある文字列を含んでいる時は残す
あらかじめ残したいシートに、あるキーワードを付けておいて区別するように設計しておけば、いちいち配列に列挙する手間も省けます。次のプログラムは、 ”Sheet” という文字がシート名に含まれている場合は残し、それ以外は削除するようなプログラムです。
文字列が含まれているかどうかは、InStr関数を使って判断しています。
Sub inStrListName()
Dim i As Long
Dim sh
Dim s As String
s = "Sheet"
Application.DisplayAlerts = False ' メッセージを非表示
For Each sh In Worksheets
If InStr(sh.Name, s) > 0 Then GoTo LABEL
'// sの文字列がシート名前に含まれていなければここに来る
'Debug.Print sh.Name
sh.Delete
LABEL:
Next sh
Application.DisplayAlerts = True ' メッセージを表示
End Sub
コメント