エクセルVBAで、ワークシートのコピーをを行う時には、行いたい内容に合わせて、
どのコードにするかを選択することが大切です。
そのためには、まずコピー時の結果を知っておくことが必要です。
エクセルVBAのコード組み立てで、よく使うメソッドの1つで「Copy」メソッドがあります。
今回はこの「Copy」メソッドの使い方を説明します。
こんにちは、じゅんぱ店長(@junpa33)です。




















コンテンツ
ワークシートのコピーを最速に理解!VBAコードで選ぶコピー結果
エクセルでシートを「コピーする」という目的は一つではなく、例えば、
- テンプレートがあってそのテンプレートを機能ごと複製して使いたい。
- データ保存のためにシートをデータ共々、丸々保存したい。
- 保存するのはデータバックアップとして数値保存を行いたい。
というようなことがあったりします。
1と2は「Worksheets.Copy」で行うことが出来ます。
3は「Cells.Copy」で行うか「Range.Value」で行うかになります。
それぞれのコピーの方法を見ていきます。
「Worksheets.Copy」メソッドでシートのコピーを行う
この様なエクセルBOOKを例にとって説明していきます。このBOOKは「.xlsmマクロ有効ブック」で作成されています。


テンプレートシートモジュールをこのように記述しておきます。
- Worksheets(“コピー元シート名”).Copy でコピーする
- Worksheets(“コピー元シート名”).Copy After(Before) でコピーする
- Worksheets(“コピー元シート名”).Copy After(Before) で別BOOKにコピーする
Worksheets(“コピー元シート名”).Copy でコピーする
Copyメソッドに引数を何も付けない場合です。
この場合は、新たにエクセルBOOKが作られてそこに「コピー元シート名」のシートがコピー作成されます。
セルの関数式は引き継がれます。
Sub シートCopy1()
Worksheets("テンプレート").Copy
End Sub


Worksheets(“コピー元シート名”).Copy After(Before) でコピーする
Copyメソッドに引数で、「AfterやBefore」を付けてコピーする場合です。
この場合
- Afterは「コピー元シート名」の右隣にコピーされたシートが作成されます。
- Beforeは「コピー元シート名」の左隣にコピーされたシートが作成されます。
Afterの場合
Sub シートCopy2()
Worksheets("テンプレート").Copy After:=Worksheets("テンプレート")
End Sub


Beforeの場合
Sub シートCopy3()
Worksheets("テンプレート").Copy Before:=Worksheets("テンプレート")
End Sub


Worksheets(“コピー元シート名”).Copy After(Before) で
別BOOKにコピーする
別BOOKにコピーする場合は、事前に別BOOKを作成し開いておく必要があります。
セルの関数式は引き継がれます。
Sub シートCopy4()
Worksheets("テンプレート").Copy After:=Workbooks("Book3.xlsx").Worksheets("Sheet1")
End Sub

「Cells.Copy」を使って、シートのデータだけをコピーする
データだけコピーできているかどうかを分かり易くするために、
I2セルに「=round(A1*1.1,0)」という数式を入力します。A11セルに「11」を入れます。

- Worksheets(“テンプレート”).Cells.Copy Destination でコピーする
- Worksheets(“テンプレート”).Cells.Copy PasteSpecial でコピーする
- Worksheets(“テンプレート”).Cells.Copy Destination と PasteSpecialの合わせ技でコピーする
Worksheets(“テンプレート”).Cells.Copy Destination でコピーする
「Destination」は、どこにコピーするかの「どこに」を示す引数になります。
今回は「Sheet2」にペーストします。
Sub シートCopy5()
Worksheets("テンプレート").Cells.Copy Destination:=Worksheets("Sheet2").Range("A1")
End Sub
けれども、セル上に記述された関数式はコピーされます。

Worksheets(“テンプレート”).Cells.Copy PasteSpecial でコピーする
「PasteSpecial」は「形式を選択して貼り付け」メソッドです。
「Sheet3」にペーストします。
Sub シートCopy6()
Worksheets("テンプレート").Cells.Copy
Worksheets("Sheet3").Range("A1").PasteSpecial xlPasteValues
End Sub
関数式は引き継がれていません。

Worksheets(“テンプレート”).Cells.Copy Destination と PasteSpecial
の合わせ技でコピーする
上の2つのコピー方法の合わせ技でテンプレートをコピーしながら、関数式もなしにデータだけをコピーすることが出来ます。
「Sheet4」を準備しておいてください。
Sub シートCopy7()
Worksheets("テンプレート").Cells.Copy _
Destination:=Worksheets("Sheet4").Range("A1")
Worksheets("Sheet4").Range("A1").PasteSpecial xlPasteValues
End Sub

「Range.Value」で行うシートのコピー
このコピー方法は、シートのコピーというよりはセルのコピーになります。
セルの値のみのコピーになります。
関数式は引き継がれていません。
Sub シートCopy8()
Worksheets("Sheet5").Range("A1:AE19").Value = Worksheets("テンプレート").Range("A1:AE19").Value
End Sub

ワークシートのコピー結果 まとめ
シートのコピー方法についても、「どこへコピーするか?」だけでなく「何をコピーするか?」も考えて
コピーコードを選択しなければなりません。
「ここのコピーはいらなかったのに」と、改めてその箇所だけを削除することになるかもしれません。
新たなBOOKにペーストする場合は、関数式を引き連れて来ていれば、全てデータが変わってしまう事もありえます。
出来るだけ最初から適切なコピーコードを選択することが吉になります。
短期間でエクセルVBAの独学習得を目指したいなら
エクセルVBAを独学する独習方法は、学習者それぞれ十人十色、多種多様と思われます。
けれども、
出来るだけ効率よく学習するためには、いくつかの大切なポイントがあります。
独学でもVBA習得の中級クラスに達するのはそんなに難しいことではありません。
先人が行った勉強方法をあなたがそのまま利用すればよいということです。
独習のための大切な7つのポイントは、上記記事にて解説しています。
独習によるVBA習得のキーワードは、
出来るだけ多くの実例に触れること!
です。
正直、VBAの学習について自分の周りの仕事(業務)からだけ実例を得るのでは効率良い習熟は無理です。
ハッキリ言って、
本当に短い期間でVBA習得を成功させたいなら、今使っている参考書が良書かどうかを判断し、新ツールとしてオンライン学習も取り入れて行うことが、
手っ取り早く短期間習得できるというのは間違いないでしょう。
このサイトでよく使うVBAのコードのトピックを纏めています。
今回の記事はここまでです。 最後までご覧いただき有難うございました。