• ベストアンサー

シートを追加・名前を次月に変更、前月内容を貼り付け

エクセルでマクロを使って、シートを追加して、シート名を次月となるように変更したいのです。欲を言えば、今のシートをコピーして新しく作ったシートに貼り付けまでできれば最適です。例ですが、今操作中のシート名が3月とします。内容は3月の集計表を作成です。ここでマクロを実行して、新しくシートを追加しシート名を4月としてシートの内容は3月の内容をコピーして貼り付けしたいのです。仮に5月でも実行すれば6月のシートが作成できるようにしたいのです。ご教授ください。マクロは初心者です。操作はできます。

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

  • ベストアンサー
  • o_chi_chi
  • ベストアンサー率45% (131/287)
回答No.1

こんなんでどうですか。 --- Sub test() Dim i As Integer '最後のシートをコピーしその後ろに追加 Sheets(Sheets.Count).Copy After:=Sheets(Sheets.Count) '名前を変更 i = Left(Sheets(Sheets.Count - 1).Name, Len(Sheets(Sheets.Count - 1).Name) - 1) Sheets(Sheets.Count).Name = IIf(i + 1 > 12, 1, i + 1) & "月" End Sub

VODKA75
質問者

お礼

ご回答ありがとうございます。変数の宣言をして「最後のシートをその後ろに追加という」発想が自分には思いつきませんでした。確かに、自分の用途としては、最後を増やすこと意外ありません。それから12月から1月の切り替えですが、IIf(i + 1 > 12, 1, i + 1) & "月"とても参考になりました。自分には非常に役に立ちます。ありがとうございます。

その他の回答 (3)

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

ここへ質問する前に、操作をしてマクロの記録をなぜ採らないのか。 そして次の月にはどこをどう変えればよいか、を考えることだ。 Sub Macro3() Sheets("Sheet1").Select Sheets.Add Sheets("Sheet4").Select Sheets("Sheet4").Name = "5" End Sub (1)この場合に前の月のシート(名)はどういう風に捕まえるか問題 こんなことも、質問で「次月」と済ましてしまうようでは、プログラムは進まない。 今月シートとは何かから考えないと。 必ず今月シートを開いて、完成したVBAを実行するなら、ActiveSheetなどの捉え方を使えるが、不便では?。 シート名をそもそどうするかを考えないと(質問に明記して質問しないと)。 (2)次の月をどうして決めるか。、特に12月の次は1月にしなければならないが、どう計算などするか。 日付シリアル値に持ち込んで、月部分に+1するのが確実なように思う。 月数字以外と、月数字部分を分ける シート名から年、月、1の日を作り、そこから関数で年、月+1,1の日を作り、年、月の部分を文字列化して、月数字以外部分を加えるなど、どうかな。 人間にシート挿入のシート名を毎度答えさせる手もあり、結構安定性があるようにもおもうが。 (3)3月の内容をコピーして貼り付けしたいのです これもマクロの記録でコードがわかる。次の月になると、データ数の増減などで、コピーするセル範囲は変わるのかな(フォーと尾が決った表で固定なのか?)。

VODKA75
質問者

お礼

ご回答ありがとうございます。まず、ごもっともなご指摘ありまがとうございます。素人ゆえに、将来恥ずかしい質問もすることもあると思います。自分なりに検索したり、記録などで読み取ろうともしましたが、解決には至らず、質問しました。わからないから質問するという人もいることをご理解ください。内容に至っては、12月と1月の件などその考え方の基礎を理解できました。その難しさもわかりました。やって覚えるというよりは、基本の考え方を地道に蓄積していくしかないということも理解できました。マクロについては、ご回答のように「5」のシートができました。ありがとうございます。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.3

No.2です! たびたびごめんなさい。 12月の場合を考慮していませんでした。 ↓のコードに訂正してください。 Sub test() Dim i As Long i = WorksheetFunction.Substitute(ActiveSheet.Name, "月", "") * 1 ActiveSheet.Cells.Select Selection.Copy Worksheets.Add after:=ActiveSheet ActiveSheet.Paste If i = 12 Then ActiveSheet.Name = "1月" Else ActiveSheet.Name = i + 1 & "月" End If Application.CutCopyMode = False ActiveSheet.Range("A1").Select End Sub 何度も失礼しました。m(__)m

VODKA75
質問者

お礼

ご回答ありがとうございます。また、訂正版もありがとうございます。 実際に自分もやってみましたが、13月になりました。しかし、そういうことも大事なことですから 実際に、この改訂版との違いで、すごく役にたちました。もしも改訂版が最初に投稿されていたら自分はそのことに、気付かずにいた気がシマス。参考になりました。改訂版できました。12月の次は1月になるという定義など、少しづつわかってきました。ありがとうございます。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.2

こんにちは! 一例です。 同一ブック内で同じSheet名を付けることはできませんので、 今操作中のSheet名の月の翌月sheet名はないということが大前提です。 Sub test() Dim i As Long i = WorksheetFunction.Substitute(ActiveSheet.Name, "月", "") * 1 ActiveSheet.Cells.Select Selection.Copy Worksheets.Add after:=Worksheets(Worksheets.Count) ActiveSheet.Paste ActiveSheet.Name = i + 1 & "月" Application.CutCopyMode = False ActiveSheet.Range("A1").Select End Sub こんな感じではどうでしょうか?m(__)m