こんにちは!ぐーです。
いつもブログをご覧いただき、ありがとうございます!
突然ですが、VBAでデータを転記するとき、「コピーして、貼り付ける」というコードを書いていませんか?
もし「マクロ実行中に他のコピー作業ができなくてイライラする」なら、それは「値渡し(あたいわたし)」を知らないせいかもしれません。
今日は、「値渡し」テクニックをご紹介します。
マクロがあなたの「コピー」を邪魔している?
よくある悩み。それは「マクロがクリップボードを占領すること」です。
VBAで .Copy と .Paste を使うと、PCのクリップボード(コピーしたデータを一時保存する場所)を使います。
つまり、マクロが動いている間、私たちは他のメールやチャットの文章をコピーできません。
もしうっかりコピーすると、本来コピペするはずじゃなかったデータがまぎり込んでしまったり、マクロがエラーを起こして止まってしまうことも……。怖いですよね。
「コピー」ではなく「テレポート」させよう
そこで登場するのが「値渡し」です。
- Copy & Paste: 家具(データ)をトラック(クリップボード)に積んで、別の部屋に運ぶ。
- 値渡し: 家具(データ)を、別の部屋にテレポートさせる。
「値渡し」はクリップボードというトラックを使いません。
直接、セルからセルへ値を代入します。だから、マクロ実行中に私たちが裏で別の作業をしていても、全く問題ありません。
驚きのスピードと安定性
「値渡し」のメリットは安全性だけではありません。速いんです。
一般的なデータ量(数千行~数万行)であれば、クリップボードを経由しない分、処理速度は劇的に向上します。
実際に処理速度を計測させてみるのも面白いですよ。
そして、コードもたったの1行で済みます。
コピペで使える!魔法のコード
では、実際にコードを見てみましょう。
× 今までの方法(Copy & Paste)
Sub OldCopy()
' A1セルの値をB1セルにコピー&値貼り付け
Range("A1").Copy
Range("B1").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False ' コピーモード解除(これを忘れると点線が残る)
End Sub
3行も使っていますね。しかも画面がチカチカします。
◎ これからの方法(値渡し)
Sub SmartTransfer()
' A1セルの「値」を、B1セルの「値」に入れる
Range("B1").Value = Range("A1").Value
End Sub
たったこれだけです。
「B1セルの値は、A1セルの値と同じです」と宣言するだけです。
範囲指定もOKです
Sub RangeTransfer()
' A1:A10の値を、B1:B10に転記
Range("B1:B10").Value = Range("A1:A10").Value
End Sub
※転記元と転記先のセルのサイズ(行数・列数)を合わせるのがコツです。
おわりに
もし、さらに大量のデータを扱うようになれば「配列」という技術もありますが、まずはこの「値渡し」で十分。ぜひ試してみてください。
VBAを独学で学び、業務自動化に5年以上携わってきた私が、「本当に実務で役立った!」と感じた2冊を紹介します。 もう本選びで失敗したくない方は、よければ参考にしてみてください。

コメント