データ集計や顧客リストの整理をしていると、「気づいたらExcelのシートが50枚以上に増えていた…」なんてことはありませんか?
必要なシートは「売上表」と「顧客名簿」だけなのに、他を1枚ずつ右クリックして「削除」を押す作業。1枚3秒かかるとすると、50枚で150秒(2分半)もかかります。しかも、間違えて必要なシートを消してしまうリスクもあります。
今回は、そんな「ポチポチ作業」を卒業して、「指定したシート以外を数秒で一括削除する魔法」を紹介します。
コピペで使えるVBAコード
まずは、以下のコードをコピーして使ってみてください。
今回は例として、「残したいシート」と「集計結果」という名前のシート以外をすべて削除する設定にしています。
Sub DeleteSheetsExceptSpecified()
Dim ws As Worksheet
Dim keepSheet1 As String
Dim keepSheet2 As String
' --- 設定エリア:残したいシート名をここに入力 ---
keepSheet1 = "残したいシート"
keepSheet2 = "集計結果"
' --------------------------------------------
' 確認メッセージをオフにする(「本当に消しますか?」を出さない)
Application.DisplayAlerts = False
' すべてのシートを順番にチェックする
For Each ws In ThisWorkbook.Worksheets
' シート名が指定した名前以外の場合、削除する
' ※少なくとも1枚はシートを残す必要があります
If ws.Name <> keepSheet1 And ws.Name <> keepSheet2 Then
If ThisWorkbook.Worksheets.Count > 1 Then
ws.Delete
End If
End If
Next ws
' 確認メッセージをオンに戻す
Application.DisplayAlerts = True
MsgBox "削除が完了しました!"
End Sub
プログラムの仕組みと動作の流れ
このプログラムがどのような処理を行っているのか、3つのステップに分けて解説します。
- 削除しないシート名を保持する:keepSheet1などの変数に対して、削除から除外したいシート名を記憶させます。
- 削除確認のメッセージ表示を一時停止する:通常、シート削除時には確認メッセージが表示されますが、DisplayAlerts = False を指定することで、警告を出さずにスムーズな連続処理を可能にします。
- 全シートの名前を確認して不要なものを削除する:For Each構文を用いてすべてのシート名を順番に確認し、指定したシート名以外のものを自動的に削除していきます。
実行時の注意点
- 元に戻す操作(Ctrl+Z)ができません:VBAを用いて削除したシートは元に戻すことができませんので、実行前に必ずファイルを保存しておくことをおすすめします。
- すべてのシートを削除することはできません:Excelの仕様上、ブック内に最低1枚のシートを残す必要がありますのでご注意ください。
VBAを独学で学び、業務自動化に5年以上携わってきた私が、「本当に実務で役立った!」と感じた2冊を紹介します。 もう本選びで失敗したくない方は、よければ参考にしてみてください。
リンク
リンク

コメント