【Excel VBA】セルのコピー

【Excel VBA】セルのコピー

今回はExcel VBAを利用してセルのコピーを行う方法を説明します。
1つのセルをコピーしたりや複数のセルをコピーしたりすることは頻繁に行う処理なので覚えておきましょう。
セルからの値の取得やセルへの値の設定の応用となります。

1つのセルのコピー

まずはサンプルプログラムとその結果を見てみましょう。

Sub Sample01()
    ' RangeオブジェクトのValueプロパティを使用して直接コピー
    Range("E1").Value = Range("B2").Value

    ' CellsオブジェクトのValueプロパティを使用して直接コピー
    Cells(2, 5).Value = Cells(1, 3).Value

    ' 変数を介してコピー
    Dim str1 As String
    str1 = Range("A2").Value
    Cells(3, 5).Value = str1

    Dim str2 As String
    str2 = Cells(4, 3).Value
    Range("E6").Value = str2
End Sub

Sample01の実行結果

RangeオブジェクトのValueプロパティが返すデータ型はVariantです。
その値を別のRangeオブジェクトのValueプロパティに設定するか、変数を介して設定するかの違いがE1セルへのコピーかE3セルやE6セルへのコピーになります。
変数を介すようにする場合はセルの中の値が数値に変換できるのか?文字列のままがいいのか?を見極めて変数を宣言するようにしましょう。

また注意して頂きたいのが「コピーされるのは値だけ」という点です。
書式もコピーしたい場合は別の方法で行う必要がありますが、また別の記事にて説明します。

複数セルのコピー

複数セルのコピーはRangeオブジェクト一択となります。
Cellsオブジェクトはセル単位のオブジェクトであるのに対して、Rangeオブジェクトは複数セルをまとめて扱うことができるオブジェクトになります。
では、サンプルプログラムと実行結果を見てみましょう。

Sub Sample02()
    ' A1形式でのコピー
    Range("E2:G4").Value = Range("A1:C3").Value

    ' R1C1形式でのコピー
    Range(Cells(2, 9), Cells(3, 11)).Value = Range(Cells(3, 1), Cells(4, 3)).Value

    ' コピー元とコピー先の範囲が異なる場合
    Range("E6").Value = Cells(3, 1).Value
    Cells(6, 9).Value = Range(Cells(3, 1), Cells(4, 3)).Value
End Sub

Sample02の実行結果

Rangeオブジェクトで範囲を指定する方法は2通りあります。

1つ目は「A1形式」での指定です。
A1形式で指定する時はRangeオブジェクトに「“範囲の開始セル:範囲の終了セル”」のように記述します。

2つ目は「R1C1形式」での指定です。
R1C1形式で指定する時はRangeオブジェクトにCellsオブジェクトを2つ与えます。
記述方法は「Cells(範囲の開始行, 範囲の開始列), Cells(範囲の終了行, 範囲の終了列)」のようになります。

また、上記のようにコピー元とコピー先の範囲の大きさが異なる場合は、コピー元とコピー先の範囲で重複している部分が対象となります。
太枠はコピー先の範囲、点線枠はコピー元の範囲の大きさになります。

まとめ

1つのセルコピーする場合はRangeオブジェクトでもCellsオブジェクトでも可能ですが、複数セルをコピーする場合はRangeオブジェクトを使用することになります。
また、Rangeオブジェクトで範囲を指定する場合の書き方にもA1形式とR1C1形式の2通りあります。

以下の表で範囲の開始セルをStartCell, 終了セルをEndCellとして記述する

対象セル 形式 記述方法
1つ A1形式 Range(“対象セル”).Value
R1C1形式 Cells(“対象セルの行, 対象セルの列”).Value
複数 A1形式 Range(“範囲の開始セル:範囲の終了セル”).Value
R1C1形式 Range(Cells(範囲の開始行, 範囲の開始列),  Cells(範囲の終了行, 範囲の終了列) ).Value

繰返しで処理を行う場合などはR1C1形式で指定する場合の方が多いので、R1C1形式での範囲選択も覚えておくようにしましょう。

では、Excel VBAを使用した自動化ライフを楽しみましょう♪

Excelでの自動化や省力化に関するお問い合わせはこちらからお待ちしております。
LancersMENTAでも活動していますので、そちらからお仕事を依頼して頂けます。