読者です 読者をやめる 読者になる 読者になる

アナログCPU:5108843109

ゲームと音楽とプログラミング(酒と女とロックンロールのノリで)

シートの存在を調べて存在しなければ新しいシートを作成

頻繁に使うロジックなので関数化してみました。

  • 任意の名称を持つシートが存在するかどうか調べる
  • 上記で存在しなければその名称で作成(もしくはあるシートをコピーしてその名称にする)
    ' 呼び出し例(1)
    Dim wsSheet As Worksheet
    Set wsSheet = SelectSheet("シートA", "テンプレート")
    ' → 常に wsSheet = ThisWorkbook.Sheets("シートA") となる。
    '    ただし、「シートA」が存在すればそのシート、
    '    存在せず、「テンプレート」シートが存在すればそれをコピーしたもの、
    '    「テンプレート」シートも存在しない場合は新規シート。

    ' 呼び出し例(2)
    Dim wsSheet As Worksheet
    Set wsSheet = SelectSheet("シートA")
    ' → 常に wsSheet = ThisWorkbook.Sheets("シートA") となる。
    '    ただし、「シートA」が存在すればそのシート、
    '    存在しない場合は新規シート。

'*
'* シートがなければ作成orコピーする関数
'* (有効なsBaseSheetが指定された場合、そのシートをコピーして名称をsSheetNameとする)
'*
'* [in]  sSheetName:取得するシートの名称
'*       sBaseSheet:コピー元 ※省略可
'* [out] SelectSheet:取得したシート
'*
'* 使用関数:CheckExistSheet
'*
Private Function SelectSheet(ByVal sSheetName As String, Optional ByVal sBaseSheetName As String = "") As Worksheet

    ' 変数
    Dim wsSheet As Worksheet
    Dim bFlag As Boolean
    
    ' シートの存在を調べ、なければ作る
    If CheckExistSheet(sSheetName) <> True Then
        ' 存在しないので、作成orコピーする
        If sBaseSheetName = "" Or CheckExistSheet(sBaseSheetName) = False Then
            ' コピー元シートを指定されていないor無効なシートなので新規作成
            ThisWorkbook.Sheets.Add After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
        Else
            ' コピー元シートをコピーして名称変更
            ' ※Copyの引数はコピーした後の位置。After:=(Before:=)を用いて指定する
            With ThisWorkbook.Sheets(sBaseSheetName).Copy(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
                ActiveSheet.Name = sSheetName
            End With
        End If
    End If
    
    '指定された名称のシートを返す
    Set SelectSheet = ThisWorkbook.Sheets(sSheetName)
    
End Function

'*
'* シートが存在するか調べる関数
'*
'* [in]  sSheetName:存在を調べるシート名
'* [out] CheckExistSheet:結果(存在すればTrue、しなければFalse)
'*
Private Function CheckExistSheet(ByVal sSheetName As String) As Boolean

    ' 変数
    Dim wsSheet As Worksheet
    
    ' 戻り値のデフォルト値をFalseに
    CheckExistSheet = False
    
    For Each wsSheet In Worksheets
        If wsSheet.Name = sSheetName Then
            ' シートが存在すれば戻り値をTrueにしてループから抜ける
            CheckExistSheet = True
            Exit For
        End If
    Next wsSheet
    
End Function