Workbook_NewSheetイベント
シートが追加されたときにマクロを動かしたい場合があります。シートが追加されたことを検知するには、ThisWorkbookシートにWorkbook_NewSheetという名前のプロシージャ(関数)を用意しておく必要があります。
Workbook_NewSheetプロシージャの追加手順は以下の通りです。
- VBA画面で対象ブックのThisWorkbookシートを開きます。
- Workbookオブジェクトを選択します。このときWorkbook_Openプロシージャが作成されますが、これは使いませんので後で削除します。
- Workbook_NewSheetイベントを選択します。
- 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型の変数に代入し、追加シートのシート名を出力しています。
1 2 3 4 5 6 7 8 9 10 11 12 |
Private Sub Workbook_NewSheet(ByVal Sh As Object) Dim ws As Worksheet '// 引数がWorksheet型である場合 If TypeName(Sh) = "Worksheet" Then '// Object型からWorksheet型に代入 Set ws = Sh '// 追加シートの名前を出力 Debug.Print ws.Name End If End Sub |