Developer

【ExcelVBA】ブックのイベント④「Workbook_NewSheet」
2022.08.31
Lv1

【ExcelVBA】ブックのイベント④「Workbook_NewSheet」

ブックのイベント④「Workbook_NewSheet」

ブックのイベントを利用したマクロを作成するには、VBEのプロジェクトエクスプローラーで「ThisWorkbook」をダブルクリックします。
今回は「Workbook_NewSheet」を紹介します。

このイベントは、新しいシートを挿入したときに必ず実行されます。
Excelにはシートはいくつかありますが、下位互換のために残されているものを除くと2つしかありません。
「ワークシート」・・・ もっともよくつかわれるシートで、表形式で数値や式を入力可能なものです。
「グラフシート」・・・ グラフを表示するための専用シートです。

このイベントはどちらのシートを挿入した場合も実行されてしまいます。
そのため、例えば特定のセルの操作をする場合など、ワークシートを対象とする処理を記述する際には、追加されたシートが「ワークシート」であることを確認しておく必要があります。

このイベントの使用例としては、追加されたときのシート名を別のものに変える(日付など)や、シートを追加できないようにするといったことができます。

Private Sub Workbook_NewSheet(ByVal Sh As Object)
    '' ここに処理を書く
End Sub

引数の「Sh」は追加されたシートが格納されています。
この変数を使うことで追加されたシートが「ワークシート」なのか「グラフシート」なのかといったことも確認することができます。特定のセルの操作をする場合も同様です。

サンプルプログラム

「Workbook_NewSheet」イベントを使用したサンプルプログラムです。
これは特定の会社への請求書を作るシステムで、ひな形シートを作っておくと新しくシートを挿入したときにそのひな形をコピーします。
また、シート追加時に日付を入力できるようにし、その日付を請求日として追加されたシートにセットします。
シート名にもその日付を使用しいつの請求書かシート名から判断できるようにします。

コピーされるひな形シートはこのようなイメージです。

プログラムはこのようになります。

Private Sub Workbook_NewSheet(ByVal Sh As Object)
    Dim text As String
    
    '' 追加されたシートをがワークシートか確認
    If TypeName(Sh) = "Worksheet" Then
        
        '' 請求日を入力する。デフォルト値として本日をセット
        text = InputBox("請求日を入力してください。", "請求日の設定", Format(Now(), "yyyy/mm/dd"))
        
        '' 未入力 or 入力された日付が正しくない場合
        If IsDate(text) = False Then
            '' エラーメッセージを表示
            MsgBox "日付の入力形式が正しくありません", vbExclamation
            
            '' シートを追加しない(追加されたシートを削除する)
            Application.DisplayAlerts = False '' シートを削除するときの警告を抑止
            Sh.Delete
            Application.DisplayAlerts = True
            
            Exit Sub
        End If
        
        
        '' シート名を変更。請求月を入力した値から設定。
        Sh.name = "請求書(" & Format(CDate(text), "yyyy年mm月") & ")"
        
        '' ひな形シートの中身をすべてコピー
        Worksheets("請求書(ひな形)").Activate
        ActiveSheet.Cells.Select
        Selection.Copy
        
        '' 追加したシートに張り付け
        Sh.Paste
        
        '' 追加したシートに表示を切り替え
        Sh.Activate
        With ActiveSheet
            .Range("A1").Select
            .Range("G3").Value = text '' 入力した請求日をセット
        End With
    End If
    
End Sub

サンプルプログラムの処理の流れ(フロー)は次のようになっています。
青い枠はユーザー側の操作を、オレンジの枠はVBA側の処理を表しています。

順を追ってみていきましょう。
まず、これまでブックのイベント①~③の連載で見てきたものと異なるのは、プロシージャが実行されるタイミングになります。
これまでは例えば保存であれば「保存の前」、印刷であれば「印刷の前」にプロシージャが実行されていました。
今回は、シートが追加された後にプロシージャが実行されます。
フローを見てみると、「Worksheet_newSheet(Sh)のスタート」より前に「Shシートが追加」があります。

処理がスタートするとまず追加されたシートの種類を確認しています。
もし、ワークシートでなければそこで処理が終了です。

次に、InputBoxを使って請求日を入力します。

ユーザーに何か入力を求めるときには、値が入力されているか(必須チェック)、入力された値の形式が正しいか(形式チェック)などの入力チェックを行う必要があります。
今回はIsDate関数を使用して必須チェックおよび形式チェックをひとまとめに行っています。

もしこのチェックでエラーと判断された場合は、エラーメッセージを表示し処理終了です。
このように日付形式ではない値を入力すると、

このようにエラーメッセージが表示されます。

ただし、このまま終了してしまうと、これまでに既に説明したように、Shシートが追加されているため空のワークシートが残ったままになってしまいます。そのため、Shシートの削除処理を追加しています。
VBAからシートを削除しようとすると、削除確認のダイアログが表示されます。
この確認は不要ですので「Application.DisplayAlerts = False」を行い確認しない設定に切り替えています。この設定は削除処理が終了したあとに「True」に戻しておきます。

ここまでくればあと一息です。
入力された値を使ってシート名に請求月を表示します。
ひな形シートの中身をすべてコピーし、追加したShシートに張り付けます。
最後にShシートにアクティブを切り替えれば終了です。

無事に「2022年08月」のシートが追加されました。

まとめ

「Workbook_NewSheet」はブックのイベントのうちの1つで、新しいシートが挿入されたときに実行されます。
引数のShには追加されたシートが格納されています。
シートを追加をキャンセルしたいときや、追加されたシートを操作したいときはこのShに対して操作を行います。

確認問題

Excelにおいて「シート」にはいくつかの種類が存在します。そのうちの2つをあげなさい。

答え

Excelにはシートはいくつかありますが、下位互換のために残されているものを除くと2つしかありません。
「ワークシート」・・・ もっともよくつかわれるシートで、表形式で数値や式を入力可能なものです。
「グラフシート」・・・ グラフを表示するための専用シートです。

次回も、引き続き「ブックのイベントについて」です。