【VBA】SheetUtil

Option Explicit

'v1
'****************************************************
'シート操作処理
'----------------------------------------------------
'SheetUtil
'****************************************************
'MakeSheet              -シートを作成
'DeleteSheet            -シートを削除
'CopySheet              -シートをコピー
'MoveSheet              -シートを移動
'ChangeSheetName        -シート名を変更
'GetSheetList           -シート名の一覧を取得
'ExistsSheet            -シートの存在確認
'VisibleSheet           -シートを表示する
'InvisibleSheet         -シートを非表示にする
'****************************************************

'----------------------------------------------------
'■シートを作成
'----------------------------------------------------
'備考:作成位置は一番右
'----------------------------------------------------
'引数1:対象のブック
'引数2:(Optional)作成したシートの格納先
'----------------------------------------------------
'戻り値:実行結果 ※エラーがなければTrue
'----------------------------------------------------
Public Function MakeSheet(aWorkBook As Workbook, Optional aReturn As Worksheet) As Boolean
On Error GoTo Err
    '作成
    aWorkBook.Sheets.Add after:=aWorkBook.Sheets(aWorkBook.Sheets.Count)
    Set aReturn = aWorkBook.Sheets(aWorkBook.Sheets.Count)
    MakeSheet = True
    If logging Then AddLog "SheetUtil.MakeSheet", "INFO ", "対象:" & aWorkBook.Name
    Exit Function
Err:
    If logging Then AddLog "SheetUtil.MakeSheet", "ERROR", "エラー内容:" & Err.Description
End Function

'----------------------------------------------------
'■シート削除
'----------------------------------------------------
'引数1:対象のブック
'引数2:削除するシート名
'----------------------------------------------------
'戻り値:実行結果 ※エラーがなければTrue
'----------------------------------------------------
Public Function DeleteSheet(aWorkBook As Workbook, aSheetName As String) As Boolean
On Error GoTo Err
    Application.DisplayAlerts = False
    'シートが存在しなければ警告
    If Not ExistsSheet(aWorkBook, aSheetName) Then GoTo Warn
    '削除
    aWorkBook.Sheets(aSheetName).Delete
    DeleteSheet = True
    If logging Then AddLog "SheetUtil.DeleteSheet", "INFO ", "対象:" & aSheetName
    GoTo Finally
Warn:
    DeleteSheet = True
    If logging Then AddLog "SheetUtil.DeleteSheet", "WARN ", "対象:" & aSheetName & " / 警告内容:対象のシートが存在しません"
    GoTo Finally
Err:
    If logging Then AddLog "SheetUtil.DeleteSheet", "ERROR", "対象:" & aSheetName & " / エラー内容:" & Err.Description
Finally:
    Application.DisplayAlerts = True
End Function

'----------------------------------------------------
'■シートをコピー
'----------------------------------------------------
'備考:作成位置は一番右
'----------------------------------------------------
'引数1:コピー元のシート
'引数2:(Optional)コピー先のブック   ※指定しなければコピー元のブックに作成
'引数3:(Optional)コピーしたシートの格納先
'----------------------------------------------------
'戻り値:実行結果 ※エラーがなければTrue
'----------------------------------------------------
Public Function CopySheet(aOrigin As Worksheet, Optional aDestination As Workbook, Optional aReturn As Worksheet) As Boolean
On Error GoTo Err
    'コピー先の指定がなければコピー元に作成
    If aDestination Is Nothing Then Set aDestination = aOrigin.Parent
    'コピー
    aOrigin.Copy after:=aDestination.Sheets(aDestination.Sheets.Count)
    Set aReturn = aDestination.Sheets(aDestination.Sheets.Count)
    CopySheet = True
    If logging Then AddLog "SheetUtil.CopySheet", "INFO ", "コピー元ブック名:" & aOrigin.Parent.Name & " / コピー元シート名:" & aOrigin.Name & " / コピー先ブック名:" & aDestination.Name
    Exit Function
Err:
    If logging Then AddLog "SheetUtil.CopySheet", "ERROR", "エラー内容:" & Err.Description
End Function

