初心者のためのExcelマクロ超入門(絶対できるVBA開発)

マクロがまったくわからない人のためにエクセルマクロやVBAについてできるだけわかりやすく書いています。Twitter:@shuhhohhey

初心者のためのExcel(エクセル)マクロVBA入門-コピーと貼り付け(Copyメソッド)

f:id:drumer2sh:20070312143103j:plain

マクロの記録でコピーしてペーストすると・・・

たぶんなのですが、一番初心者の方がやりたいエクセルの作業ってコピー&ペーストだと思います。オートフィルできないデータかなんかを一生懸命コピーしてペーストして・・・なんて大変な作業をマクロで。。。なんて考えたりすると思います。そして、マクロをやってみようと思ってやってみるのがマクロの記録です。このブログで散々に「初心者はやってはいけない」と言ってきたものです。

さて、ちょっと記録してみましょうか?
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に代入してるだけです。これだけ、超簡単。


今日はこんな感じで。

次回は、検索です。これも良く使うので先にやってしまいます。