Exelで作業をする時、シートを複製して使いたいことはよくあるかと思います。
ですが、いくつものシートをコピーする作業を毎回手作業でやっていては大変ですし、どこかでミスをする可能性もありますよね。
そういうときこそVBAでマクロを組むことで、効率的かつミスなく作業を終わらせることができます。
そこで今回は、効率よく作業するためにVBAでシートをコピー・移動する方法について解説していきたいと思います!
VBAでシートをコピーするCopyメソッド
VBAでExcel上のシートをコピーするには、Copyメソッドを使います。
VBAのCopyメソッドは、おもに RangeオブジェクトのCopyメソッド (Range.Copy) と、WorksheetsオブジェクトのCopyメソッド (Worksheets.Copy) の2つがありますが、シートそのものを扱う場合は後者の方を使用します。
シート全体をコピーする
それでは、シート全体をコピーするWorksheetsオブジェクトのCopyメソッド(Worksheets.Copy)について、詳しい使い方を見ていきましょう。
まずは、シートそのものをコピーする基本的な方法について解説します。
Copyメソッドを使う場合は、基本的に以下のように記述します。
【基本構文】
Worksheets("シート名").Copy Before(またはAfter):="シート名"
指定したシート名のコピーを、=の後に記述したシート名の前後どちらかに作成します。Beforeが前、Afterが後ろです。この引数を省略した場合は、コピーしたシートを含む新しいブックとして作成されます。
【サンプルコード】
Sub sampleCopy()
Worksheets("Sheet1").Copy Before:=Worksheets("Sheet1")
End Sub
【実行結果】
引数にBeforeを指定しているため、「Sheet1」の前にコピーしたシートが作成されています。
コピーした後にシート名を変更する
シートのコピーは上記の方法で対応できますが、ただコピーしただけでは名前が「”コピー元の名前(2)”」のままとなってしまいますので、基本的にはコピーした後に名前の変更も行うことになります。
そこで、VBAでシートの名前を変更する方法についても解説していきます。
シート名を変更するには、WorksheetオブジェクトのNameプロパティ(Worksheets.Name)を使用します。
サンプルコードで確認しましょう。
【サンプルコード】
Sub sampleChangeName()
Worksheets("Sheet1").Copy Before:=Worksheets("Sheet1")
ActiveSheet.Name = "Sheet1コピー"
End Sub
【実行結果】
先ほどのコードと同じようにシートをコピーした後、「ActiveSheet.Name」で変更したい名前を指定しています。
Copyメソッドでシートをコピーすると、コピー作成後に自動的にそのシートがアクティブ状態となるので、ActiveSheetプロパティを使用して取得することができます。
ブック内の先頭にシートをコピーする
複数シートがある状態でシートをコピーする際、コピー先の位置を常に先頭に指定したい場合があると思います。
その場合はどんなシート名であっても先頭に配置できるように、シート名ではなくシートのインデックス番号で指定しましょう。
【サンプルコード】
Sub sampleCopyBefore()
Worksheets("Sheet1").Copy Before:=Worksheets(1)
End Sub
【実行結果】
ブック内の末尾にシートをコピーする
コピーの作成位置を末尾にしたい場合も、インデックス番号を使用してシートの指定を行います。
シートを後ろに追加する場合、固定の数値で指定を行ってしまうと、シートが増える度にコードを修正する必要が出てしまいます。そのため、この場合はWorksheetsオブジェクトのCountプロパティを使用して指定を行います。
サンプルコードで確認しましょう。
Sub sampleCopyAfter()
Worksheets("Sheet1").Copy After:=Worksheets(Worksheets.Count)
End Sub
【実行結果】
複数のシートを一度にコピーする
Copyメソッドでは、複数のシートをまとめて指定することもできます。
一度に複数のシートをコピーする場合は、Array関数を使用します。
【サンプルコード】
Sub sampleCopyArray()
Worksheets(Array("Sheet1", "Sheet2")).Copy Before:=Worksheets("Sheet1")
End Sub
【実行結果】
シートを別のブックにコピーする
これまでは、同一ブック内でのコピー方法を中心に説明してきましたが、別のブックにシートをコピーする方法についても解説します。
基本的な構文は先ほどまでと変わりませんが、コピーの作成位置を指定する際に、ブック名と合わせて指定を行います。
【基本構文】
Worksheets("シート名").Copy Before(またはAfter):=Workbooks("ブック名").Worksheets("シート名")
コピーする際は、あらかじめ指定のブックを開いておく必要があります。
それでは、サンプルコードで実際に動きを確認してみましょう。以下の3つのシートがあるブックの中から、「サンプル1」のシートを別のブックにコピーしてみます。
【サンプルコード】
Sub sampleCopyToBook()
Worksheets("サンプル1").Copy Before:=Workbooks("Sample2.xlsm").Worksheets("Sheet1")
End Sub
【実行結果】
セルの値のみを他のシートにコピーする
今度は、シートを丸ごとコピーするのではなく、指定のセル範囲のみをコピーする方法について見てみましょう。やり方はいくつかありますが、今回はCopyメソッドを使う方法について解説します。
上の方でも既に一度紹介しましたが、CopyメソッドはWorksheetsオブジェクトのものと別に、RangeオブジェクトのCopyメソッドも存在します。セルの特定の範囲をコピーする場合はこちらを使用します。
基本構文は以下の通りです。
【基本構文】
Range("コピー元のセル範囲").Copy Destination:=Range("コピー先のセル範囲")
「Destination:=」は省略可能なため、セル範囲のみの記述でも正常に機能します。
また、「Range(“セル範囲”).Copy」のみ記述すると、一旦クリップボードに内容がコピーされます。
以下のサンプルコードで動作を見てみましょう。今回は、次のシートの表を別シートのセルへとコピーします。
【サンプルコード】
Sub sampleRangeCopy()
Range("B2:D6").Copy Worksheets("サンプル1").Range("B2")
End Sub
【実行結果】
Copyメソッドで貼り付けを行った場合、書式や数式なども全てそのままでコピーを行います。
もし、値のみをコピーするなど細かい条件を付けたい場合は、以下のようにPasteSpecialメソッドと組み合わせて使うといいでしょう。
【サンプルコード】
Sub sampleRangeCopy2()
Range("B2:D6").Copy
Worksheets("サンプル1").Range("B2").PasteSpecial Paste:=xlPasteValues
End Sub
【実行結果】
今回はオプションで、セルの値のみをコピー(.PasteSpecial Paste:=xlPasteValues)するよう指定しています。
PasteSpecialメソッドのPaste引数が取る値は以下のとおりです。
名前 | 説明 |
---|---|
xlPasteAll | 書式なども含めた全てを貼り付ける |
xlPasteAllExceptBorders | 罫線以外の全てを貼り付ける |
xlPasteAllMergingConditionalFormats | 全てを貼り付けて条件付き書式をマージする |
xlPasteAllUsingSourceTheme | コピーするソースのテーマを使用して全てを貼り付ける |
xlPasteColumnWidths | コピーした列の幅を貼り付ける |
xlPasteComments | コメントを貼り付ける |
xlPasteFormats | コピーしたソースの形式を貼り付ける | xlPasteFormulas | 数式を貼り付ける |
xlPasteFormulasAndNumberFormats | 数式と数値の書式を貼り付ける |
xlPasteValidation | コピーした入力規則を貼り付ける |
xlPasteValues | コピーした値を貼り付ける |
xlPasteValuesAndNumberFormats | 値と数値の書式を貼り付ける |
ブック内でシートの順番を移動する
場合によっては、コピーを実行する前のシートや、実行後に作成されたシートの順番を入れ替える必要が出てくるかもしれません。そんな時は、Moveメソッドを使ってシートを移動させましょう。
基本的な構文は、Copyメソッドとほとんど同じです。
【基本構文】
Worksheets("シート名").Move Before(またはAfter):="シート名"
【サンプルコード】
Sub sampleMove()
Worksheets("Sheet1").Move after:=Worksheets(Worksheets.Count)
End Sub
【実行結果】
移動前
移動後
まとめ
今回は、主にCopyメソッドの使い方について解説してきました。
比較的シンプルながらも便利なメソッドなので、しっかりと覚えて使いこなしていきましょう!
関連記事
- VBAとは
- Excelで覚えておくべき17の基本関数と目的別逆引き一覧
- オートフィルターの設定・解除方法
- メッセージボックスの設定方法
- セルの値を取得・上書きするValueプロパティの使い方を解説
- 【Excel VBA】Functionの使い方を解説(宣言・引数、戻り値の指定、応用法)
- 【VBA入門】配列まとめ(宣言・初期化、反復処理、コピー、結合)
VBAの勉強方法は?
書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。
ただ、VBAに限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。
プログラミングスクールならテックマニアがおすすめ!
ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。
<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~
このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。