
シート名を簡単に書く方法があれば教えてください。
シート名が長い場合など、シートの名前を変更するのが煩わしいので、下記のようなマクロを作りました。
この場合、シートのB2とB3に、変更後の名前と変更前の名前を書くことだけなので、他からコピーもできるし、長い文字も簡単に書けます。ただ、うまくいくときとうまくいかない時があり、うまくいかない時は
実行時エラー9 インデックスが有効範囲にありません
となります。
マクロの内容は
Sub ■■シート名の変更方法()
'
' ■シート名の変更方法
'1.現状のシート名をRange("B3")に書きます。
'2.変更したい名前をRange("B2")に書きます。
'3.この ■■シート名の変更方法 を実施します。
Dim myrng1 As Range
Dim myrng2 As Range
Set myrng1 = Range("B3")
Set myrng2 = Range("B2")
Sheets("" & myrng1 & "").Name = "" & myrng2 & ""
' Range("B3") = ""
' Range("B2") = ""
End Sub
です。
該当シートの、B3に現在のシート名、B2に変更したいシート名を書いて実行します。
できることもあるのですが・・・。
よろしくお願いいたします。
No.4ベストアンサー
- 回答日時:
エラーが発生する理由は、他の回答者の方々の指摘通りです。
以下のマクロは、
エラーが発生する要因をチェックして、エラーが発生する可能性がある場合、その理由をメッセージボックスに表示します。
従って、エラーがメッセージボックスに表示されない場合は、
正常にシート名が変更されます。
以下のマクロを使用してみてください。
もし、このマクロを使用しても、
"実行時エラー9 インデックスが有効範囲にありません"
等のエラーが発生する場合は、その旨、返信ください。
Public Sub シート名変更()
Dim sname0 As String '変更前シート名
Dim sname1 As String '変更後シート名
Dim ws As Worksheet
Dim ts As Worksheet
Dim estr As String
Set ws = ActiveSheet
sname0 = ws.Range("B3").Text
sname1 = ws.Range("B2").Text
If check_exist(sname0) = False Then
Call errorp("B3", sname0, "このシートは存在しません")
End If
sname1 = Trim(sname1)
If sname1 = "" Then
Call errorp("B2", sname1, "空白です")
End If
If Len(sname1) > 31 Then
Call errorp("B2", sname1, "31文字を超えています")
End If
If check_char_code(sname1, estr) = False Then
Call errorp("B2", sname1, "不正な文字(" & estr & ")を使用しています")
End If
If check_exist(sname1) = True Then
Call errorp("B2", sname1, "このシートは既に存在します")
End If
Set ts = Worksheets(sname0)
ts.Name = sname1
MsgBox ("変更完了")
End Sub
Private Sub errorp(addr, sname, msg)
Dim msg0 As String
msg0 = "シート名不正 " & addr & ":" & sname & vbLf & "不正理由:" & msg
MsgBox (msg0)
End
End Sub
Private Function check_exist(ByVal sname As String) As Boolean
check_exist = True
Dim ws As Worksheet
On Error GoTo ERROR99
Set ws = Worksheets(sname)
Exit Function
ERROR99:
check_exist = False
End Function
Private Function check_char_code(ByVal sname As String, ByRef estr As String) As Boolean
check_char_code = True
Dim sp_chars As Variant
Dim i As Long
Dim wc As String
sp_chars = Array(":", "\", "?", "[", "]", "/", "*", "'")
For i = 0 To UBound(sp_chars)
wc = sp_chars(i)
If InStr(1, sname, wc, vbTextCompare) > 0 Then
estr = wc
check_char_code = False
Exit Function
End If
Next
End Function
ありがとうございます。
貴重なマクロ、大変助かります。
原因が半角スペースだったようで、今は一応解決しましたが、今後も起こる可能性があるので、このマクロ大いに利用させていただきます。
本当にありがとうございました。
No.3
- 回答日時:
>実行時エラー9 インデックスが有効範囲にありません となります。
とのことですが、ご質問者のコードを見て、最初に思いついたのは、シート名が「2023年7月」というシート名を「2023年8月」というシート名に変更するケースです。
この場合、B3に「2023年7月」と入力すると、セルの中身は「2023/7/1」となってしまうので、
Sheets("" & myrng1 & "").Name = "" & myrng2 & ""
というコードを実行しようとすると、シート名が見つからないという意味で「インデックスが有効範囲にありません」となります。
これを防ぎ、月日のようなシリアル値の絡む名前や表示形式を使った名前であっても、見えているとおりに名前変更を行うために、上記コードを
Sheets(myrng1.Text).Name = myrng2.Text
とすればよいのではないかと思います。
ありがとうございます。
どうも半角スペースが混じっていたようです。
ご回答にある日付の問題も今後出てきそうなので、参考にさせていただきます。
ありがとうございました。
No.2
- 回答日時:
こんにちは
無条件で入力値を採用しているので、おかしな値を入力すればエラーになる可能性は充分にあります。
>実行時エラー9 インデックスが有効範囲にありません
一番ありそうなのは、「指定された名前のシートが存在しない」ケースでしょうか?
例えば、正しく指定しているつもりでも、セルの最後にスペースが入っているとか、セル内改行コードがついていて気が付かないとか。
あるいは、英数記号などの半角、全角の違いでも正しく入力されていなければ、「シートは存在しない」となります。
その他にも、シート名には使用できない文字や文字数の制限等もありますので、それらに該当すればrename時にエラーとなるでしょう。
また、既に存在するシート名と同じ名前に変えようとしても同様です。
エラーを起こしたくなければ、入力値を事前にきちんとチェックする必要があると思われます。
・指定されたシート名の文字数が制限値以下か
・シート名に使用できない文字が含まれていないか
・変更前のシート名のシートは存在しているか
・変更後のシート名のシートが、既に存在してはいないか
など。
ありがとうございました。
調べてみたら、半角が混じっていた可能性がありました。
今は治っていますので、今度なったら、再度確認いたします。
No.1
- 回答日時:
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
- Excel(エクセル) ②Excel 簡単にシートコピーしたら前日の残高と日付を変更させたい→マクロの記録でエラーが出ます 8 2022/07/16 20:40
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/03/08 09:08
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 4 2023/05/26 10:43
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/03/07 14:05
- Visual Basic(VBA) 特定の文字を含むシートだけマクロ処理をしたい 1 2023/05/22 01:43
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/03/12 10:10
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2022/06/10 11:06
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/06/01 14:45
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/03/02 08:40
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・昔のあなたへのアドバイス
- ・字面がカッコいい英単語
- ・許せない心理テスト
- ・歩いた自慢大会
- ・「I love you」 をかっこよく翻訳してみてください
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・はじめての旅行はどこに行きましたか?
- ・準・究極の選択
- ・この人頭いいなと思ったエピソード
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルの複数シートの保護を...
-
別シート参照のセルをシート毎...
-
Excel、同じフォルダ内のExcel...
-
【Excel関数】値が合致するセル...
-
前の(左隣の)シートを連続参...
-
エクセルで前シートを参照して...
-
エクセルでファイルを開いたと...
-
特定のシートの削除を禁止した...
-
Excelで金銭出納帳。繰越残高を...
-
VBAで条件によりフォントサイズ...
-
Accessのスプレッドシートエク...
-
エクセル 計算式も入っていない...
-
エクセルで前のシートを連続参...
-
EXCEL:同じセルへどんどん足し...
-
エクセルVBAでパスの¥マークに...
-
【Excel マクロ】 同一book内で...
-
EXCELで1ヶ月分の連続した日付...
-
Excel シートに画像が貼ってあ...
-
エクセルで、「1つ前のシート...
-
エクセルVBA 串刺し計算の際、...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルの複数シートの保護を...
-
別シート参照のセルをシート毎...
-
前の(左隣の)シートを連続参...
-
Excelで金銭出納帳。繰越残高を...
-
エクセル 計算式も入っていない...
-
特定のシートの削除を禁止した...
-
EXCEL:同じセルへどんどん足し...
-
エクセルでファイルを開いたと...
-
シート番号からシート名を取得する
-
シートの保護のあとセルの列、...
-
エクセルVBAでパスの¥マークに...
-
Excel、同じフォルダ内のExcel...
-
エクセルで前シートを参照して...
-
Excelのシートを、まとめて表示...
-
エクセルで前のシートを連続参...
-
エクセルのシート名をリスト化...
-
Accessのスプレッドシートエク...
-
複数シートの特定の位置に連番...
-
EXCELで1ヶ月分の連続した日付...
-
VBAで条件によりフォントサイズ...
おすすめ情報