既存のワークシートをコピーして、名前を変更するマクロというのは実務でニーズがあります。
例えば、「2014年04月」という名前の交通費精算書のようなワークシートがあったときに、月初めに「2014年04月」シートをコピーして名前を「2014年05月」に変更して、入力されていた4月分のデータを削除するといった作業をマクロにしておくというのはよく行われていることでしょう。
このとき、シート名を変更するところでエラーになってしまうことがあります。
先の例なら、既に「2014年05月」という名前のシートが存在しているのに、コピーしたシート名を「2014年05月」に変更しようとしたときです。
シートをコピーして名前を変更するサンプルマクロ
そんなときに参考になりそうなマクロをご紹介しておきます。
Dim sh_name As String
Dim n As Long
sh_name = Format(Date, "yyyy年mm月")
ActiveSheet.Copy After:=ActiveSheet
On Error Resume Next
ActiveSheet.Name = sh_namen = 1
Do Until Err.Number = 0
Err.Clear
n = n + 1
ActiveSheet.Name = sh_name & "(" & n & ")"
Loop
End Sub
上記のマクロを実行したときに、まだ「2014年05月」というシートが存在していない場合には「2014年05月」というシートがコピーして作られます。
既に「2014年05月」が存在していたときには「2014年05月(2)」という名前のシートが、「2014年05月」も「2014年05月(2)」も存在していたときには「2014年05月(3)」が作られます。
サンプルマクロの解説
実行したときの日付の年と月を使って「2014年05月」といった名前になるように、変数・sh_nameにシート名を格納しておいてから、
sh_name = Format(Date, "yyyy年mm月")
アクティブシートを、アクティブシートの後ろ(右隣)にコピーします。
ActiveSheet.Copy After:=ActiveSheet
エラー発生時には、とりあえず先に進むようにしておいて、
On Error Resume Next
シート名を変数に格納しておいた名前に変更します。
ActiveSheet.Name = sh_name
このあとが、名前がダブってエラーになってしまったとき用の処理です。エラーが発生しなければ、この先の処理は関係ありません。
シート名が重なったときに後につける枝番「(2)」用の変数を初期化して、
n = 1
エラーが発生しなくなるまでループを回します。
Do Until Err.Number = 0
Do ~ Loop文のはじめに条件「Until Err.Number = 0」が書かれているので、名前変更でエラーが発生しなければループの中に入らないことになります。
ループ処理の中では、エラーを解除して、
Err.Clear
シート名につける枝番をインクリメントして、
n = n + 1
シート名を枝番付きの名前に変更します。
ActiveSheet.Name = sh_name & "(" & n & ")"
ここで再びエラーになったときには、再度Do ~ Loop文の処理が行われます。エラーが発生しなければ処理終了です。
実務で使う場合はこのループ処理のあとに、不要なデータを削除したりする処理を追加すればいいでしょう。
Home » エクセルマクロ・Excel VBAの使い方 » Sheets・Worksheet » シートをコピーして名前を変更するExcelマクロ