VBA最初の一歩(その3)マクロ記録とSelectメソッド|Excel VBA |
マクロ記録機能を用いていると、セルに格納されたデータを扱うには必ずセルを選択するため、例えばセルA1から連続するセル領域をコピーしてシート2のセルA1を起点として貼り付けをする、という動作を行うと、記録されたマクロには・・・
Range("A1").Select
Selection.CurrentRegion.Select
Selection.Copy
Sheets("Sheet2").Select
Range("A1").Select
ActiveSheet.Paste
のように記述されます。
この中にSelectメソッドが何度も出てきていますが、実際、必ずしも選択する必要はありません。 1、2行目を見ると・・・
Range("A1").Select
Selection.CurrentRegion.Select
ここで行いたいのはセルA1を起点としたアクティブセル領域(CurrentRegion)の取得ですが、記録では・・・
A1を選択
選択範囲(Selection)のアクティブセル領域を選択。
となっており、1行目のSelectメソッドの実行結果としてSelectionはセルA1をあらわします。
つまり、Selectionの中身はここではセルA1であることから、
Range("A1").CurrentRegion.Select
としても同じことなのです。
さらにこの後のCopyメソッドで使われているSelectionが表しているのは
”Range("A1").CurrentRegion”ですから・・・
Range("A1").CurrentRegion.Copy
としても結果は同じです。
このように、マクロ記録を修正する際に肝心なのは重複した命令をどのように見出すかにかかっています。
サンプル4、5行目はシートの切り替えを行っているため、1行にまとめることは出来ませんが、Copyメソッドを見直すことでシートの切り替えを行わずに済ませることが可能です。
Selection.Copy Destination:=Sheets("Sheet2").Range("A1")
※Copy Destination:=貼り付け先
とすることで、貼り付け先を指定しておけば、シートの切り替えも、貼り付け先基準セルの選択も行わずにすみます。(Destinationとは英語で”目的地”の意味です)Destinationを指定することで、結果として上記サンプルは最終的に・・・
Range("A1").CurrentRegion.Copy Destination:=Sheets("Sheet2").Range("A1")
の一行まで短縮することが出来ます。
ここではSelectメソッドに対象を絞りましたが、Activateメソッドも同様で、本当にアクティブにする必要があるのか、選択する必要があるのか、をマクロ記録を修正する際には考えてみる必要があります。