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にしていきましょう。