初心者のためのExcel(エクセル)マクロVBA入門-コピーと貼り付け(Copyメソッド)
マクロの記録でコピーしてペーストすると・・・
たぶんなのですが、一番初心者の方がやりたいエクセルの作業ってコピー&ペーストだと思います。オートフィルできないデータかなんかを一生懸命コピーしてペーストして・・・なんて大変な作業をマクロで。。。なんて考えたりすると思います。そして、マクロをやってみようと思ってやってみるのがマクロの記録です。このブログで散々に「初心者はやってはいけない」と言ってきたものです。
さて、ちょっと記録してみましょうか?
A1の内容をB1にコピーする作業をマクロの記録でやってみます。すると・・・
Sub Macro1() Range("A1").Select Selection.Copy Range("B1").Select ActiveSheet.Paste End Sub
っとまぁこんな感じになります。別に間違ってはいませんが・・・じゃあSheet1のセルA1をコピーしてSheet2のA1にペーストしたい場合はどうなるんでしょうか?実際に記録を使うようにするとまたこうなります。
Sub Macro1() Range("A1").Select Selection.Copy Worksheet("Sheet2").Select Range("A1").Select ActiveSheet.Paste End Sub
何がまずいかわかりますか?動けばいいじゃん。という考えは捨てましょう。このままではどう考えてもプログラムとしては「不完全」なのです。
結局キモはオブジェクトの正しい指定
このマクロ、Sheet3がアクティブの時にやってみたらどうなるでしょう?Sheet3のA1セルがコピーされるのは当然ですね。なぜならコピーする場所の指定が正確ではないからです。今までこのブログの基礎を読まれている方ならわかりますよね?そう「どのシートか」がこのプログラムからは抜けているからです。きちんとオブジェクトを指定しましょう。それだけでコードがかなりすっきりします。
シートオブジェクトをちゃんと指定して記述
Sub Macro1() Sheet1.Range("A1").Select Selection.Copy Sheet2.Range("A1").Select ActiveSheet.Paste End Sub
こうなりますね。これだけで「Worksheet("Sheet2").Select」という命令文を省略できました。
Selectメソッドは滅多なことでは使わない。
もう一つ大事なことはSelectメソッドを多用していることです。Selectメソッドはその名の通り、オブジェクト選択した状態、つまりアクティブな状態にするメソッドです。これを多用するとプログラムの実行速度に多大に影響を与えます。そもそも、Excelで何かをするときにわざわざ選択しないといけないのでしょうか?VBAやExcelはオブジェクトを正しく指定すれば後は操作したり、設定するのは簡単です。わざわざExcel上で「選択」する必要なんてないはずです。
メソッドは正しく使おう
Copyメソッドはコピーするメソッドです。しっかりとその機能を確認してみましょう。
以下はヘルプの引用です。
グラフのデータ要素やデータ系列のピクチャ (画像) をクリップボードにコピーします。
expression.Copy
式 必ず指定します。上のいずれかのオブジェクトを返すオブジェクト式を指定します。
すべて非表示Copy メソッドを Range オブジェクトに指定した場合Range オブジェクトを指定したセル範囲へ、またはクリップボードへコピーします。
expression.Copy(Destination)
式 必ず指定します。上のいずれかのオブジェクトを返すオブジェクト式を指定します。
Destination 省略可能です。バリアント型 (Variant) の値を使用します。コピー先のセル範囲を指定します。この引数を省略すると、クリップボードにコピーします。
色々と書いてありますが、大事なことが書いてあります。それは、オブジェクトを指定したらCopyメソッドはそのまま使用できるということと、コピー先も指定することができるということです。
つまり。今のコードは、コピーとペースをわざわざ別のメソッドにしているわけです。ちゃんとコピーメソッドを理解していればわずか1行で終わります。最終的なコードはこうなります。
Sheet1のセルA1の内容をSheet2のセルA1にコピーする
Sub Macro1() Sheet1.Range("A1").Copy Sheet2.Range("A1") End Sub
これだけです。いかがでしょうか?Selectメソッドは一切使ってませんし、1行のコードですから、実行も早いです。マクロの記録は初心者の間は使ってはいけないというのを改めて理解できる一例だと思います。
こっからは余談なんですが、私だったらぶっちゃけコピーメソッドとか使いません。セルの書式とか関係なく値のみ入れたいというのなら、こう書きます。
Sub Macro1() Sheet2.Range("A1").Value = Sheet1.Range("A1").Value End Sub
いじょ。Sheet1のA1の内容をSheet2のセルA1に代入してるだけです。これだけ、超簡単。
今日はこんな感じで。
次回は、検索です。これも良く使うので先にやってしまいます。
Excel VBAのプログラミングのツボとコツがゼッタイにわかる本―最初からそう教えてくれればいいのに!Excel2007/2003対応
- 作者: 立山秀利
- 出版社/メーカー: 秀和システム
- 発売日: 2007/10/23
- メディア: 単行本
- 購入: 23人 クリック: 470回
- この商品を含むブログ (19件) を見る