【Excelマクロ】シート間のやり取り

Excelマクロ

シート間のデータのやり取りを効率化する方法

マクロを作成する際、違うシート間でデータをコピーする場面はよくあります。

例えば、Sheet1からSheet2へデータをコピーする場合、どのような方法があるでしょうか?

主な方法として、以下の3つが考えられます。

  1. セルをコピーして、貼り付けたいシートを選択して貼り付ける
  2. 変数に値を入れて、貼り付けたいシートを選択して貼り付ける
  3. 直接、値を反映する

この中で、最もスマートで速いのは「3. 直接、値を反映する」方法です。ただし、この方法を使うには、VBAでのシートの仕組みを理解する必要があります。

1. セルをコピーして貼り付ける方法

通常、Excelでコピー&ペーストを行うときは、コピーして、貼り付けるという方法ですが、よくする作業なので、流れるように作業をしていないでしょうか?

細かく、動作を考えたことはあまりないかと思いますが、次のような流れで作業をしていると思います。

  1. Sheet2 を選択する
  2. Sheet2A1 をコピーする
  3. Sheet1 を選択する
  4. Sheet1A1 に貼り付ける

これを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を書いていきましょう!

コメント