【Excel VBA】セルのコピー
- 2020.08.07
- 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
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
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での自動化や省力化に関するお問い合わせはこちらからお待ちしております。
LancersやMENTAでも活動していますので、そちらからお仕事を依頼して頂けます。
- 前の記事
【Excel VBA】セルへの値設定 2020.08.06
- 次の記事
【Excel VBA】最終行・最終列の取得 2020.08.11