【ExcelVBA・マクロ】Worksheets.Add・Copy・Moveの使い方|シートの追加・コピー・移動を自動化する方法【コピペOK】

ExcelVBA
スポンサーリンク
スポンサーリンク

はじめに

複数のシートを扱うExcelブックでは、「毎月同じフォーマットのシートを追加する」「特定のシートを別ブックへコピーする」「シートの並び順を整理する」といった作業が頻繁に発生します。これらの操作はすべて手作業でも可能ですが、シート数が多くなるほど時間がかかり、ミスも起きやすくなります。

この記事では、VBAでシートの追加・コピー・移動を自動化するWorksheets.AddCopyMoveメソッドの使い方を、実務でそのまま使えるコード例とともに解説します。

シートを新規追加する:Worksheets.Addメソッド

新しいシートを追加するにはWorksheets.Addメソッドを使います。追加位置はBeforeまたはAfter引数で指定します。

Sub AddNewSheet()

    Dim newSheet As Worksheet
    Set newSheet = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count))

    newSheet.Name = "新規シート"

End Sub

Afterに「最後のシート」を指定することで、追加したシートを一番右に配置しています。シート名は追加後にNameプロパティで設定するのが基本パターンです。同名のシートがすでに存在するとエラーになるため、名前の重複チェックを入れておくとより安全です。

Sub AddNewSheetSafely()

    Dim newSheet As Worksheet
    Dim sheetName As String
    sheetName = "新規シート"

    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        If ws.Name = sheetName Then
            MsgBox sheetName & " は既に存在します。"
            Exit Sub
        End If
    Next ws

    Set newSheet = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count))
    newSheet.Name = sheetName

End Sub

テンプレートシートをコピーして毎月分のシートを作る

「テンプレート」シートを元に、月ごとのシートを自動で複製したい場合は、既存シートのCopyメソッドを使います。

Sub CopyTemplateSheet()

    Dim templateSheet As Worksheet
    Set templateSheet = ThisWorkbook.Worksheets("テンプレート")

    templateSheet.Copy After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)

    Dim newSheet As Worksheet
    Set newSheet = ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)
    newSheet.Name = Format(Date, "yyyy年mm月")

End Sub

Copyメソッドを実行すると、コピー先のシートがブック内で自動的にアクティブになります。そのため、コピー直後はWorksheets.Count番目(一番右)のシートが複製されたシートになります。この性質を利用して、複製したシートを変数に取得し名前を変更しています。

シートを別のブックにコピーする

集計結果のシートだけを別ブックとして切り出したい場合も、Copyメソッドが使えます。AfterBeforeを省略すると、シートは新しいブックとしてコピーされます。

Sub CopySheetToNewWorkbook()

    Dim sourceSheet As Worksheet
    Set sourceSheet = ThisWorkbook.Worksheets("集計結果")

    sourceSheet.Copy

    ' コピー直後にアクティブになった新規ブックを取得
    Dim newBook As Workbook
    Set newBook = ActiveWorkbook

    newBook.SaveAs Filename:=ThisWorkbook.Path & "\集計結果_" & Format(Date, "yyyymmdd") & ".xlsx"
    newBook.Close SaveChanges:=False

End Sub

Copyの引数を省略すると新規ブックが作成されてアクティブになるため、ActiveWorkbookでその新規ブックを取得し、任意のファイル名で保存しています。

シートの並び順を入れ替える:Moveメソッド

シートの表示順を整理したいときはMoveメソッドを使います。Copyと同じくBeforeAfter引数で移動先を指定します。

Sub MoveSheetToFirst()

    ThisWorkbook.Worksheets("目次").Move Before:=ThisWorkbook.Worksheets(1)

End Sub

「目次」シートを常に一番左に配置したい場合など、ブックを開くたびに順序を整えたいケースで役立ちます。

複数シートをまとめて並び替える

シート名の一覧をもとに、指定した順番でまとめて並び替えることもできます。

Sub ReorderSheets()

    Dim sheetOrder As Variant
    sheetOrder = Array("目次", "4月", "5月", "6月", "集計")

    Dim i As Long
    For i = LBound(sheetOrder) To UBound(sheetOrder)
        ThisWorkbook.Worksheets(sheetOrder(i)).Move After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)
    Next i

End Sub

配列に定義した順番で、対象シートを1つずつ「一番右」へ移動させることで、最終的に配列と同じ並び順になります。シート数が多いブックの整理に便利な方法です。

まとめ

Worksheets.AddCopyMoveメソッドを使えば、シートの追加・複製・並び替えといった定型作業を自動化できます。

  • Addメソッドで新規シートを追加し、Nameプロパティで名前を設定する
  • Copyメソッドは同一ブック内の複製にも、別ブックへの切り出しにも使える
  • Copy実行直後はコピー先が自動的にアクティブになる性質を利用する
  • Moveメソッドで並び順を整理でき、配列と組み合わせれば一括並び替えも可能

毎月・毎週発生するシート作成やファイル分割の作業をマクロ化して、繰り返し作業の時間を減らしていきましょう。

スポンサーリンク
スポンサーリンク
ExcelVBA
シェアする
いがぴをフォローする

コメント

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