Home » エクセルマクロ・Excel VBAの使い方 » Sheets・Worksheet » シートをコピーして名前を変更するExcelマクロ

シートをコピーして名前を変更するExcelマクロ

対象:Excel2007, Excel2010, Excel2013

既存のワークシートをコピーして、名前を変更するマクロというのは実務でニーズがあります。

例えば、「2014年04月」という名前の交通費精算書のようなワークシートがあったときに、月初めに「2014年04月」シートをコピーして名前を「2014年05月」に変更して、入力されていた4月分のデータを削除するといった作業をマクロにしておくというのはよく行われていることでしょう。

このとき、シート名を変更するところでエラーになってしまうことがあります。

先の例なら、既に「2014年05月」という名前のシートが存在しているのに、コピーしたシート名を「2014年05月」に変更しようとしたときです。

[スポンサードリンク]

シートをコピーして名前を変更するサンプルマクロ

そんなときに参考になりそうなマクロをご紹介しておきます。

Sub 名前変更でエラーが出ないようにアクティブシートをコピーする()
 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_name
 n = 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文の処理が行われます。エラーが発生しなければ処理終了です。

実務で使う場合はこのループ処理のあとに、不要なデータを削除したりする処理を追加すればいいでしょう。

関連語句
VBA, Visual Basic for Applications

[スポンサードリンク]

Home » エクセルマクロ・Excel VBAの使い方 » Sheets・Worksheet » シートをコピーして名前を変更するExcelマクロ

「Sheets・Worksheet」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.

.