Workbook_NewSheetイベント

シートが追加されたときにマクロを動かしたい場合があります。シートが追加されたことを検知するには、ThisWorkbookシートにWorkbook_NewSheetという名前のプロシージャ(関数)を用意しておく必要があります。

Workbook_NewSheetプロシージャの追加手順は以下の通りです。

  1. VBA画面で対象ブックのThisWorkbookシートを開きます。
  2. Workbookオブジェクトを選択します。このときWorkbook_Openプロシージャが作成されますが、これは使いませんので後で削除します。
  3. Workbook_NewSheetイベントを選択します。
  4. Workbook_NewSheetプロシージャが追加されます。先に作成されていたWorkbook_Openプロシージャは不要のため削除します。

これでWorkbook_NewSheetプロシージャが作成された状態になり、シートが追加されたときに検知できるようになります。


構文

Private Sub Workbook_NewSheet(ByVal Sh As Object)

Workbook_NewSheetプロシージャは、ブックの制御を行うThisWorkbookシートに書きます。シートが追加されたタイミングで呼び出されます。

ByVal 引数の値が変更不可であることを示します。
Sh 追加されたシートを表します。データ型はObject型です。「Sh」は”Sheet”の略と思われますが、「addSheet」など任意の引数名に書き換えても構いません。
Object 引数Shのデータ型はObject型です。別のデータ型への変更は出来ません。変更した場合、Workbook_NewSheetプロシージャが呼び出されたタイミングでエラー「コンパイルエラー:プロシージャの宣言が、イベントまたはプロシージャの定義と一致していません。」になります。

シートの追加時に発生するイベントなのに、データ型がWorksheet型ではなくObject型なのは、Excelにはシートの種類が複数あるためです。一般的にはワークシートしか使いませんが、グラフシート、Excel4.0マクロシート、ダイアログシートなどもシートとしては存在します。それを考慮してObject型として汎用的に扱えるようになっています。


追加されたシートを特定する

追加されたシートを特定するには、Workbook_NewSheetプロシージャの引数を利用します。

引数はObject型のデータですが、ワークシートを追加した場合はWorksheet型が実体になります。そのため、追加されたシートがワークシートであることが分かっている場合は、Worksheet型に変換して使う方が、以降の処理でWorksheetオブジェクトのメソッドやプロパティを利用しやすくなります。

念のため、WorksheetオブジェクトかどうかをTypeName関数で判定しておくと、Worksheetオブジェクトに変換できない場合のエラー回避になります。

以下のコードでは、引数がWorksheetオブジェクトの場合に引数のObject型からWorksheet型の変数に代入し、追加シートのシート名を出力しています。