任意のセルに入力された文字列を使って、その名前の新しいワークシートを作成するには、たとえば次のようにします。下記のサンプルは、セルA1に入力された文字列を名前に持つ新しいワークシートを挿入します。
Sub Sample1() Worksheets.Add.Name = Range("A1") End Sub
余談ですが、新しいワークシートの名前は必ず「Sheet?」となります。「?」には任意の数が入り、それはExcelが管理しています。つまり、いきなり「"tanaka"という名前のワークシートを挿入」することはできないのです。任意の名前のワークシートを挿入するには、
という二段階の処理が必要になります。上記のサンプルは
Sub Sample1() Dim buf As String buf = Range("A1") Worksheets.Add ActiveSheet.Name = buf End Sub
と同じですが、Addメソッドが「挿入したシートを返す」という特徴を利用しています。
さて、上記のコードは完全ではありません。たとえば、セルA1が空欄だったらどうしましょう。あるいは、セルA1の文字列に、シート名に指定できない文字が含まれていたらどうでしょう。ほかにも、すでに同じ名前のシートが存在しているかもしれません。
これらの心配を、すべて判定するのなら次のようなコードになります。
Sub Sample2() Dim buf As String, c, ws buf = Range("A1") ''(1)空欄かどうか If buf = "" Then Exit Sub ''(2)不正な文字があるか For Each c In Array(":", "\", "/", "?", "*", "[", "]") If InStr(buf, c) > 0 Then Exit Sub Next c ''(3)文字数が31文字以内か If Len(buf) > 31 Then Exit Sub ''(4)同じ名前が存在するか For Each ws In Worksheets If ws.Name = buf Then Exit Sub Next ws ''すべてクリアした Worksheets.Add.Name = buf End Sub
なんだか面倒くさいですね。こんな苦労をしなくても、発想を変えれば簡単に解決できます。セルA1に「適正な文字」が入力されているかどうかを判断するのではなく、セルA1の文字で名前の変更を試みて「エラーになるかどうか」を判定すればいいんです。
Sub Sample3() On Error GoTo Err1 Worksheets.Add.Name = Range("A1") Exit Sub Err1: Application.DisplayAlerts = False ActiveSheet.Delete Application.DisplayAlerts = True End Sub
不正な名前を設定しようとするとエラーが発生します。On Error GoTo Err1は、エラーが発生したら「Err1」にジャンプせよという命令です。先にも書きましたが、任意の名前を持つワークシートを挿入するときは、
という二段階の処理になります。今回のケースでエラーになるのは、このうち(2)の部分です。(1)の処理は正常に終わっていますので、すでに新しいワークシートは挿入されていることになります。エラーが発生したら、すでに挿入してしまった新しいワークシートを削除します。そのとき「削除しますか?」というメッセージを表示させないために、DisplayAlertsプロパティにFalseを設定してからDeleteメソッドを実行しています。