Excelでシートの削除を確認するためには

知ってたら得するかもしれないExcelの癖-その2
この記事は約4分で読めます。

知っていると得するかもしれないExcelの癖」シリーズ第十九回、テーマは「シートの削除確認」になります。
Excel 2016バージョン1903を使用して確認しています。


マクロを使用しないでシートの存在を確認する方法はネット上でいくつか紹介されていますが、「本当に削除されたか?」を確認する時のやり方について忘備録的にまとめて置きたく存じます。

スポンサーリンク

SHEET関数でシート名の存在を確認する

SHEET関数でシート名を確認する方法は下記になります。

=SHEET("シート名")

この関数は「指定されたシート名のシート番号をもとめるのが本来の役割」ですが、該当するシート名が存在しない場合は「#N/A」が返ります。そこでISNA関数を使用すればシート名の存在を確認することができます。

=ISNA(SHEET("シート名"))

ただ、この場合シート名を変更されても「TRUE」となりますので、削除された事の確認としては不十分になります。

なお余談になりますが、シートの削除をするとSHEET関数で求められるシート番号はふり直されてしまいます。
Aシート、Bシート、Cシートのシート番号が1、2、3だった場合、Bシートを削除するとCシートのシート番号は「2」になりますので注意が必要です。

話を元に戻します。
シート名が変更される心配があるのであれば、SHEET関数はそれはそれとして、各シートの絶対に削除されないセルに「名前の定義」で名前を付けるやり方もあります。

例えばAシートのA1セルは絶対に削除されないセルだとすると、そのセルに「シートA」と名前を定義します。

この状態で、Aシートをシート削除すると数式タブ→「定義された名前」のリボングループ→「名前の管理」で名前「シートA」を確認すると「値」が「#REF!」になっています。

そこで次の数式でAシートの存在を確認することができます。

=ISERROR(シートA)

「シートA」は名前ですので、「”」でくくってはいけません。

ただし、これもマクロ(VBA)を使用しないとなると「シートA」という名前が削除されたことまでを判断することはできません。

変更されたのではない事を確認するためには

SHEET関数から求められるシート番号を使ってシートを特定することができる機能があれば良いのですが、現在のバージョンではマクロ(VBA)を除きそのような関数は提供されていません。

となると、回りくどいやり方で確認するしか方法が残されていません。

①まずはSHEETS関数でブック内のシートの総数を求める

SHEETS関数を使うと、ブックに含まれるシート数を求めることができます。

=SHEETS()

ただ、残念なことにこの関数は「本当に」すべてのシート数を返してくれます。
「本当に」というのは、非表示のシートだけにとどまらず本シリーズの第十一段「Excelで気づかれ難い署名を残したい時」でご説明した「xlSheetVeryHidden」に設定した「隠しシート」もカウントアップしてしまいますので注意が必要です。

なおSHEETS関数でシート名の範囲を指定してシート数を求めることはできます。
先ほどのAシート、Bシート、Cシートを例にすると下記のように指定の仕方になります。

=SHEETS("Aシート:Cシート"!A1)

ただしCシートの並びの位置は変えることができますので、確実に数を把握したい場合はこの方法では難しい認識です。

②既存シートのシート名および「名前」でその他のシートの存在を確認する

そうなると、少し面倒ではありますが、これしか方法がないのでやむを得ません。

つぎにSHEET関数で残っているはずのすべてのシート名の存在と各シートに設定した「名前」を確認します。
その後で①で調べたシートの総数と一致することを確認します。

これにより削除するはずのシート名のシートが無い事を確認できることになります。

なお既存シートのシート名を変えられていたり、「名前」を削除されたりしていたら一致しないことになりますが、それは運用ルールで縛るしかない認識です。

シートの削除を許すとなるとブックを保護することはできない

「ブックの保護」も強制解除できる以上完全性はありませんが、「シートの保護」の場合は編集できるセルが指定できるように、「ブックの保護」の場合にも削除できるシートが設定できれば有難いのですが、残念ながら現在のバージョンではそのような機能は提供されていません。

ちなみに「シートの保護」をしていてもシートを削除することはできてしまいます。

まとめ

セキュリティ強化の時代の流れとともに、E古いバージョンとの互換性を気にしながらExcelの機能も変化してきた訳ですが、シートの制御に関して、マクロ(VBA)を使用せずとも可能になるようになってくれることを期待したいところです。

今回は、シート名が変更されていても判断できるように、シート名と「名前」のダブルチェックでの方法をお伝えしましたが、実際には「どれくらいの正確性と利便性で判断する必要があるのか?」によって「やる」、「やらない」を決めることになる認識です。

以上、最後までご一読いただきありがとうございました。