部品_シート名変更
RenameSheet
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 ではなく、原因を示すエラーで止まる 1.0
2026-10-30