和風スパゲティのレシピ

日本語でコーディングするExcelVBA

セルをコピー・カット・ペーストする - Copy/Cut/Paste

セルをコピー・カット・ペーストする方法を解説します。

RangeオブジェクトのCopy・Cutメソッドを使用します。


これらのメソッドはペースト先を直接指定できますので、
Pasteメソッドを使用する必要はありません。

セルをコピーする - Range.Copy

基本構文

コピー元セル範囲.Copy コピー先セル

' ※ 引数名を明記
コピー元セル範囲.Copy Destination:=コピー先セル

サンプルコード

Dim コピー元セル範囲 As Range
Set コピー元セル範囲 = ThisWorkbook.Worksheets("Sheet1").Range("A1:C3")
Dim コピー先セル As Range
Set コピー先セル = ThisWorkbook.Worksheets("Sheet2").Range("E1")

' セル範囲をコピー
コピー元セル範囲.Copy コピー先セル

' 変数を利用せず直接指定
ThisWorkbook.Worksheets("Sheet1").Range("A1:C3").Copy _
    ThisWorkbook.Worksheets("Sheet2").Range("E1")

解説

セルをコピーするには、
RangeオブジェクトのCopyメソッドを使用します。

第1引数Destinationにコピー先のセル(Range)を指定でき、
指定したセルへのペーストも同時に実行してくれます。

この場合コピー先には左上のセルだけを指定すればOKで、
例のようにA1:C3をE1へコピーするとE1:G3へペーストされます。

別シート間・別ブック間であっても問題なく実行できますので、
基本的にはこの記述だけ覚えておけばOKです。


ちなみに引数名の指定「Destination:=」はサンプルの通り省略可能です。

Copyメソッドには引数はひとつしかありませんので、
常に省略記法を用いてしまって構いません。


なお、行先を省略して実行した場合は、
その場合はセルがクリップボードへコピーされます。

コピー元セル範囲.Copy

CopyCutMode

ただしこの場合はその後Pasteを実行する必要が出てしまいますし、
その間にユーザーが偶然Ctrl+CやVを押すとマクロが誤作動を起こします。

コピー元セル範囲.Copy

' ここでユーザーがCtrl+CやCtrl+Vを押した場合はバグになる

wsコピー先シート.Paste コピー先セル
' ↑ペーストまでマクロでやるならこれ(後述)

Application.CopyCutMode = False
' ↑画像の点線(コピーモード)をキャンセルする必要も出る

原則は行先セル(引数Destination)を省略せずに運用してください。

形式を選択して貼り付ける - Range.PasteSpecial

「値のみ」「書式のみ」など形式を選択して貼り付ける場合は、
RangeオブジェクトのPasteSpecialメソッドを使用します。

Dim コピー元セル範囲 As Range
Set コピー元セル範囲 = ThisWorkbook.Worksheets("Sheet1").Range("A1:C3")
Dim コピー先セル As Range
Set コピー先セル = ThisWorkbook.Worksheets("Sheet2").Range("E1")

' 値だけ貼り付け
コピー元セル範囲.Copy
コピー先セル.PasteSpecial xlPasteValues

' コピー状態を解除
Application.CutCopyMode = False

この場合はCopyメソッドの行先Destination引数は使用できませんので、
2行に分けてPasteSpecialメソッドを実行する必要があります。

この詳しい解説についてはこちらの記事をご覧ください。
www.limecode.jp

セルを切り取って移動する - Range.Cut

基本構文

切り取り元セル範囲.Cut 移動先セル

' ※ 引数名を明記
切り取り元セル範囲.Cut Destination:=移動先セル

サンプルコード

Dim 切り取り元セル範囲 As Range
Set 切り取り元セル範囲 = ThisWorkbook.Worksheets("Sheet1").Range("A1:C3")
Dim 移動先セル As Range
Set 移動先セル = ThisWorkbook.Worksheets("Sheet2").Range("E1")

' セル範囲を切り取って移動
切り取り元セル範囲.Cut 移動先セル

' 変数を利用せず直接指定
ThisWorkbook.Worksheets("Sheet1").Range("A1:C3").Cut _
    ThisWorkbook.Worksheets("Sheet2").Range("E1")

解説

セルを切り取って移動するには、
RangeオブジェクトのCutメソッドを使用します。

Copyメソッドと同じく引数Destinationを指定でき、
セルの切り取りと移動を同時に実行してくれます。


移動先には左上のセルだけを指定すればOKで、
例のようにA1:C3をE1へ移動するとE1:G3へペーストされます。

元のA1:C3からはセルの内容が削除されるため、
コピーではなく移動になる点がCopyメソッドとの違いです。

おまけ:Pasteメソッドについて

ここまで解説した通り、
Copy・Cutメソッドでは引数Destinationにペースト先を指定できます。

そのため、セル同士を普通にコピー・移動するだけであれば、
Pasteメソッドを使用する必要はありません。


一応Pasteメソッドについても触れておくと、
まず前提としてRangeオブジェクトにはPasteメソッドはありません。
(上記の通りPasteSpecialメソッドは存在します)


通常のPasteメソッドを持っているのは、
RangeではなくWorksheetオブジェクトになります。

ThisWorkbook.Worksheets("Sheet1").Range("A1:C3").Copy
ThisWorkbook.Worksheets("Sheet2").Paste ThisWorkbook.Worksheets("Sheet2").Range("E1")

 
見ての通りかなりコードが冗長な上に、
前述の通り偶然ユーザーがCtrl+CやCtrl+Vを押してしまうと不具合になります。

よほどのことがなければPasteメソッドは使用せず、
素直にCopy/Cutメソッドの引数「Destination」を使用してください。