日本語名

部品_シート名変更

英語名

RenameSheet

URL

https://feelcodelab.com/vba_parts/renamesheet/

用途

・指定したシート(Worksheet)の名前を、指定した名前に変更する
・シートコピーの直後に、コピーしたシートへ、名前を付けるときなどに使う
※ この部品は Sub(プロシージャ)ではなく「Function(関数)」で、成功/失敗を Boolean で返す

基礎区分

土台

用途区分

処理

操作対象区分

シート

前提条件

・【最重要】この部品は Function(関数)であり、戻り値(Boolean)を返す
  → 名前を変更できた場合は True、実行時にできなかった場合は False(この場合は、エラーでは止まらない)
  → 呼び出し側は、必ず戻り値を確認してから後続処理を行い、メッセージも呼び出し側で表示する
    (False のときは、MsgBox のあとに Exit Sub まで書く)
・【最重要】名前を変更するシート(vWs)は、Worksheet で渡す
  → シートコピーの直後は、ブックの ActiveSheet が、コピーしたシートになる(例:wbDst.ActiveSheet)
・新しい名前(vNewName)が、Excel で使えない名前の場合は、False ではなく、原因を示すエラーで止まる(1020)
  - 空白だけ・空文字
  - 31 文字を超える
  - 次の文字を含む:  :  \  /  ?  *  [  ]
  - 先頭または末尾が、アポストロフィ(')
  - 「History」(Excel が、予約している名前。大文字・小文字は区別しない)
・同じブックに、同じ名前のシートが、すでにある場合は、変更できず、False を返す
  → 呼び出し側が、先に、シート存在チェックで確認する(迷ったら分ける。例 2)
  → 大文字・小文字は、区別されない("Data" と "data" は、同じ名前)
  → 今の名前と、同じ名前を指定した場合は、変更せずに True を返す
・ブックの構成が保護されているときなど、実行時にできなかった場合は False を返す(原因は、イミディエイトウィンドウに出る)
・シート名を変えると、そのシートを指している数式('旧名'!A1)は、Excel が、自動で、新しい名前に直す。
  しかし、VBA のコードの中の、シート名の文字列(Worksheets("旧名"))は、直らない
・設定の誤りは、False ではなく、原因を示すエラーで止まる(Err.Raise)
  - シート(vWs)が Nothing(vbObjectError + 1006)
  - 新しい名前が、使えない名前(vbObjectError + 1020)
・Offset / Find / Resize / With は禁止

依存関係(部品)

・他の部品を参照しない(土台)
・組み合わせ:シートコピー → シート名変更
  (コピーした直後の、アクティブなシートに、名前を付ける)
・組み合わせ:シート存在チェック → シート名変更
  (同じ名前のシートが、すでにないかを、先に確認する)

依存関係(シート)

・対象のシートは、Worksheet で渡す(ブックは、シートが持っているので、ブックの引数は不要)
・同じブックに、同じ名前のシートが、すでにある場合は、変更できず、False を返す(先に、シート存在チェックで確認する)

引数

vWs         : 名前を変更するシート(Worksheet)
vNewName    : 新しい名前(String)。31 文字以内で、使えない文字を含まないこと

戻り値

Boolean : 名前を変更できた場合は True、実行時にできなかった場合は False

戻り値の型

Boolean

コード全文

Function 部品_シート名変更( _
        ByVal vWs As Worksheet, _
        ByVal vNewName As String) As Boolean

    部品_シート名変更 = f_RenameSheet(vWs, vNewName)

End Function

Function f_RenameSheet( _
        ByVal vWs As Worksheet, _
        ByVal vNewName As String) As Boolean

    Dim badChars As Variant
    Dim i As Long

    f_RenameSheet = False

    If vWs Is Nothing Then
        Err.Raise vbObjectError + 1006, "f_RenameSheet", _
                  "シート(vWs)が設定されていません(Nothing)。"
    End If

    If Len(Trim$(vNewName)) = 0 Then
        Err.Raise vbObjectError + 1020, "f_RenameSheet", _
                  "新しい名前(vNewName)が空です。"
    End If

    If Len(vNewName) > 31 Then
        Err.Raise vbObjectError + 1020, "f_RenameSheet", _
                  "新しい名前は、31 文字以内にしてください(現在は " & Len(vNewName) & " 文字:" & vNewName & ")。"
    End If

    badChars = Array(":", "\", "/", "?", "*", "[", "]")
    For i = LBound(badChars) To UBound(badChars)
        If InStr(vNewName, badChars(i)) > 0 Then
            Err.Raise vbObjectError + 1020, "f_RenameSheet", _
                      "新しい名前に、使えない文字「" & badChars(i) & "」が含まれています(" & vNewName & ")。"
        End If
    Next i

    If Left$(vNewName, 1) = "'" Or Right$(vNewName, 1) = "'" Then
        Err.Raise vbObjectError + 1020, "f_RenameSheet", _
                  "新しい名前の、先頭または末尾に、アポストロフィ(')は使えません(" & vNewName & ")。"
    End If

    If StrComp(vNewName, "History", vbTextCompare) = 0 Then
        Err.Raise vbObjectError + 1020, "f_RenameSheet", _
                  "「History」は、Excel が予約している名前のため、使えません。"
    End If

    On Error GoTo ErrHandler

    vWs.Name = vNewName

    f_RenameSheet = True
    Exit Function

ErrHandler:
    Debug.Print "f_RenameSheet: " & Err.Number & " " & Err.Description
    f_RenameSheet = False

End Function

呼び出し・活用事例

◆例1:シートコピーの直後に、名前を付ける◆
If 部品_シートコピー(wsTemplate, wsLast) = False Then MsgBox "コピーに失敗しました": Exit Sub
If 部品_シート名変更(wbDst.ActiveSheet, "2026年10月") = False Then
    MsgBox "名前を変更できませんでした"
    Exit Sub
End If

◆例2:同じ名前のシートが、すでにあるかを、先に確認する◆
If 部品_シート存在チェック(wbDst, "2026年10月") Then
    MsgBox "「2026年10月」は、すでにあります"
    Exit Sub
End If
If 部品_シート名変更(wbDst.ActiveSheet, "2026年10月") = False Then MsgBox "名前を変更できませんでした": Exit Sub

※ シートが Nothing の場合や、使えない名前の場合は、False ではなく、原因を示すエラーで止まる

BASファイル(ダウンロード)

RenameSheet.bas

バージョン

1.0

更新日

2026-10-30