実務の定番を1行で!コピー・ペーストの「高速・値貼り」最適解

Level5 VBA・マクロ

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. 1行で完結: 
    Copy や Paste という命令を使わないため、コードが短く、管理が楽です。
  2. 高速処理:
     Excelの内部メモリだけで処理が完結するため、通常のコピー&ペーストより圧倒的に速いです。
  3. 「値だけ」を転記: 
    書式(色やフォント)はコピーされず、中身の値(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出力の自動化」に進みます。
ボタン一つで書類を完成させ、メールに添付できる状態まで持っていくテクニックを学びましょう!

コメント

タイトルとURLをコピーしました