シート名を簡単に書く方法があれば教えてください。
シート名が長い場合など、シートの名前を変更するのが煩わしいので、下記のようなマクロを作りました。
この場合、シートの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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルの複数シートの保護を...
-
excelでシート毎の最終更新日を...
-
Excel、同じフォルダ内のExcel...
-
Excelのシートを、まとめて表示...
-
エクセルVBAでパスの¥マークに...
-
Excelで金銭出納帳。繰越残高を...
-
シートの保護のあとセルの列、...
-
複数シートの色付きセルがある...
-
エクセルのシート名をリスト化...
-
特定のシートの削除を禁止した...
-
EXCEL:同じセルへどんどん足し...
-
別シート参照のセルをシート毎...
-
Accessのスプレッドシートエク...
-
Excel VBA 複数のシートの行を...
-
シート名ではなく、相対位置で...
-
前の(左隣の)シートを連続参...
-
エクセルでファイルを開いたと...
-
エクセルで前シートを参照して...
-
別シートの最終行に貼り付けす...
-
エクセルで毎回1枚目のシートを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルの複数シートの保護を...
-
Excelで金銭出納帳。繰越残高を...
-
Excelのシートを、まとめて表示...
-
エクセルVBAでパスの¥マークに...
-
エクセルでファイルを開いたと...
-
excelでシート毎の最終更新日を...
-
別シート参照のセルをシート毎...
-
EXCEL:同じセルへどんどん足し...
-
前の(左隣の)シートを連続参...
-
エクセルで前シートを参照して...
-
Accessのスプレッドシートエク...
-
特定のシートの削除を禁止した...
-
シートの保護のあとセルの列、...
-
エクセルのシート名をリスト化...
-
VBAでシートコピー後、シート名...
-
EXCELで同一フォーマットのシー...
-
複数シートの特定の位置に連番...
-
エクセルで前のシートを連続参...
-
エクセルで複数設定したハイパーリンク先...
-
シートを追加・名前を次月に変...
おすすめ情報