VBAと日々のこぼれ話

  1. VBA

【VBA】要らないシートをまとめて全部消したい

使わなかったシートをまとめて片づけたい

相変わらず楽に作業を進めたい

ブック内で使うのは「Sheet1」を名前変更したシートだけで「Sheet2」以降は全部要らないから複数選択、その後シートの削除を実行することありませんか?
そんな時に必要なシート以外はまとめて削除するサンプルコードです。

まとめてシート削除のサンプルコード

対象のExcelブックの全てのシートを1シートごとに確認し、指定された削除対象外のシート以外に対してシートの削除を実行しています。
条件を変えると、対象のシート(複数設定も可)を消すこともできます。(ブックは未保存)

以前紹介したシートのフォーマットをまとめて整えるコードと同様に、マクロ記載以外のExcelを指定することも可能ですが、やはり「ファイルが開いていること」が前提です。

【スポンサーリンク】



対象ブックのシート名を全部取得して、ループ処理をする理由

新規ブックのシート数は任意変更できるから

あまり知られていないイメージがあるのですが、新規Excelブック作成時にブック内に初めから存在するシート(Sheet1,Sheet2・・・といった名前のシート)の数は変更することが可能(※)です。使用しているPC(Excelソフト)毎に設定できます。
※Excel2010以降にはこの設定変更が可能だったはず。

設定方法は、Excel2016では、エクセル上のリボン「ファイル」→「オプション」→「基本設定」の『ブックのシート数』

自分のPCでは、新規ブック作成の時にシートが3枚ができ、「うちSheet2以降は不要だから」と、オウンコーディングで「Sheet2削除」「Sheet3削除」なんてコードを書いていると他のPCで実行するとエラーが返ってくる可能性があります。またこのコードの存在を忘れて、自分のPCのExcel設定を変更していたといったことも意外とあるあるエラー原因です。

「設定等に依存せずにどんなPC(Excel搭載)でも同じように動く」という理想になるべく近づけたい。
そこで、敢えて削除しないシートを処理対象外としたループ処理を利用している訳です。

ループ条件に付いて

特段の理由がない限り、通常は一番左端のシートから処理を進めていきます。

今回は、あえて一番右のシートから処理を実行しています。

それは、一番初めにシート数を取得→そのシート数分ループ処理を実行する作りなのですが、左端からシートの削除処理を実施すると途中でシート削除が発生した場合に次のループ処理以降でシート数>シートのインデックス番号でエラーが発生するためです。(エラーが発生しないのは、一番右の1シートのみが削除対象外である場合だけ)

そこで当初のシート数=シートのインデックス番号の最大値であること、(途中でシート削除が発生しても)常に一番右側のシートを処理対象にする(できる)ことでエラーが発生しないようになっています。

【スポンサーリンク】



処理中の確認メッセージを表示を制御する

「Application.DisplayAlerts」

手作業でシートを削除する際に、本当に削除しても良いかという確認メッセージが表示されますよね。マクロはとどのつまり、その手作業を自動処理に置き換えたものなので当然このマクロ実行時にもこのメッセージが表示されます。

確認メッセージが表示されている間は処理が中断されてしまうので、それを避けるために処理実行中のメッセージについて非表示・処理後に表示するよう設定しています。

VBAの最近記事

  1. 【VBA】(VBAを始めたばかりの人が陥りがちな落とし穴) Excelシートの最終行を取得…

  2. 【VBA】QRコードを作成したい

  3. 【VBA】CSVを1行ずつ処理したい

  4. Excelシートの最終行を取得したい その1

  5. 【VBA】未だに苦手としていること

関連記事

【スポンサーリンク】




PAGE TOP