シートが挿入されたときに実行するNewSheetイベント イベントマクロ

シートが挿入されたときに実行するNewSheetイベント

シートが挿入されたときに実行するNewSheetイベント
シートが挿入されたときに実行するNewSheetイベント

イベントマクロ 16回

シートが挿入されたときに実行するNewSheetイベント

ブックのイベントとして、これまでブックが開かれたときに発生するOpenイベント、ブックを閉じる前に処理するWorkbook_BeforeClose、印刷する直前に発生するBefore.Printを紹介してきました。
今回は新しいシートを挿入した時に発生するNewSheetイベントを学習しましょう。

(サンプルファイルは、こちらから イベントマクロ16回サンプルデータ

シートが挿入時はNewSheetイベントが起きている

シートを新しく挿入すると、NewSheetイベントが発生します。このイベントでは引数として、新たに作成されたWorksheetオブジエクト、またはChartオブジェクトなどを表す意味で Sh が利用できます。

NewSheetの構文
 Workbook_NewSheet(ByVal Sh As Object)

引数名 データ型 説明
Sh Object イベントが発生すると、新しいシートが渡されます。 Worksheet オブジェクトまたは Chart オブジェクト を指定 できます。
Private Sub Workbook_NewSheet(ByVal Sh As Object) 
	’処理したい内容をここに記述
End Sub

シートを挿入したらブックの最後に移動

1.新しいシートを挿入したら、常にブックの最後に移動する 引数Shを使えますから、
Sh.Move After:= Sheets(Sheets.Count)
直前の枚数をかぞえてその後ろに移動します。


シートが挿入されたときに実行するNewSheetイベント-1

シートを挿入したら名前を設定する

2. こんどは、シートに名前をつけるようにします。
名前は InputBox によりユーザーが入力することにします。シート名を格納するための変数temp宣言してつかいます。

Private Sub Workbook_NewSheet(ByVal Sh As Object)
    Dim temp As String
    temp = InputBox("シート名を入力してください")
    Sh.Name = temp
End Sub

シートが挿入されたときに実行するNewSheetイベント-2

3. 上記マクロで気をつけなければならないことは、入力ダイアログで未入力でOKをクリックしたり、キャンセルしたりすると、エラーが発生してしまいます。
しかし、エラーが発生しても処理をつづけ、正しい名前を入力するようにメッセージで促すことにした方が、良いでしょう。
最後に、On Error GoTo 0ステートメントを利用して、一度設定したプログラムのエラー処理を無効にしています。

Private Sub Workbook_NewSheet(ByVal Sh As Object)
    Dim temp As String
    temp = InputBox("シート名を入力してください")
    On Error Resume Next
    Sh.Name = temp
    If Err.Number <> 0 Then
        MsgBox "シート名を正しく入力してください", vbExclamation
        Application.DisplayAlerts = False
        Sh.Delete
        Application.DisplayAlerts = True
    End If
    On Error GoTo 0
End Sub

シートが挿入されたときに実行するNewSheetイベント-3

4. 入力ダイアログで未入力でOKをクリックしたり、キャンセルしたりすると、エラーが発生。 そこでエラーでもメッセージを表示する。OKをクリックすると、シートが削除される。


シートが挿入されたときに実行するNewSheetイベント-4

シートを挿入したら名前を規則的に設定する

5. では例として、新しいシートを挿入したら、自動的にそのシートを一番後ろ右側に移動し、 前から並んでいるシートの順で、名前を規則的に設定するプロシージャを考えます。 そして、すでに何枚かシートがあるわけですから、そのシートの枚数を数えるための変数としてiをつかいます。 グラフシートは対象に入れないことにします。

Private Sub Workbook_NewSheet(ByVal Sh As Object)
    Dim i As Integer
    If TypeName(Sh) = "Worksheet" Then
        Sh.Move After:=Worksheets(Worksheets.Count)
        For i = 1 To Worksheets.Count
            Worksheets(i).Name = "令和3年" & _
                Format(Now, "mm月") & "_" & Format(i, "00")
        Next i
    End If
End Sub

シートが挿入されたときに実行するNewSheetイベント-5

6. 上記コードでは月だけをNow関数から取得しています。その後ろはシートの通し番号になっています。


シートが挿入されたときに実行するNewSheetイベント-6

7. シート名に月と日付を使いたい場合は
 Format(Now, "mmdd") のようにすれば 0810のように日付が入り、後ろは通し番号となります。


シートが挿入されたときに実行するNewSheetイベント-7

8. 次回はWorkbook_SheetChangeについて紹介します。

こちらもおすすめ