以下の内容はhttps://www.limecode.jp/entry/fungo/077-workbook-newsheet-eventより取得しました。


77本目:シート挿入イベント

Excel&VBA解説サイト「エクセルの神髄」様出題の問題集、
VBA100本ノック」に対する私の回答と解説のページです。

100本ノックの出題リストはこちらから
excel-ubara.com

出題:シート挿入イベント

#VBA100本ノック 77本目
シートが挿入された場合、その新規シートに対して以下の処理を行う。
・ブック内の最終シート(一番後ろ)に移動する
・シート名は当日の「yyyymmdd」とする
・既に同一シート名が存在する場合は挿入したシートは削除
※常に一番後ろにシートが挿入され当日の名前になる。

シート挿入イベント
◇ 出題ページはこちら

ソースコード

ThisWorkbookモジュール

' 100本ノック077:シート挿入イベント
Private Sub Workbook_NewSheet(ByVal Sh As Object)
    
    Dim シート名 As String: シート名 = Format(Date, "yyyymmdd")

    If Isシートが存在する(シート名, ThisWorkbook) Then
        Call シートを削除する(Sh)
        ThisWorkbook.Worksheets(シート名).Activate
        MsgBox "本日のシートは既に存在します。"
        Exit Sub
    End If

    Sh.Name = シート名
    Sh.Move after:=Get最終シート(ThisWorkbook)

End Sub

汎用関数モジュール

' シートの存在判定
' 参考:https://www.limecode.jp/entry/utility/existsworksheet
Function Isシートが存在する(判定シート名 As String, 指定ブック As Workbook) As Boolean

    ' ブック内の全シートを走査
    Dim ws As Worksheet
    For Each ws In 指定ブック.Worksheets

        ' シート名が一致したらTrueを返してExit
        If ws.Name = 判定シート名 Then
            Isシートが存在する = True
            Exit Function
        End If

    Next

End Function

' シートの削除
' 参考:https://www.limecode.jp/entry/procedure/displayalerts-true-false
Sub シートを削除する(削除シート As Worksheet)
    Application.DisplayAlerts = False
    削除シート.Delete
    Application.DisplayAlerts = True
End Sub

' 最終シートの取得
' 参考:https://www.limecode.jp/entry/utility/getlastsheet
Function Get最終シート(指定ブック As Workbook) As Worksheet
    Set Get最終シート = 指定ブック.Worksheets(指定ブック.Worksheets.Count)
End Function

解説

シート挿入時のイベントにはWorkbook_NewSheetプロシージャを使用します。

コード自体はストレートな処理のため、特に解説は不要と思います。


今回使用した3つの汎用関数
「シートの削除」「シートの存在判定」「最終シートの取得」
は、簡単ながら非常に便利な関数です。


こういった「簡単だけど書くのが面倒なコード」こそ、
作るのが簡単な割に使い勝手がよく、汎用関数化のメリットが大きいです。

数行の、あるいは1行のコードであってもためらわずにFunctionにしていきましょう。




以上の内容はhttps://www.limecode.jp/entry/fungo/077-workbook-newsheet-eventより取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14