- ベストアンサー
Excelマクロにてシートの削除を行いたいです。
初めて投稿させて頂きます。 質問内容 Excelのマクロを使用して指定シート以外のシートの削除を行いたいです。 前条件 外部CSVファイルを取込み、データによってシートを追加して振り分けています。 再度マクロを実行した場合特定のシートを残し(フォーマット等)、他のシートを削除してからデータの振り分けを実施する予定です。 やってみた事 下記の様に書いて実施してみたのですがエラーとなってしまいます。 Sub Clear() Application.DisplayAlerts = False For I = 1 To Worksheets.Count If (Worksheets(I).Name <> "sheet") Then Sheets(Worksheets(I).Name).Select ActiveWindow.SelectedSheets.Delete End If Next I Application.DisplayAlerts = True End Sub 上記の書き方だと1シート毎削除なので、選択したシートを一括で削除出来るとうれしいです。 どなたかご存知の方お願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは No.2の回答で目的は達せられると思います。 なぜ元々の FOR~NEXT文でうまくいかないか? それは、deleteを発行した時点でどんどんシート数が減っていくのにNEXT文がきた段階でiがインクリメントされてWorksheets(i).Name が範囲を超えてしまう(シート数を越える)からだと思います。 ループ文で処理するなら数を減らす処理と同じイメージでループを回すべきでした。 一例です。Sub Clear() Dim i As Long Application.DisplayAlerts = False Sheets(Worksheets("Sheet").Name).Activate Let i = Worksheets.Count While Worksheets.Count <> 1 If (Worksheets(i).Name <> "Sheet") Then Sheets(Worksheets(i).Name).Select ActiveWindow.SelectedSheets.Delete End If Let i = i - 1 Wend Application.DisplayAlerts = True End Sub
その他の回答 (2)
削除したくないシート名を間違うと大変なことになりますが、 以下のような感じではダメでしょうか? Sub Clear() Dim WS As Worksheet Application.ScreenUpdating = False Application.DisplayAlerts = False For Each WS In Worksheets If WS.Name <> "sheet" Then WS.Delete Next Application.DisplayAlerts = True Application.ScreenUpdating = True End Sub
お礼
書き込みありがとうございます。 さっそく実施してみた所うまくいきました。 お手数をお掛けして申し訳ございません。 ありがとうございます(^∀^)
- n-jun
- ベストアンサー率33% (959/2873)
>選択したシートを一括で削除出来るとうれしいです。 Ctrlキーを押しながらシートタブを左クリックして作業グループとし、 右クリックで”削除”を選べばOKです。 と言う事ではないのですか? 結局該当するシートか否かをループで判断していく手間は、同じだと思いますけど。。。
補足
書き込みありがとうございます。 >Ctrlキーを押しながらシートタブを左クリックして作業グループとし、 >右クリックで”削除”を選べばOKです。 上記方法でもいいのですが追加されるシートの数が沢山ある為、一つ一つ選択するのはかなり大変です。 もし間違えて消しては駄目なシートを消してしまうと外部CSVファイルを取込んでも何のデータだか分からなくなってしまうので、マクロにて一括で処理したいです。 申し訳ございません。
お礼
書き込みありがとうございます。 ループをして For I = 1 To Worksheets.Count を実行された時点でWorksheets.Countが再度実行される物だと思い込んでいました。 詳しく書いて頂いてありがとうございます。