ループ処理で1つずつシート名を比較し削除
繰り返し処理の中で、1つずつ「処理中のワークシート名」と「指定したシート名」を比較し、名前が違う時に削除処理をおこないます。
コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Dim targetSheet As Worksheet '繰り返し用 '警告メッセージを表示しない Application.DisplayAlerts = False '削除処理 For Each targetSheet In Worksheets If targetSheet.Name <> "5月の成績表" Then targetSheet.Delete End If Next '警告メッセージを表示 Application.DisplayAlerts = True |
解説
繰り返し処理(For Each)の中で、targetSheet.Name(処理しているシートの名前)と”5月の成績表”を比較して、異なる時そのシートを削除しています。
処理がすべて終わると、”5月の成績表”以外のシートはすべて削除されます。
実際にプログラムを自分で作る時は、この”5月の成績表”を変更してください。
ブックの中に、削除から除外するシートがない(例だと”5月の成績表”シートがブックにない)と、すべてのシートを削除することになります。
すると、プログラムを実行するとブックに1つもシートがない状態になってしまうので、エラーが発生してしまいます。
複数のシートを除外したい時
複数のシートを除外したい時は、除外したいシートの数だけANDで条件をつなげていきます。
コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Dim targetSheet As Worksheet '繰り返し用 '警告メッセージを表示しない Application.DisplayAlerts = False '削除処理 For Each targetSheet In Worksheets If targetSheet.Name <> "5月の成績表" And targetSheet.Name <> "6月の成績表" Then targetSheet.Delete End If Next '警告メッセージを表示 Application.DisplayAlerts = True |
解説
8行目のIf文の意味は「シート名が5月の成績表でない、かつシート名が6月の成績表でない時」となります。
結果として、”5月の成績表”と”6月の成績表”以外のシートは削除されます。
ただし、除外したいシートがもっと増えた時、ANDとtargetSheet.Nameが増えてコードが長くなり見にくくなります。
実際に「Ifで複数指定」のコードを見てください。3つのシートを除外しています。
より見やすいソースに
サンプルソースのようにIf文で条件を追加していくと、除外するシートが増えるた時、プログラムが長く見にくくなってしまいます。
修正前:Ifを使ったソース
1 2 3 4 5 |
If targetSheet.Name <> "5月の成績表" And targetSheet.Name <> "6月の成績表" And targetSheet.Name <> "7月の成績表" Then targetSheet.Delete End If |
このような時は、Select Caseを使うと見やすくシンプルになります。
修正後:Select Caseを使ったソース
1 2 3 4 5 6 7 8 9 10 |
Select Case targetSheet.Name Case "5月の成績表", "6月の成績表", "7月の成績表" '削除対象外なので、処理はなし Case Else '指定したシート以外なので削除 targetSheet.Delete End Select |
Select Caseを使い慣れていないと難しく感じるかもしれませんが、コードがシンプルになるので使ってみてください。
その他テクニックは、次の記事を参考にしてください。
https://excel-toshokan.com/vba-sheet-delete/