シート名をつけるときのルールと注意点

今回の目標

「シートで使えない文字って、なに?!」や「VBAでシート名にできるかチェックするには?」と思ったあなたへ。
この記事では、シート名の命名規則とマクロでチェックする方法を丁寧に解説します!

目標リスト

  • シート名にできないルールについて、理解する
  • マクロでシート名にできるかチェックできるようになる

説明

シート名の変更について

Excelでは、シート名を変更することが出来ますが、一定のルールがあります。 これを守らないとエラーになるため、変更時は注意が必要です。

シート名に使えない名前について

シート名にできないルールは、主に4種類あります。

1.シート名に使用できない文字

シート名には、次の7文字を使うことができません。
これらは半角・全角いずれの場合でもエラーになります。

: ¥ / ? * [ ]

2.ブックに同名のシート名がある場合

ブック内に同じシート名を2つ以上つけることはできません。
既に存在するシート名を設定しようとすると、エラーになります。

3.シート名の長さが 1文字 ~ 31文字 でない

シート名は、1文字以上31文字以内にする必要があります。
0文字(空文字)はエラーになります。32文字以上を入力すると、エラーでなく先頭31文字がシート名になります。
※ マクロから設定する場合、0文字や、32文字以上のシート名にすると「実行時エラー1004」になります。

4.シート名の先頭や末尾は「' (アポストロフィ)」は使えない

シート名の先頭(最初の1文字)や、末尾(最後の1文字)を「 ' (アポストロフィ)」にできません。

シート名にできない名前の例
①:'Sheet2
  → シート名の先頭に「 ' 」があるため、NG
②:Sheet2'
  → シート名の末尾に「 ' 」があるため、NG

シート名にできる名前の例
①:Sheet'2
  → シート名の途中に「 ' 」があるため、OK

各項目をチェックするプログラム

1.シート名に使用できない文字が含まれていないか

シート名に使用できない文字 『 : ¥ / ? * [ ] 』 が含まれてないか、InStr関数で確認します。 この使用できない文字は、全角/半角かかわらず使用できません。 InStr関数は、第4引数に「vbTextCompare」を指定することで、全角と半角を区別せずに確認できます。 ただし、「¥」だけは、全角「¥」と半角「¥」が別文字として扱われるため、個別に確認する必要があります。

 リンク:InStr関数で、半角と全角を区別せずに位置を取得する

サンプルコード

Sub CheckSheetName1()
    Dim forbChars() As Variant   'forb = forbidden
    Dim buf As Variant
    Dim newShNm As String   'ShNm = newSheetName
    Dim num As Long
    Dim forbStr As String
    Dim flag As Boolean
    
    '確認するシート名
    newShNm = "設定 *VLOOKUP用"
    
    'シート名に使用できない文字列(全角「¥」が必要)
    forbChars = Array("¥", "¥", "/", ":", "*", "?", "[", "]")
    flag = False
    
    '使用できない文字1つずつ、確認する
    For Each buf In forbChars
        'vbTextCompareを指定して、全角もチェックする
        num = InStr(1, newShNm, buf, vbTextCompare)
        If 0 < num Then
            flag = True
            Exit For
        End If
    Next buf
    
    If flag Then
        Debug.Print "シート名に使用できない文字が含まれています。"
    Else
        Debug.Print "シート名に使用できない文字はありません。"
    End If
End Sub
【実行結果】

シート名に使用できない文字が含まれています。

2.ブックに同名のシート名が存在していないか

ブック内に、同じ名前のシートがすでに存在していないかを確認します。
シートの存在確認は「For構文 + Worksheets.Count」を使う方法と、「For Each構文」を使う方法の2通りがありますが、ここでは後者を使います。

サンプルコード

Sub CheckSheetName2()
    Dim buf As Worksheet
    Dim flag As Boolean
    Dim newShNm As String   'ShNm = newSheetName
    
    '確認するシート名
    newShNm = "Sheet1"
    flag = False
    
    'ブックを1シートずつ、名前が一致していないか確認する
    For Each buf In Worksheets
        If buf.Name = newShNm Then
            flag = True
            Exit For
        End If
    Next buf
    
    If flag Then
        Debug.Print "ブックに同名のシートが存在します。"
    Else
        Debug.Print "ブックに同名のシートはありません。"
    End If
End Sub
【実行結果】

ブックに同名のシートが存在します。

3.シート名は、1文字~31文字以内か

シート名は、1字~31字以内である必要があります。
文字数を確認するには、Len関数 を使って確認します。

サンプルコード

Sub CheckSheetName3()
    Dim flag1 As Boolean
    Dim flag2 As Boolean
    Dim newShNm As String   'ShNm = newSheetName
    
    '確認するシート名
    newShNm = ""
    
    flag1 = Len(newShNm) = 0
    flag2 = Len(newShNm) > 31
    
    IsInvalidLength = (flag1 Or flag2)
End Sub
【実行結果】

シート名が空文字か、31文字を超えています

4.シート名の先頭もしくは末尾が ' でないか

シート名の先頭や、末尾を「 ' (アポストロフィ)」にできません。
先頭の1文字を確認するには Left関数、 末尾の1文字を確認するには Right関数 を使います。

