和風スパゲティのレシピ

日本語でコーディングするExcelVBA

シート名を取得・変更する - Nameプロパティの使い方

ワークシートの名前を取得したり、変更する場合は、
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)と、「重複するたびに連番を増やして付けるマクロ」を組みたい場合は、以下の記事を参考ください。

www.limecode.jp


商品として売るプログラムでなく、実務使うマクロであるならば、
「3つ被ったら手で直すか(´∀`)」
くらいでも、十分だと思いますけどね。