• ベストアンサー

シート名変更マクロ

「1」というシートのH4にコピー数を入力し、「1」の後ろに挿入するマクロがあります。できたシートの名前は「1(2)」「1(3)」となってしまいます。このシート名を挿入した数の通し番号(「2」「3」に変更することはできるのでしょうか?挿入するシートの数は決まっていません。 Sub シートのコピー() Dim i As Integer Dim n As Integer n = Worksheets("1").Range("H4").Value For i = 1 To n Worksheets("1").Copy Before:=Worksheets(Sheets.Count) Next i End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんばんは。 それぞれの回等には、条件があるのだと思います。シートが複数ある場合の処理は、 「1」の後ろに挿入するマクロ という条件は、限られてしまいます。後ろ(右側)は、After:=になるはずです。 前回は、Worksheets.Add でしたが、マクロで シート.Copyを複数する方法は、比較的少ない書き方かもしれません。理由は、いろいろなオブジェクトまでもコピーしてしまうだけでなく、Names オブジェクトがおかしくなることがあります。複数のシートを作る場合は、Addが一般的です。 後、 Worksheets("1") マクロで入れている限りは、問題がありませんが、シート名に数字のみを手入力したりすると、目で、半角になっていることを確認して注意し手入れ他にも関わらず、なぜかうまくいかないことがあります。手入力の場合は、数字のみよりも、1月とか、M1 とかのほうがよいのかもしれません。 前回は、余裕がなくてエラー処理をしなかったので、今度は、簡単なエラー処理を入れてみました。この種のマクロは、とんでもない難しいものもあります。みなさんの回答を、何も入れていないブックで試してみるのも良いかもしれません。質問に対して、いろいろな読み方があるのが分かります。 '標準モジュール Sub Testシートコピー()   Dim sh1 As Worksheet   Dim i As Variant   Set sh1 = Worksheets("1")   sh1.Activate   i = sh1.Name   If Not IsNumeric(i) Then     MsgBox "シート名は数字ではありません。", 48     Exit Sub   End If   n = sh1.Range("H4").Value   Application.ScreenUpdating = False   On Error GoTo ErrHandler   For i = 1 To n     sh1.Copy After:=ActiveSheet     ActiveSheet.Name = CStr(i + 1)   Next i   Application.ScreenUpdating = True ErrHandler:   If Err.Number > 0 Then     MsgBox Err.Number & ": " & Err.Description     Application.DisplayAlerts = False     ActiveSheet.Delete     Application.DisplayAlerts = True   End If   Set sh1 = Nothing End Sub

noa8998
質問者

お礼

いつもありがとうございます。とても参考になりました。

noa8998
質問者

補足

挿入する枚数が増えるほど速度が遅くなるので、やはりコピーでない方がいいのかもしれませんね。前回と同じく、H4に入力した枚数分シートを挿入して、コピー元のデータを貼り付ける方向で考えて見ます。

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

>「1」というシート これが質問者の現実のシート名のことなのか 第1という意味なのか 仮のたとえのシートの名前を簡単にして付けた なのか若干疑問があり、それによってコードが変わる。 ーー シート名を数字のみの文字列と仮定して、数として+1して 増やすシートのシート名とした。 CopyでなくAddを使った シートCopyでなくRangeコピーを使った、例です。 Range("A1:H100").は質問者の場合に合わせて、適当に広めに、修正すること。 ーーー Sub test01() Dim i As Integer Dim n As Integer n = Worksheets("1").Range("H4").Value no = Trim(Str(Val(Worksheets("1").Name))) For i = 1 To n no = no + 1 sno = Trim(Str(no)) Worksheets.Add(, ActiveSheet).Name = sno Worksheets("1").Range("A1:H100").Copy Worksheets(sno).Range("A1") Next i End Sub

noa8998
質問者

お礼

なんとか自己解決しました。ありがとうございました。

noa8998
質問者

補足

「1」というのは実際のシート名です。 コピーにすると枚数が多ければすごく時間がかかるので、シートを挿入の方がいいですね。ちなみに、シートを挿入して「1」の内容をコピーして貼り付けられますが、列幅も同じく貼り付けることはできるのでしょうか?

  • qualheart
  • ベストアンサー率41% (1451/3486)
回答No.2

上記のVBだとシート「1」の前にコピーしたシートが入るようになってますね。それで良いのでしょうか? 「1」のあとに入れたいのであれば、以下のコードになります。 また、以下のコードなら、間違えて2回実行してしまってもエラーになりません。たとえば5シート追加した後に(「2」~「6」までコピー)、そのまま再びマクロを実行してしまった場合は、「7」~「11」という名前のシートが入るようになります。 単純にシート合計数にあわせてシート名を付けてるだけですので。 Sub シートのコピー() Dim i As Integer Dim n As Integer n = Worksheets("1").Range("H4").Value For i = 1 To n Worksheets("1").Copy After:=Worksheets(Sheets.Count) Worksheets(Sheets.Count).Name = Sheets.Count Next i End Sub

noa8998
質問者

お礼

とても参考になりました。ありがとうございます。

  • kawais070
  • ベストアンサー率52% (2242/4283)
回答No.1

Sub シートのコピー() Dim i As Integer Dim n As Integer n = Worksheets("1").Range("H4").Value For i = 1 To n Worksheets("1").Copy Before:=Worksheets(Sheets.Count) ActiveSheet.Name = CStr(i + 1) Next i End Sub という感じでどうでしょうか。

noa8998
質問者

お礼

やりたいことはこれでした!結果的には、コピーする数が多いため、シートを挿入してデータを貼り付けるやり方に切り替えました。 回答ありがとうございました。