- ベストアンサー
シート名変更マクロ
「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
- みんなの回答 (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
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17069)
>「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
お礼
なんとか自己解決しました。ありがとうございました。
補足
「1」というのは実際のシート名です。 コピーにすると枚数が多ければすごく時間がかかるので、シートを挿入の方がいいですね。ちなみに、シートを挿入して「1」の内容をコピーして貼り付けられますが、列幅も同じく貼り付けることはできるのでしょうか?
- qualheart
- ベストアンサー率41% (1451/3486)
上記の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
お礼
とても参考になりました。ありがとうございます。
- kawais070
- ベストアンサー率52% (2242/4283)
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 という感じでどうでしょうか。
お礼
やりたいことはこれでした!結果的には、コピーする数が多いため、シートを挿入してデータを貼り付けるやり方に切り替えました。 回答ありがとうございました。
お礼
いつもありがとうございます。とても参考になりました。
補足
挿入する枚数が増えるほど速度が遅くなるので、やはりコピーでない方がいいのかもしれませんね。前回と同じく、H4に入力した枚数分シートを挿入して、コピー元のデータを貼り付ける方向で考えて見ます。