'----------------------------------------------------
'■シートを移動
'----------------------------------------------------
'備考:別ブックに移動。移動位置は一番右
'----------------------------------------------------
'引数1:移動元のシート
'引数2:移動先のブック
'引数3:(Optional)移動したシートの格納先
'----------------------------------------------------
'戻り値:実行結果 ※エラーがなければTrue
'----------------------------------------------------
Public Function MoveSheet(aSource As Worksheet, aDestination As Workbook, Optional aReturn As Worksheet) As Boolean
On Error GoTo Err
    '移動
    aSource.Move after:=aDestination.Sheets(aDestination.Sheets.Count)
    Set aReturn = aDestination.Sheets(aDestination.Sheets.Count)
    MoveSheet = True
    If logging Then AddLog "SheetUtil.MoveSheet", "INFO ", "移動元ブック名:" & aSource.Parent.Name & " / 移動元シート名:" & aSource.Name & " / 移動先ブック名:" & aDestination.Name
    Exit Function
Err:
    If logging Then AddLog "SheetUtil.MoveSheet", "ERROR", "エラー内容:" & Err.Description
End Function

'----------------------------------------------------
'■シート名を変更
'----------------------------------------------------
'引数1:対象のシート
'引数2:変更するシート名
'----------------------------------------------------
'戻り値:実行結果 ※エラーがなければTrue
'----------------------------------------------------
Public Function ChangeSheetName(aWorkSheet As Worksheet, aSheetName As String) As Boolean
On Error GoTo Err
    '変更前の名前を保管
    Dim beforeSheetName As String: beforeSheetName = aWorkSheet.Name
    '名前を変更
    aWorkSheet.Name = aSheetName
    ChangeSheetName = True
    If logging Then AddLog "SheetUtil.ChangeSheetName", "INFO ", "変更前のシート名:" & beforeSheetName & " / 変更後のシート名:" & aSheetName
    Exit Function
Err:
    If logging Then AddLog "SheetUtil.ChangeSheetName", "ERROR", "変更後のシート名:" & aSheetName & " / エラー内容:" & Err.Description
End Function

'----------------------------------------------------
'■シート名の一覧を取得
'----------------------------------------------------
'備考:非表示のシートも取得する
'----------------------------------------------------
'引数:対象のブック
'----------------------------------------------------
'戻り値:取得結果(Collection)
'----------------------------------------------------
Public Function GetSheetList(aWorkBook As Workbook) As Collection
    Dim v As Variant
    Set GetSheetList = New Collection
    For Each v In aWorkBook.Sheets
        GetSheetList.Add v.Name
    Next
End Function

'----------------------------------------------------
'■シート存在確認
'----------------------------------------------------
'引数1:対象のブック
'引数2:確認するシート名
'----------------------------------------------------
'戻り値:確認結果     ※存在すればTrue
'----------------------------------------------------
Public Function ExistsSheet(aWorkBook As Workbook, aSheetName As String) As Boolean
    Dim v As Variant
    For Each v In aWorkBook.Sheets
        If v.Name = aSheetName Then ExistsSheet = True: Exit For
    Next
End Function

'----------------------------------------------------
'■シートを表示する
'----------------------------------------------------
'引数1:対象のブック
'引数2:(Optional)対象のシート名  ※省略で全シート表示
'----------------------------------------------------
Public Function VisibleSheet(aWorkBook As Workbook, Optional aSheetName As String)
    Dim v As Variant
    For Each v In aWorkBook.Sheets
        If aSheetName = "" Then: v.Visible = True
        If aSheetName = v.Name Then: v.Visible = True: Exit For
    Next
End Function

'----------------------------------------------------
'■シートを非表示にする
'----------------------------------------------------
'引数1:対象のブック
'引数2:対象のシート名
'引数3:(Optional)VeryHidden  ※Trueで完全非表示(手で再表示できない)
'----------------------------------------------------
Public Function InvisibleSheet(aWorkBook As Workbook, aSheetName As String, Optional aIsVeryHidden As Boolean)
    Dim v As Variant
    For Each v In aWorkBook.Sheets
        If v.Name = aSheetName Then
            If aIsVeryHidden Then v.Visible = xlVeryHidden
            If Not aIsVeryHidden Then v.Visible = False
            Exit For
        End If
    Next
End Function