次のコードをご覧ください。
Sub Sample() Dim SheetName As String, i As Long SheetName = InputBox("シート名を入力してください") If SheetName = "" Then Exit Sub For i = 1 To Sheets.Count If SheetName = Sheets(i).Name Then MsgBox SheetName & " は存在します" Exit Sub End If Next i Sheets.Add(After:=ActiveSheet).Name = SheetName End Sub
新しいワークシートを挿入するマクロです。挿入したシートには、ユーザーが入力した名前を付けます。実際に試してみましょう。
すでに存在する名前が指定された場合はメッセージを表示して処理を中止するようにしています。しかし、このマクロには重大なバグが隠れています。何だと思いますか。この先を読む前に、まずはじっくりとコードを読んでください。
では、バグの正体を明らかにしましょう。もう一度実行してみます。
新しいシート名として「SHEET3」を指定したらエラーになりました。このブックにはすでに「Sheet3」が存在しています。シート名は大文字と小文字を区別しないので、新しい「SHEET3」とすでに存在する「Sheet3」は同じ名前だと判定されてエラーになったのです。これは、ユーザーが入力した文字列と、既存のシート名を「If SheetName = Sheets(i).Name」と単純に比較しているのが原因です。このように、大文字と小文字を区別しないケースでは、あと一工夫が必要になります。
「SHEET3」と「Sheet3」を比べて"同じ"と判定するにはどうしたらいいでしょう。これには発想の柔軟さが必要です。そもそも、大文字と小文字が混在しているからいけないんです。どちらも大文字に変換してしまえば、大文字/小文字による差異はなくなります。文字列を大文字に変換するにはUCase関数を使います。
Sub Sample() Dim SheetName As String, i As Long SheetName = InputBox("シート名を入力してください") If SheetName = "" Then Exit Sub For i = 1 To Sheets.Count If UCase(SheetName) = UCase(Sheets(i).Name) Then MsgBox SheetName & " は存在します" Exit Sub End If Next i Sheets.Add(After:=ActiveSheet).Name = SheetName End Sub
もちろん、どちらも小文字に変換してもいいです。文字列を小文字に変換するのはLCase関数を使います。