シートオブジェクト.Deleteメソッド、Worksheet.Deleteメソッド

シートの削除はシートオブジェクトまたはWorksheetオブジェクトに対してDeleteメソッドで行います。

複数シートをまとめて削除することが可能です。ただしブックのシートを全て削除することはExcelの仕様上できないためエラーになります。また、存在しないシートを削除しようとした場合もエラーになります。

削除したシートはExcelの仕様と同様で、復元することは出来ません。

Deleteメソッドを行うとインデックス番号が変わる

Deleteメソッドの仕様で注意しておく点があります。

それはDeleteメソッドの実行する前と後でシートのインデックス番号が変わってしまうことです。

以下のようにA、B、C、D、Eの5つのシートがあるとします。インデックス番号は左から1から5までが設定されます。

このときにCのシートを削除します。そうすると、シートAとBのインデックス番号は変わりませんが、シートDとEのインデックス番号が4、5から3、4に変わります。

このようにDeleteメソッドを実行するとシートが削除されるため、インデックス番号が振り直されます。

インデックス番号はシートと紐づいているわけではなく、単に左から何番目かを指すだけなので、「新規ブックのSheet1はインデックス番号は1に固定される」ということはありません。

以下のようにSheet1が一番右にある場合はSheet1のインデックス番号は1ではなくなります。

Deleteメソッドを使うときはインデックス番号が変わることを認識しておく必要があります。

構文

Worksheet.Delete
Chart.Delete
DialogSheet.Delete
Window.SelectedSheets.Delete

Delete対象となる親オブジェクトを4つ挙げています。

一般的にはWorksheetオブジェクトが一番多いと思います。なお、ほとんど使わないとは思いますがマクロシートもWorksheetオブジェクトに含まれます。

Chartはグラフシート、DialogSheetはダイアログシートです。この2つはほとんど利用しないと思います。

SelectedSheetsはシートを複数選択時に使います。Windowオブジェクトをさらに親として指定します。

削除の確認ダイアログを表示させないようにするためには

Deleteメソッドを使うと削除確認のダイアログが表示されます。

ダイアログで「削除」か「キャンセル」を押さない限りVBAは処理を待ち続けます。

このダイアログを表示しないようにするためには以下のようにApplication.DisplayAlertsプロパティにFalseを設定して、ダイアログを非表示にします。処理が終わったらTrueに戻します。

処理が終わったあとはTrueにしましょう、といろんなサイトで書いてあると思います。そうするのは「設定を変えたらちゃんと戻しましょう」というプログラムの作法によるものですが、しなくても関数終了後に自動的にTrueになります。

なので、以下のコードのようにTrueに戻す処理が無くてもいいっちゃいいです。

 

サンプルコード

Worksheetオブジェクトのいろんな書き方での削除

Deleteメソッドの対象となるWorksheetオブジェクトのいろんな書き方での削除を行うサンプルです。

11行目のSheet4はマクロを実行するブックにSheet4というオブジェクトとしてのシートがなければエラーになります。

ダイアログシート、マクロシート、グラフシートの削除

ほとんど使わないとは思いますが、ダイアログシート、マクロシート、グラフシートの削除です。

Sheets(“aaa”)のようにシート名を指定するか、Sheets(1)のようにインデックス番号でDeleteメソッドを使うこともできますが、以下のように各シートを一度対象のオブジェクト変数に設定してから削除することも出来ます。