シート間のデータのやり取りを効率化する方法
マクロを作成する際、違うシート間でデータをコピーする場面はよくあります。
例えば、Sheet1
からSheet2
へデータをコピーする場合、どのような方法があるでしょうか?
主な方法として、以下の3つが考えられます。
- セルをコピーして、貼り付けたいシートを選択して貼り付ける
- 変数に値を入れて、貼り付けたいシートを選択して貼り付ける
- 直接、値を反映する
この中で、最もスマートで速いのは「3. 直接、値を反映する」方法です。ただし、この方法を使うには、VBAでのシートの仕組みを理解する必要があります。
1. セルをコピーして貼り付ける方法
通常、Excelでコピー&ペーストを行うときは、コピーして、貼り付けるという方法ですが、よくする作業なので、流れるように作業をしていないでしょうか?
細かく、動作を考えたことはあまりないかと思いますが、次のような流れで作業をしていると思います。
Sheet2
を選択するSheet2
のA1
をコピーするSheet1
を選択するSheet1
のA1
に貼り付ける
これをVBAで書くと、以下のようになります。
Sheets("Sheet2").Select
Cells(1, 1).Copy
Sheets("Sheet1").Select
Cells(1, 1).Select
ActiveSheet.Paste
このように、通常の動作をそのままVBAにすることが可能です。
しかし、そのままの動作をVBAにするためには、みていただいた通り、コードが5行必要となり、また、シートの選択は動作が重くなる作業のため、何度も行うと動作が重くなる原因になります。
2. 変数を使って値を移動する方法
次に、変数を使って値を一時的に格納し、それを別のシートに代入する方法を考えてみると、次のようなコードになります。
Sheets("Sheet2").Select
txt=Cells(1, 1).Copy
Sheets("Sheet1").Select
Cells(1, 1).Value = txt
変数を使ったことで貼り付ける、という動作は無くなりましたが、1行減っただけであまり少なくなったように思えません。
さらに短くする方法を見ていきます。
3. 直接、値を反映する方法(最も速い)
最もシンプルで、実行速度が速い方法が直接、値を反映する方法ですが、次のようにコードを記載します。
Sheets("Sheet1").Cells(1, 1).Value = Sheets("Sheet2").Cells(1, 1).Value
この方法は「どのシートのセル」か、を指定することで、「シートの選択」を不要にしています。
そのため、これはどのシートを選択していたとしても、「Sheet2」から「Sheet1」にデータがコピーされるということです。
そのため、例えば「Sheet3」を選択していたとしても、影響なくコピーすることができます。
この方法なら「1行」で処理が完了するので、コードが全体として短くなり、処理速度もシートの選択がない文速くなります。
まとめ
シート間のデータのやり取りには、次の3つの方法があります。
方法 | 特徴 | 速度 |
---|---|---|
1. セルをコピー&ペースト | シートの選択が多く、遅い | 遅い |
2. 変数を使う | 一時的に値を格納し、貼り付ける | 速い |
3. 直接、値を代入 | 最もシンプルで速い | 最速 |
シートのやり取りが多い場合は、「直接値を反映する」方法が処理スピードが速くなります。
ただ、複数のデータを、同じシートのうち、あちこち(A1、B3、C6など)から取得するなどの場合には、変数に入れて取り出す、という方法の方がわかりやすい時があります。
ケースバイケースにはなりますが、マクロの動作速度も考えて、不要なシート選択を避けることを意識してVBAを書いていきましょう!
コメント