スライドショースライドショー

【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プロパティを使って、使用中のセル範囲の終わりを取得するやり方は、以下を参考にどうぞ。

    VBAで最終行を取得するには?|End(xlUp)、SpecialCells(xlLastCell)
    更新日 : 2019年4月24日

    シートを移動する方法

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

    SheetCopy10

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

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

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

    [使用例]
    Sub SheetMove()
     
        Worksheets("フォーム").Move after:=Worksheets(Worksheets.Count)
        Worksheets("メンバー").Move after:=Worksheets(Worksheets.Count)
     
    End Sub
    [実行結果]

    SheetCopy11

    移動ができました。

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

    まとめ

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

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

    LINEで送る
    Pocket

    無料でSEからWebエンジニアへ転職しませんか?



    侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、

    • システムエンジニアという職業だけどコードが書けない
    • 事務作業が多くスキルがないため将来が不安
    • スクールに通うと完全未経験者と同じスタートになるからレベルが合わない
    という、すでに知識があるSEならではのお悩みがあることに気づきました。そんな方におすすめなのが、弊社の「転職コース 」です。

    弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。さらにこちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。

    既に知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。

    まずは無料体験レッスンを予約する

    書いた人

    本多 農

    本多 農

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

    おすすめコンテンツ

    あなたにぴったりなプログラミング学習プランを無料で診断!

    プログラミング学習の効率を劇的に上げる学習メソッドを解説