Excelでの作業において、「コピー&ペースト」は最も頻繁に行う操作の一つです。
マクロ記録を使えば、確かにこの操作はコード化されます。
しかし、記録されたコードは非常に長く、動作も遅いという欠点があります。
今回は、この冗長な手順を排除し
「値だけ」を「たった1行のコード」で高速に貼り付ける究極の最適解を伝授します。

マクロ記録が生成する冗長なコードの罠
まずは、マクロ記録を使ったコードを見てみましょう。
※手作業を再現しているため、長く、遅くなります。
Sub マクロ記録の例()
Range("A1").Select ' A1セルを選ぶ
Selection.Copy ' 選んだセルをコピー
Range("B1").Select ' B1セルを選ぶ
ActiveSheet.Paste ' 貼り付けを実行
Application.CutCopyMode = False ' コピーモードを解除
End Sub
Select を使って一つずつマウス操作を再現しているため
動作が遅い上に、途中でシートが切り替わるなどの誤作動の原因になります。

「手作業を分解」「記録でコード確認」
という意味ではマクロの記録はいいよね。
でも!
コピペは1行で完結、処理は早くしよう!
あまりに重いマクロだとフリーズして
業務の効率化じゃなくなるからね。
「値だけ」を「1行」で転記する最適解
私たちが目指すのは、「A1セルの値を、B1セルに入れる」という
実況中継そのままのコードです。
Range("B1").Value = Range("A1").Value
解説:「セルB1の値」に「セルA1の値」を入れる
これが、コピー&ペーストの最適解です。

「.(ドット)」を「の」と読み、
「=」を「←」と解釈すればいいだけだから
この方法は理解しやすくて便利!
この方法はブック間・シート間でも利用できるからね。
このコードが優れている3つの理由
- 1行で完結:
CopyやPasteという命令を使わないため、コードが短く、管理が楽です。 - 高速処理:
Excelの内部メモリだけで処理が完結するため、通常のコピー&ペーストより圧倒的に速いです。 - 「値だけ」を転記:
書式(色やフォント)はコピーされず、中身の値(Value)だけが転記されます。
これにより、「書式もコピペされる」という悲劇を防げます。
範囲全体を「値だけ」で転記する応用技
このテクニックは、セル単体だけでなく、広範囲のデータにも応用できます。
- 手作業: A1からA10までをコピーし、B1からB10に「値だけ」を貼り付ける。
- VBA(最適解):
Range("B1:B10").Value = Range("A1:A10").Value
Rangeが持つパワーにより、転記元と転記先の範囲さえ合っていれば
VBAが配列処理という高速な方法で一瞬でデータを移動してくれます。
【例外】PasteSpecial の「中身」を理解しよう
ただ値だけをコピペしたいときは「=」でいいですが
それ以外の要素(書式など)もコピペしたいときありますよね。
例外的に、書式も含めてコピペしたい場合は「Paste Specialメソッド」を使いましょう!
PasteSpecial は、日本語に訳すと「形式を選択して貼り付け」です。
エクセルで右クリックした時に出てくるあの複雑なメニューを、VBAの「英単語」で指示しているだけなんです。
コードの構造:
貼り付け先.PasteSpecial Paste:=貼り付ける種類, Operation:=計算, Transpose:=入れ替え
これをすべて書くのは大変なので、実務では必要な部分だけを「つまみ食い」して書きます。
1. 「何」を貼るか決める(Paste)
一番よく使うのが、この「Paste(ペースト)」の部分です。
ここで「値だけ」や「書式だけ」を指定します。

当然、「値だけ」のコピぺなら
さっき学習した「.Value = .Value」でOK!
xlPasteValues:値のみ(数式を消して結果だけ貼る)xlPasteFormats:書式のみ(色や枠線だけマネする)
' 書式だけ貼り付けたい時
Range("B1").PasteSpecial Paste:=xlPasteFormats

2. 「配置」を変えるか決める(Transpose)
「行列を入れ替える」という指示は、Transpose(トランスポーズ) という言葉を使います。
True:入れ替えるFalse:入れ替えない(省略するとこれになる)
' 値を貼り付けつつ、行列も入れ替えたい時
Range("B1").PasteSpecial Paste:=xlPasteValues, Transpose:=True


たまに「行列が逆だったら使いやすいのに」って思う表があるよ。
手作業で直してもいいけど、理解を深めるために紹介したよ!
3. なぜ「Application.CutCopyMode = False」が必要か?
Copy 命令を出すと、エクセルは「いつでも貼り付けられるように全力でデータを抱えている状態」になります。
セルの周りで点々が動いているのは、
「エクセルが今、すごくメモリを使っていますよ!」というサインです。
Application.CutCopyMode = False

コピーモードを解除してあげれば
マクロの処理速度が少しUP!
ブック間、シート間のコピペ
「=」を利用したコピペ
シート間でコピペをする場合なら気にせず「=」でコピペをしましょう!
しかし、ブック間になると「=」だけでコピペする場合
全てのブックが開いていないとエラーになります。
Sub ブック間のデータ転記()
Dim wbFrom As Workbook
Dim wsTo As Worksheet
' 住所を変数にセット!
Set wbFrom = Workbooks("2024年売上データ.xlsx")
Set wsTo = ThisWorkbook.Worksheets("まとめ")
' これだけでOK!
wsTo.Range("B5").Value = wbFrom.Worksheets("12月").Range("A1").Value
End Sub

ブック間では事前に全ブックを開く操作を用意しないと
エラーになるから注意!
「Set」やブックやシートの指定方法が分からない方はこちらをチェック!
今回のクエストを終えて
- マクロ記録の
SelectやCopyは冗長で、誤作動の原因になるため避ける。 - 最強の最適解は
転記先.Value = 転記元.Valueの1行完結! - この方法なら、自動的に「値だけ」が高速転記され、書式の崩れを防げる。
PasteSpecialは書式や行列入れ替えなど、特殊な貼り付けが必要な時だけ使う例外処理。
これで、実務で最も時間のかかる「データの移動」を高速化できるようになりました。
次回は、この高速化の応用編として、「保存・印刷・PDF出力の自動化」に進みます。
ボタン一つで書類を完成させ、メールに添付できる状態まで持っていくテクニックを学びましょう!






コメント