トップ > 汎用コード > アクティブブックのシート名を一括変更

アクティブブックのシート名を一括変更2023.05.24 更新日:2023.05.25

アクティブブックのワークシート名を[基準名]+[(3桁) 連番]に設定するマクロです。
シート名の変更対象となるシートは、見出しに色がついていないシートです。 シート名を変更したくないシート (変更対象外シ ート) は、見出しに何らかの色を設定してください。
変更対象外シートの名前とマクロで自動設定される名前が重複する場合、変更対象外シートには、ランダムな名前が設定されます。
ワークシート数が999を超えるブックには対応していません。
基準名は自由に設定できますが、シート名に設定できる文字数が 31 文字までのため、マクロ内では、連番の 3 桁を引いた 28 文字までに制限しています。

■参考動画


【お薦め】マクロ・プロシージャを管理する無料のツール!
 Excelマクロ管理ツール

サンプルコード2023.05.24 更新日:2023.05.25

コードの貼り付け場所   VBAコードをカラーで印刷・Web掲載するためのツールはこちら

'----------------------------------------------------------------------------------
' アクティブブックのワークシート名を一括変更
'----------------------------------------------------------------------------------
' アクティブブックのワークシート名を[基準名]+[(3桁) 連番]に設定するマクロです
' シートの見出しに色がついていないものを変更対象とします
' ワークシート数が999を超えるブックには対応していません
' シート名の文字数制限の関係で基準名は最大28文字までとなります
'[作成日]2023/05/24 [更新日]2023/05/25
' https://excel.syogyoumujou.com/vba/rename_worksheets.html
'----------------------------------------------------------------------------------
Sub RenameActivebookWorksheets()

    Const CNAME As String = "サンプル" '基準名
    
    Dim strErrorMessage As String
    
    'ブックの保護の確認
    If ActiveWorkbook.ProtectWindows Then
        strErrorMessage = "ブックが保護されています"
        GoTo ERROR_HANDLER
    End If

    '基準名の文字数確認
    If 28 < Len(CNAME) Then
        strErrorMessage = "基準名が長すぎます (最大28文字)"
        GoTo ERROR_HANDLER
    End If
    
    'ワークシート名を配列に格納
    Dim i               As Long
    Dim c               As Long
    Dim strSheetsName() As String
    With ActiveWorkbook
        For i = 1 To .Worksheets.Count
            ReDim Preserve strSheetsName(c)
            strSheetsName(c) = .Worksheets(i).Name
            c = c + 1
        Next
    End With
    If c = 0 Then
        strErrorMessage = "ワークシートがありません"
        GoTo ERROR_HANDLER
    ElseIf 999 < c Then
        strErrorMessage = "ワークシートが多すぎます"
        GoTo ERROR_HANDLER
    End If

    '新しい名前の作成 [基準名]+[(3桁)連番]
    ReDim strNewSheetsName(0 To c - 1) As String
    For i = 0 To c - 1
        strNewSheetsName(i) = CNAME & Format$(i + 1, "000")
    Next
    
    On Error GoTo ERROR_HANDLER
    
    '現在のシート名と新しい名前の重複確認
    Dim varMatch    As Variant
    Dim strRndName  As String
    Dim varMatchRnd As Variant
    For i = 0 To c - 1
        varMatch = Application.Match(strNewSheetsName(i), strSheetsName, 0)
        '名前が重複していた場合には、仮のシート名を設定
        If Not IsError(varMatch) Then
            With ActiveWorkbook.Worksheets(strSheetsName(varMatch - 1))
                Do
                    strRndName = Left$(.Name, 26) & "_" & WorksheetFunction.RandBetween(1, 1000)
                    varMatchRnd = Application.Match(strRndName, strSheetsName, 0)
                Loop Until IsError(varMatchRnd)
                .Name = strRndName
            End With
            strSheetsName(varMatch - 1) = strRndName
        End If
    Next
    
    'シートに新しい名前を設定
    Application.ScreenUpdating = False
    Dim lngCount As Long
    For i = 0 To c - 1
        With ActiveWorkbook.Worksheets(strSheetsName(i))
            'タブに色がついていないシートのみ連番を設定する
            If .Tab.ColorIndex = xlNone Then
                .Name = strNewSheetsName(lngCount)
                lngCount = lngCount + 1
            End If
        End With
    Next
    Application.ScreenUpdating = True
    
    On Error GoTo 0
Exit Sub
ERROR_HANDLER:
    If Err.Number <> 0 Then
        strErrorMessage = "エラー番号:" & Err.Number & vbLf
        strErrorMessage = Err.Description
    End If
    MsgBox strErrorMessage, vbExclamation, "終了します"
End Sub

ページトップへ戻る

Excel 汎用コード

Copyright(C) 2009- 坂江 保 All Rights Reserved.