サンプルコード

Sub CheckSheetName4()
    Dim flag1 As Boolean
    Dim flag2 As Boolean
    Dim newShNm As String   'ShNm = newSheetName
    
    '確認するシート名
    newShNm = "'Sheet1"
        
    flag1 = Left(newShNm, 1) = "'"
    flag2 = Right(newShNm, 1) = "'"
    
    If flag1 Or flag2 Then
        Debug.Print "先頭か末尾が「 ' 」です。"
    Else
        Debug.Print "先頭か末尾が「 ' 」ではありません。"
    End If
End Sub
【実行結果】

先頭か末尾が「 ' 」です。

チェックプログラムまとめ

各チェック項目をまとめた関数

安全にシート名を変更するには、上記4つのチェックを行う必要があります。 これらの関数をまとめたプログラムです。

サンプルコード

Sub IsPossibleSheetName()
    Dim newShNm As String   'newShNm = newSheetName
    Dim flag1 As Boolean, flag2 As Boolean
    Dim flag3 As Boolean, flag4 As Boolean
    
    newShNm = "'abc?A"
    
    'シート名で使用できない文字が含まれていないか
    flag1 = HasForbiddenChars(newShNm)
    '既に同名のシート名が存在しないか
    flag2 = IsSheetNameUsed(ThisWorkbook, newShNm)
    'シート名の文字の長さは、1字~31字 か
    flag3 = IsInvalidLength(newShNm)
    'シート名の先頭もしくは末尾を ' にすることはできない
    flag4 = IsEdgeApostrophe(newShNm)
    
    'どれか1つでも当てはまると、シート名には使えません
    If flag1 Or flag2 Or flag3 Or flag4 Then
        Debug.Print newShNm & "は、次の理由によりシート名に使用できません。"
        If flag1 Then Debug.Print "・シート名に使用できない文字が含まれています"
        If flag2 Then Debug.Print "・既に同名のシート名が存在しています"
        If flag3 Then Debug.Print "・シート名の長さが、0文字または31文字を超えています"
        If flag4 Then Debug.Print "・シート名の先頭もしくは末尾が ' です"
    Else
        Debug.Print newShNm & "はシート名に使用できます。"
    End If
End Sub


'--------------------------------------------------------------
' シート名で使用できない文字が含まれているかを返す
'   newShNm:確認対象のシート名
'   戻り値:True/シート名に使用できない文字が含まれている
'--------------------------------------------------------------
Function HasForbiddenChars(ByVal newShNm As String) As Boolean
    Dim forbChars() As Variant   'forb = forbidden
    Dim buf As Variant
    Dim num As Long
    Dim forbStr As String
    
    'シート名に使用できない文字列
    forbChars = Array("\", "¥", "/", ":", "*", "?", "[", "]")
    
    '使用できない文字1つずつ、確認する
    For Each buf In forbChars
        num = InStr(1, newShNm, buf, vbTextCompare)
        If 0 < num Then
            HasForbiddenChars = True
            Exit Function
        End If
    Next buf
    
    HasForbiddenChars = False
End Function

'--------------------------------------------------------------
' ブックに同名のシート名が既に存在していないか確認する
'   wb     :確認対象のブック名(シート名を追加/変更するブック)
'   newShNm:確認対象のシート名
'   戻り値:True/同名のシート名が存在している
'--------------------------------------------------------------
Function IsSheetNameUsed(ByRef wb As Workbook, ByRef newShNm As String) As Boolean
    Dim buf As Worksheet
    
    'ブックを1シートずつ、名前が一致していないか確認する
    For Each buf In wb.Worksheets
        If buf.Name = newShNm Then
            IsSheetNameUsed = True
            Exit Function
        End If
    Next buf
    
    IsSheetNameUsed = False
End Function

'--------------------------------------------------------------
' 新しいシート名が1文字~31文字に収まっているか
'   newShNm:確認対象のシート名
'   戻り値:True/シート名が、0文字または31文字を超えている
'--------------------------------------------------------------
Function IsInvalidLength(ByRef newShNm As String) As Boolean
    Dim flag1 As Boolean
    Dim flag2 As Boolean
    
    flag1 = Len(newShNm) = 0
    flag2 = Len(newShNm) > 31
    
    IsInvalidLength = (flag1 Or flag2)
End Function

'--------------------------------------------------------------
' シート名の先頭や末尾に ' を使用していないか確認する
'   newShNm:確認対象のシート名
'   戻り値:True/新しいシート名の先頭や末尾が ' である
'--------------------------------------------------------------
Function IsEdgeApostrophe(ByRef newShNm As String) As Boolean
    Dim flag1 As Boolean
    Dim flag2 As Boolean
    
    flag1 = Left(newShNm, 1) = "'"
    flag2 = Right(newShNm, 1) = "'"
    
    IsEdgeApostrophe = (flag1 Or flag2)
End Function
【実行結果】

'abc?Aはシート名に使用できません。
・シート名に使用できない文字が含まれています
・シート名の先頭もしくは末尾が ' です

関連リンク

ページの先頭へ