シートのコピーを最速に理解!VBAコードで異なる結果

VBACopyeyecatch

エクセルVBAで、ワークシートのコピーをを行う時には、行いたい内容に合わせて、

どのコードにするかを選択することが大切です。

そのためには、まずコピー時の結果を知っておくことが必要です。

エクセルVBAのコード組み立てで、よく使うメソッドの1つで「Copy」メソッドがあります。

今回はこの「Copy」メソッドの使い方を説明します。

こんにちは、じゅんぱ店長(@junpa33)です。

vbaopbtnformmatoeyecatch オプションボタンをVBAコードのみでシート設置する vbaopbtnformdeleyecatch シート上のオプションボタンを削除するVBAコード vbaopbtnformsetteieyecatch オプションボタンの実用設定をVBAコード化する vbaopbtnformGroupeyecatch オプションボタン 2つのグループ化の使い分け vbaopbtnformeyecatch フォームのオプションボタンを静的・動的設置する vbasheetvariableeyecatch ワークシートを変数化する3つの手法 オブジェクト変数など vbasheethideeyecatch エクセルシートの非表示コードをパスワード管理するVBA vbasheetdeleteeyecatch エクセルシートを削除する。Deleteの使い方と注意ポイント vbasheetprotecteyecatch Excelシートを保護する。 記述方法とプロテクトされない操作 vbasheetsorteyecatch エクセルシートの並び順が思い通り!シート名一覧で自由自在 vbasheetmoveeyecatch ワークシートのブック内移動と新規ブックへの移転を分かりやすく エクセルシートの名付け・変更と取得そして一覧化するコード vbasheetspecifyeyecatch シートの選択・指定方法とその意味。簡単でも軽視してはダメ vbaaddeyecatch Excelシートを追加・挿入するAddメソッドの使い方 sheetexistanceeyecatch シートの存在を確認する2種類のコードと実務での例題 VBACheckBoxeyecatch シートへの【2種類のチェックボックス】の設置と使い方の違い VBAOptionbuttoneyecatch オプションボタンのシートへの設置方法の詳細と使い方のコツ vbabuttoneyecatch コマンドボタンをシートに設置する2つの方法 vbacleareyecatch シートクリアーを目的のメソッド別にVBA最速理解 VBACopyeyecatch シートのコピーを最速に理解!VBAコードで異なる結果

ワークシートのコピーを最速に理解!VBAコードで選ぶコピー結果

エクセルでシートを「コピーする」という目的は一つではなく、例えば、

  1. テンプレートがあってそのテンプレートを機能ごと複製して使いたい。
  2. データ保存のためにシートをデータ共々、丸々保存したい。
  3. 保存するのはデータバックアップとして数値保存を行いたい。

というようなことがあったりします。

1と2は「Worksheets.Copy」で行うことが出来ます。

3は「Cells.Copy」で行うか「Range.Value」で行うかになります。

それぞれのコピーの方法を見ていきます。

「Worksheets.Copy」メソッドでシートのコピーを行う

この様なエクセルBOOKを例にとって説明していきます。このBOOKは「.xlsmマクロ有効ブック」で作成されています。

VBACopysample001
VBACopysample010


テンプレートシートモジュールをこのように記述しておきます。

MEMO
この方法は基本的に、コピー元のシートをVBAコードやセルの関数式を丸々コピー先に引き継ぎます。

Worksheets(“コピー元シート名”).Copy でコピーする

Copyメソッドに引数を何も付けない場合です。

この場合は、新たにエクセルBOOKが作られてそこに「コピー元シート名」のシートがコピー作成されます。

MEMO
このコピー方法では、新たに作成されたエクセルBOOKの保存方法を「.xlsx Excelブック」で保存すれば、VBAコードは引き継がれません。

セルの関数式は引き継がれます。

引数なしコード
Sub シートCopy1()
  Worksheets("テンプレート").Copy
End Sub

VBACopysample002
VBACopysample011

Worksheets(“コピー元シート名”).Copy After(Before) でコピーする

Copyメソッドに引数で、「AfterやBefore」を付けてコピーする場合です。

この場合

  • Afterは「コピー元シート名」の右隣にコピーされたシートが作成されます。
  • Beforeは「コピー元シート名」の左隣にコピーされたシートが作成されます。

MEMO
この方法は、コピー元のシートをVBAコードやセルの関数式を丸々コピー先に引き継ぎます。
Afterの場合

引数Afterコード
Sub シートCopy2()
  Worksheets("テンプレート").Copy After:=Worksheets("テンプレート")
End Sub

VBACopysample003
VBACopysample012
Beforeの場合

引数Beforeコード
Sub シートCopy3()
  Worksheets("テンプレート").Copy Before:=Worksheets("テンプレート")
End Sub

VBACopysample004
VBACopysample013

