ワークシートの名前を取得したり、変更する場合は、
WorksheetオブジェクトのNameプロパティを使用します。
ワークシートの名前を取得する
Dim シート名 As String シート名 = Worksheet(1).Name
このように、「ワークシート.Name」というコードを使って、シート名を取得することができます。
至極当たり前の話ですが、
MsgBox Worksheets("売上データ").Name
このコードを実行すると、「売上データ」と表示されます。
Worksheets("○○")の○○部分と同じものが返ってくるプロパティですね。
頻出のサンプルコードを添えておきますと、
例えば「セルにシート名を出力したい」場合は、
Range("A1") = Worksheets(1).Name
このように記述します。
また、「売上データという名前のシートがブック内にあるか調べたい」場合は、
Const 判定シート名 = "売上データ" Dim isシートが存在 As Boolean Dim シート番号 As Long For シート番号 = 1 To Worksheets.Count If Worksheets(シート番号).Name = 判定シート名 Then isシートが存在 = True Exit For End If Next If isシートが存在 Then Msgbox(判定シート名 & "はこのブックに存在します。") Else Msgbox(判定シート名 & "はこのブックに存在しません。") End If
このようなコードを実行します。
ワークシートの名前を変更する
続いてシート名を変更する場合は、
Worksheet(1).Name = "変更したいシート名"
と、「ワークシート.Name」に変更するシート名を代入します。
こちらも単純明快ですね。
例えば「セル値を使ってシート名を変更する」場合は、
Worksheets(1).Name = Range("A1")
などのように記載すればよいことになります。
シート名を変更したときに出るエラー
シート名を変更する場合は、以下の二種類のエラーに対応する必要があります。
入力されたシートまたはグラフの名前が正しくありません。次の点を確認して修正してください。
? 入力文字が 31 文字以内であること
? 次の使用できない文字が含まれていないこと: コロン (:)、円記号 (\)、スラッシュ (/)、疑問符 (?)、アスタリスク (*)、左角かっこ ([)、右角かっこ (])
? 名前が空白でないこと
エラーメッセージの通り、シート名では「31文字以内」にすることと、「使えない文字」に気を付ける必要があります。
セル値などを使って、機械的にシート名をつけようとしたときに発生しがちなエラーですね。
文字数の方は簡単で、
Worksheets(1).Name = Left(シート名, 31)
このようにLeft関数で32文字以降をカットしてしまえばOKです。
禁則文字の方はちょっと面倒で、
Dim シート名 As String シート名 = "\\変更シート名\\" ' ←このままではエラー シート名 = Replace(シート名, ":", "") シート名 = Replace(シート名, "\", "") …
と、該当の文字をReplace関数で1個ずつ消してあげる必要があります。
いちいち全部のReplaceを書くのが面倒なので、
Dim シート名 As String シート名 = "\\変更シート名\\" ' ←このままではエラー Dim Arr禁則文字リスト Arr禁則文字リスト = Split("',’,',*,:,?,\,¥,*,/,:,?,[,[,],],\,/,<,>", ",") Dim 禁則文字 For Each 禁則文字 In Arr禁則文字リスト シート名 = Replace(シート名, 禁則文字, "") Next Worksheets(1).Name = Left(シート名, 31)
このコードで、変数に入れたシート名から禁則文字を全て消すことができます。
禁則文字が格納された配列を作って、その要素の数だけReplaceを繰り返し実行するコードですが、よくわからなければコピペして使ってしまってください。
かなり安定なコードなので、コピペ実行してもエラーなどはあまり起きないと思います。
この名前は既に使用されています。別の名前を入力してください。
こちらは単純で、シート名がダブってしまった場合はエラーとなります。
対策は「既に存在するシート名か判定し、被ったら連番などをつける」ですが、
わざわざシートが存在するか調べるコードを書くのは面倒なので、
以下のコードにすると良いでしょう。
Dim シート名 As String シート名 = "変更シート名" On Error Resume Next Worksheets(1).Name = シート名 If Worksheets(1).Name <> シート名 Then Worksheets(1).Name = シート名 & "(2)" End If On Error GoTo 0
流れを説明しますと、
まずOn Error Resume Nextでエラーを無視する設定にしておくことで、
Worksheets(1).Name = シート名
こちらは失敗してもマクロは止まらず、スキップしてくれます。
スキップされたかどうかは、
If Worksheets(1).Name <> シート名 Then
と、終わった後で目的のシート名になっているかを調べればよいですね。
なっていなければ、被ったということなので、(2)をつけて再度試します。
それでも無理ならそのままになります。
終わった後はOn Error GoTo 0でOn Error Resume Nextを解除するのを忘れずに。
これを忘れると、以降の処理でもエラーが無視されるようになり、
エラーを検知できない危険なマクロと化してしまいます。
なお、(2)でもダメなら(3)、それでもダメなら(4)と、「重複するたびに連番を増やして付けるマクロ」を組みたい場合は、以下の記事を参考ください。
商品として売るプログラムでなく、実務使うマクロであるならば、
「3つ被ったら手で直すか(´∀`)」
くらいでも、十分だと思いますけどね。