【Excel VBA】シートをコピーする

Excelでフォーマット(決まった様式、ひな形、書式等)のシートをコピーして一部を変更し、使いたいといったことがあるかと思います。

この記事では、VBAでシートをコピーし、シート名を変更する方法をご紹介します。

シートをコピーする

シートのコピーはとても簡単です。

Sub シートコピー()
 Sheets("点検フォーマット").Copy After:=Sheets("点検フォーマット")
End Sub

▼実行前後

Afterの部分をBeforeに変更することで、コピーしたシートを前に挿入することもできます。

ワークシートを指定する場合、通常「Worksheets(“シート名”)」と書きますが、省略して、「Sheets(“シート名”)」でも問題ありません。

シートを末尾にコピーするには?

シートを一番最後にコピーしたい場合があるかと思います。その場合は以下のコードで実行できます。

Sub シートコピー()
 Sheets("点検フォーマット").Copy After:=Sheets(Sheets.Count)
End Sub

シートを新しいブックにコピーする

実は同じブックにシートをコピーするよりも新しいブックにコピーするほうがとても簡単です。

Sub シートを新しいブックにコピー()
 Sheets("点検フォーマット").Copy
End Sub

これだけで新しいブックが開き、指定したシートがコピーされます。

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

シートをコピーした後、名前も変えるのが一般的な使い方かと思います。シートコピーした後は、コピーしたシートがアクティブになるため、以下のコードで名前を変更できます。

Sub シートコピー名前変更()
    Sheets("点検フォーマット").Copy After:=Sheets("点検フォーマット")
    ActiveSheet.Name = "点検表" & Format([C4], "YYYY年M月")
End Sub

▼実行結果

既に同じ名前のシートがある場合エラーがでますので、ご注意ください。

同じシート名でエラーが出ないようにするには?

エラーを回避する一例として以下のコードをご紹介します。

少し長くなりますが、以下のコードで同じシート名でエラーが発生しないようにすることができます。

Sub シートコピーエラー回避()
    Dim Flag As Boolean
    Dim WSheet As Worksheet
    Dim SheetName As String
    
    SheetName = "点検表" & Format([C4], "YYYY年M月") '①

    Flag = False
    For Each WSheet In Worksheets  ’②
        If WSheet.Name = SheetName Then Flag = True 
    Next

    If Flag = True Then ’③
        MsgBox "既にシートが存在します。"
        Exit Sub
    End If

    Sheets("点検フォーマット").Copy After:=Sheets("点検フォーマット") ’④
    ActiveSheet.Name = SheetName
End Sub

■解説
①で保存するシート名を決めます。
②でブック内のシートに同じ名前があるかチェックします。
③で同じシート名がある場合は、メッセージを表示し終了します。
同じシート名がなければ、④でコピーとシート名変更が実行されます。

シートコピーの実践例

最後に、シートコピーを使った実践的な使い方をご紹介します。

フォーマットをコピーし、新しいブックで保存するコードになります。

Sub シートコピー変更保存()
    Dim SelectDate As Date
    Dim SheetName As String
    Dim FileName As String
    
    '翌月1日の日付を取得
    SelectDate = DateSerial(Year(Date), Month(Date) + 1, 1)

    'シート名&エクセル名設定
    SheetName = Format(SelectDate, "YYYY年M月点検表")
    FileName = ThisWorkbook.Path & "\" & Format(SelectDate, "YYYY年M月点検表") & ".xlsx"

    'シートコピー
    Sheets("点検フォーマット").Copy
    With ActiveSheet
        .Name = SheetName
        .[C4] = SelectDate
    End With
    'エクセル保存
    ActiveWorkbook.SaveAs FileName
    ActiveWorkbook.Close
    MsgBox SheetName & "のエクセルを作成しました。"
End Sub

動作の大まかな流れとしては次の通りです。

  1. 翌月の日付を取得します。
  2. 取得した日付からシート名と保存するファイル名を決めます。
  3. シートをコピーし、C4セルに日付を入れます。
    ※点検フォーマットには、C4の日付に連動し日付が変わるよう関数を入れてます。
  4. 2で指定したファイル名で保存し、ブックを閉じます。
  5. メッセージを表示して終了です。

▼実行結果

コメント

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