Worksheets(“コピー元シート名”).Copy After(Before) で
別BOOKにコピーする

別BOOKにコピーする場合は、事前に別BOOKを作成し開いておく必要があります。

MEMO
このコピー方法は、事前に準備したエクセルBOOKの保存方法が「.xlsx Excelブック」であれば、VBAコードは引き継がれません。

セルの関数式は引き継がれます。

別BOOKコード
Sub シートCopy4()
  Worksheets("テンプレート").Copy After:=Workbooks("Book3.xlsx").Worksheets("Sheet1")
End Sub

VBACopysample005

「Cells.Copy」を使って、シートのデータだけをコピーする

データだけコピーできているかどうかを分かり易くするために、

I2セルに「=round(A1*1.1,0)」という数式を入力します。A11セルに「11」を入れます。

VBACopysample009

Worksheets(“テンプレート”).Cells.Copy Destination でコピーする

「Destination」は、どこにコピーするかの「どこに」を示す引数になります。

今回は「Sheet2」にペーストします。

CellsCopy1コード
Sub シートCopy5()
     Worksheets("テンプレート").Cells.Copy Destination:=Worksheets("Sheet2").Range("A1")
End Sub

MEMO
このコピー方法は、シートモジュールにあるイベントコードをコピー先に引き継ぎません。

けれども、セル上に記述された関数式はコピーされます。

VBACopysample006a

Worksheets(“テンプレート”).Cells.Copy PasteSpecial でコピーする

「PasteSpecial」は「形式を選択して貼り付け」メソッドです。

「Sheet3」にペーストします。

CellsCopy2コード
Sub シートCopy6()
     Worksheets("テンプレート").Cells.Copy
     Worksheets("Sheet3").Range("A1").PasteSpecial xlPasteValues
End Sub

MEMO
このコピー方法は、テンプレートのコピーには不適な方法です。この例では、シートが間延びしています。

関数式は引き継がれていません。

VBACopysample007a

Worksheets(“テンプレート”).Cells.Copy Destination と PasteSpecial
の合わせ技でコピーする

上の2つのコピー方法の合わせ技でテンプレートをコピーしながら、関数式もなしにデータだけをコピーすることが出来ます。

「Sheet4」を準備しておいてください。

CellsCopy3コード
Sub シートCopy7()
     Worksheets("テンプレート").Cells.Copy _
     Destination:=Worksheets("Sheet4").Range("A1")
     Worksheets("Sheet4").Range("A1").PasteSpecial xlPasteValues
End Sub

VBACopysample008

MEMO
この方法によって目的のコピーが達成できます。

「Range.Value」で行うシートのコピー

このコピー方法は、シートのコピーというよりはセルのコピーになります。

セルの値のみのコピーになります。

MEMO
このコピー方法は、セルのコピーになります。この例では、セルサイズはデフォルトで値のみがコピーされます。

関数式は引き継がれていません

RangeValueコード
Sub シートCopy8()
     Worksheets("Sheet5").Range("A1:AE19").Value = Worksheets("テンプレート").Range("A1:AE19").Value
End Sub

VBACopysample014

ワークシートのコピー結果 まとめ

シートのコピー方法についても、「どこへコピーするか?」だけでなく「何をコピーするか?」も考えて

コピーコードを選択しなければなりません。

「ここのコピーはいらなかったのに」と、改めてその箇所だけを削除することになるかもしれません。

新たなBOOKにペーストする場合は、関数式を引き連れて来ていれば、全てデータが変わってしまう事もありえます。

出来るだけ最初から適切なコピーコードを選択することが吉になります。

短期間でエクセルVBAの独学習得を目指したいなら

エクセルVBAを独学する独習方法は、学習者それぞれ十人十色、多種多様と思われます。

けれども、

出来るだけ効率よく学習するためには、いくつかの大切なポイントがあります。

独学でもVBA習得の中級クラスに達するのはそんなに難しいことではありません。

先人が行った勉強方法をあなたがそのまま利用すればよいということです。

独習のための大切な7つのポイントは、上記記事にて解説しています。

重要ワード

独習によるVBA習得のキーワードは、

出来るだけ多くの実例に触れること!

です。

正直、VBAの学習について自分の周りの仕事(業務)からだけ実例を得るのでは効率良い習熟は無理です。

ハッキリ言って、

本当に短い期間でVBA習得を成功させたいなら、今使っている参考書が良書かどうかを判断し、新ツールとしてオンライン学習も取り入れて行うことが、

手っ取り早く短期間習得できるというのは間違いないでしょう。

このサイトでよく使うVBAのコードのトピックを纏めています。

エクセルVBA最速理解で必要な知識を集めよう!

今回の記事はここまでです。   最後までご覧いただき有難うございました。

<記事内容についての告知>VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません