【VBA入門】シートのコピーと移動(複数コピーや名前の変更も解説)

Excelシートを使っていると、すでに使っているシートをコピーして作業を加えたいことってありますよね。

別々のシートをコピーして、1つのブックにまとめるなんてこともありませんか?たくさんのシートを1つずつコピーして、1つのブックにまとめるのも結構面倒ですよね。

そんなときこそ、VBAを使って自動化しましょう!この記事ではシートのコピーについて

  • シート全体をコピーする方法
  • コピー後にシートの名前を変更
  • 複数のシートを一度にコピーする方法
  • シートを別のブックにコピーする方法
  • といった基本的な内容から、

  • シートの先頭にコピーする方法
  • シートの末尾にコピーする方法
  • セルの値のみをコピーする方法
  • シートを移動する方法
  • といった応用的な内容まで解説します。

    この記事を読み終えるころには、VBAで効率的なシート操作ができるようになっていますよ!

    目次

    シート全体をコピーする方法

    シートそのものをコピーする方法を解説します。

    シートをコピーするには、Copyメソッドを使います。

    [書式]

    Worksheets("シート名またはインデックス").Copy Before(またはAfter):=”基準となるシート名”

    引数Beforeで指定をすると、指定したシート名の前にシートがコピーされます。

    引数Afterで指定すると、指定したシートの次にシートがコピーされます。引数BeforeとAfterは一緒に指定することはできません。

    サンプルコードで確認しましょう。

    [使用例]

    Sub SheetCopy1()
     
        Worksheets("フォーム").Copy Before:=Worksheets("フォーム")
     
    End Sub

    [実行結果]

    SheetCopy01

    「Before := Worksheets(“フォーム”)」として、「フォーム」というシートの前にコピーしたものを置いています。

    コピー後にシートの名前を変更

    ここでコピー後にシートの名前を変更する方法についてお伝えします。

    シートをコピーするとシート名が”Sheet (2)”のように自動で付けられます。これを変更した方が扱いやすい場合が多いです。シート名を変更するにはWorksheetオブジェクトのNameプロパティの値を変更します。

    サンプルコードで確認しましょう。

    [使用例]

    Sub SheetCopy1()
     
        Worksheets("フォーム").Copy Before:=Worksheets("フォーム")
        ActiveSheet.Name = "田中"
    
    End Sub

    [実行結果]

    SheetCopy02

    シートをコピーすると、新しくコピーされたシートがActiveSheetになりますので、ActiveSheet.Nameプロパティを変更しています。

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

    先頭にシートをコピーしたい場合があります。

    コピー位置の基準となるシート名を先頭シートにし、Beforeを使うことで先頭にシートをコピーすることができます。

    サンプルコードで確認しましょう。

    [使用例]

    Sub SheetCopy2()
     
        Worksheets("フォーム").Copy Before:=Worksheets(1)
     
    End Sub

    [実行結果]

    先頭に追加

    シートの末尾にコピーする方法

    新しいシートをコピーして追加する場合は、末尾に追加するケースも多いですよね。コピー位置の基準となるシート名を末尾のシートにし、Afterを使うことで末尾にシートをコピーすることができます。

    サンプルコードで確認しましょう。

    [使用例]

    Sub SheetCopy3()
     
        Worksheets("田中").Copy After:=Worksheets(Worksheets.Count)
     
    End Sub

    [実行結果]

    末尾に追加

    Worksheets.Countにてシート数を取得して末尾を指定しています。

    複数のシートを一度にコピーする方法

    複数のシートをまとめて一度にコピーしたい場合があります。そんな場合はArray関数を使って以下のように記述します。

    [書式]

    Worksheets(Array(“シート名1”, “シート名2”, ・・・)).Copy Before(またはAfter):=”基準となるシート名”

    サンプルコードで確認しましょう。

    [使用例]

    Sub SheetCopy4()
     
        Worksheets(Array("佐藤", "田中")).Copy Before:=Worksheets("フォーム")
    
    End Sub

    [実行結果]

    SheetCopy03

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

    今度は、シートを別のブックにコピーする方法を解説します。

    書式は以下の通りで「コピー元シート.Copy コピー先ブック」が基本です。

    [書式]

    Worksheets(インデックス).Copy After(またはBefore):=Workbooks("ブック名").Worksheets("シート名")

    コピー先のシートの前にブック名を指定します。なお、あらかじめブックは開いておく必要があります。

    サンプルコードで確認しましょう。

    例えば、各個人が作ったシートを1つのブックにする、という業務を考えてみましょう。表紙というシートだけがある「提出用」というブックに、各個人が自分のシートをコピーする、といった感じでしょうか。

    提出用ブックのイメージです。

    [実行前]

    SheetCopy04

    そして、各個人のブックです。各個人名のブックは1シートのみで、ファイルも同じフォルダに存在しているという前提です。

    SheetCopy05

    各個人のブックで、以下のVBAを実行します。

    [使用例]

    Sub SheetCopy5()
     
        Worksheets(1).Copy After:=Workbooks("提出用").Worksheets("表紙")
    
    End Sub

    [実行結果]

    SheetCopy06

    これを各個人のブックで実行すれば、どんどん後ろにシートが追加されます。

    ただし、実行した人の順番になるので注意してください。

    セルの値のみをコピーする方法

    シート間で、セルの値のみをコピーしましょう。セルの書式や数式を無視して値のみをコピーする時は、RangeオブジェクトのValueプロパティを使います。

    最初からコピー元とコピー先が存在している想定です。

    SheetCopy07

    A1からE6を取得したいのですが、ここでは範囲を固定せず、動的に終わりのセルをとらえます。

    A1にカーソルがある状態で、「Ctrl + Shift + End」キーを押すと、以下のようになります。

    SheetCopy08

    この範囲を「使用中のセル範囲」といいます。

    「Ctrl + Shift + End」キーをVBAで実装し、かつとなりのシート「吉田」へコピーしてみましょう。

    [使用例]

    Sub SheetCopy6()
     
        Dim MaxRow As Long '最終セルの行番号
        Dim MaxColumn As Integer '最終セルの列番号
     
        '一番左上から、使用中のセル範囲を取得
        MaxRow = Range("A1").SpecialCells(xlLastCell).Row
        MaxColumn = Range("A1").SpecialCells(xlLastCell).Column
     
        'フォームをアクティブ化する
        Sheets("フォーム").Activate
     
        With Sheets("吉田")
            .Range("A1", .Cells(MaxRow, MaxColumn)).Value = _
                Range("A1", Cells(MaxRow, MaxColumn)).Value
        End With
     
    End Sub

    [実行結果]

    SheetCopy09

    シート「吉田」へコピーできました。

    Sheets(“フォーム”).Activateとしてアクティブ化したので、RangeやCellsの頭に何も付いていないところはフォームを指定したのと同じになります。

    なおSpecialCellsプロパティを使って、使用中のセル範囲の終わりを取得するやり方は、以下を参考にどうぞ。

    シートを移動する方法

    シートをコピーした後は、シートの順番がバラバラになって見づらい場合がよくあります。例えば、以下のようになってしまったら、見づらいですよね。

    SheetCopy10

    これもVBAを使って自動化しましょう!

    シートを移動するには、Moveメソッドを使います。Moveメソッドの使い方はCopyメソッドと同じです。

    シートの移動を、上記の例を使ってやってみましょう。

    [使用例]

    Sub SheetMove()
     
        Worksheets("フォーム").Move after:=Worksheets(Worksheets.Count)
        Worksheets("メンバー").Move after:=Worksheets(Worksheets.Count)
     
    End Sub

    [実行結果]

    SheetCopy11

    移動ができました。

    Worksheets.Countにてシート数を取得して末尾を指定しています。

    まとめ

    この記事では、シートのコピーや移動について解説しました。

    ぜひマスターして、効率的なシートの操作ができるようになってくださいね!

    この記事を書いた人

    関西在住のITエンジニアです。普通の会社に勤務しながら、侍エンジニアのインストラクター、ライターとして活動しています。

    目次