シート名をつけるときのルールと注意点
今回の目標
「シートで使えない文字って、なに?!」や「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はシート名に使用できません。
・シート名に使用できない文字が含まれています
・シート名の先頭もしくは末尾が ' です