シートのコピー

初級VBA

はじめに

 シートのコピーは、シートオブジェクトのCopyメソッドを使用します。
 Copyメソッドでは、コピー先の位置を指定する必要があります。コピー元の前に作る場合は Before。コピー元の後ろに作る場合は After を引数に指定します。

シートの最後にコピーする

 「Sheet1」シートをシートの最後にコピーするには、引数 After に最後のワークシートを示す Worksheets(Worksheets.Count) を指定してやります。
 シート名は 「Sheet1 (2)」という風に括弧付の数値が付加されます。

Sub sheetCopyTest1()
    Worksheets("Sheet1").Copy after:=Worksheets(Worksheets.Count)
End Sub

シートの先頭にコピーする

 「Sheet1」シートをシートの先頭にコピーするには、引数 Before に先頭のワークシートを示す Worksheets(1) を指定してやります。

Sub sheetCopyTest2()
    Worksheets("Sheet1").Copy before:=Worksheets(1)
End Sub

追加したシートの順番

 上の2つのサンプルコードを実行すると、プロジェクトウインドウは以下のようになっていると思います。

 プロジェクトウインドウのシートモジュールの並び順は、追加された順番になります。
 ただ、Excel画面でのシートの並び順は以下のようになり、順番が異なります。

 プログラムでシートの順番を指定したい場合は、Excel画面でのシートの並び順が使われます。
これは以下のサンプルコードを実行すればわかります。

Sub test3()
    Dim i As Long
    For i = 1 To Worksheets.Count
        Debug.Print Worksheets(i).Name
    Next i
End Sub

 結果は以下のようになります。

Sheet1 (3)
Sheet1
Sheet1 (2)

 プロジェクトウインドウのシートモジュールの並び順とは違いますので注意してください。

コピー先をシート名で指定

 シートのコピー先は、数値だけでなくシート名で指定してもOKです。ただし、シートを示す数値やシート名が存在しない場合はエラーとなります。

Sub sheetCopyTest3()
    'Sheet2の後ろにSheet1のコピーを配置
    Worksheets("Sheet1").Copy after:=Worksheets("Sheet2")
End Sub

コピーしたシート名を変更する

 コピー先のシート名は自動で付けられますが、シート名を指定したい場合、コピー直後はそのシートがアクティブシートになっていますので、それをもとにシート名を変更できます。ただし、既にその名前が存在する場合はエラーとなります。

Sub sheetCopyTest4()
    Worksheets("Sheet1").Copy after:=Worksheets(Worksheets.Count)
    'コピー直後は、そのシートがActiveSheetとなる。
    ActiveSheet.Name = "日報" & Format(Date, "mmdd")
End Sub

 このプログラムでは、「Sheet1」シートをコピーを最後のシートに追加して「日報1222」などと日付つきのシート名にしています。同じ日にこのプログラムを実行すると日付が被ってエラーとなるでしょう。
 そのような時は、既に同じシート名があるか確認する必要があります。

シート名が存在するかチェックする

 同じシート名が既にあるかチェックする方法については以下のページで解説していますので参照してください。
 ・シートの有無をチェックする2つの方法

 ここでは、以下のようなプログラムでチェックしてみます。

’シート名の重複が無いかチェックする
Function CheckName(str As String) As Boolean
    Dim b As Boolean
    b = False
    Dim sh
    For Each sh In Worksheets
        If sh.name = str Then
            b = True
            Exit For
        End If
    Next sh
    CheckName = b
End Function

 上記のチェックプログラムを使って重複しないシート名を生成するプログラムを書いてみました。
 すでに同じシート名がある場合は、括弧付の数値を付けるようにしています。

Sub sheetCopyTest5()
    Dim str As String, name As String, num As Long
    Worksheets("Sheet1").Copy after:=Worksheets(Worksheets.Count)
    name = "日報" & Format(Date, "mmdd")
    str = name
    num = 2
    Do While CheckName(str)
        str = name & "(" & num & ")"
        num = num + 1
        Stop
    Loop
    ActiveSheet.name = str
End Sub

まとめ

 シートのコピーは、コピー先の指定位置をBefore, Afterの引数で指定しなければなりません。
 シート名を変更したい場合は、コピー直後にそのシートがアクティブシートになっていますので、ActiveSheet.nameで変更すれば良いでしょう。
 
 シート位置が存在しない場合や、既にあるシート名を指定するとエラーとなりますのでプログラミングの際には注意してください。

タイトルとURLをコピーしました