別シートの参照と選択の違い
VBAで別シートのデータ扱う際に、シートを選択してから操作する方法と選択せずに直接操作する方法の2つがあります。
「参照」という言葉と「選択」という言葉はVBAでは異なっています。たまに「参照」という言葉に「選択」も含んでいると考えてしまう方がたまにおられるのですが、シートを選択してもしなくても、別シートのデータを参照することは可能です。
- 参照:Excelを普段操作するのとは異なり、VBAの変数を利用して、別シートを選択せずに、その別シートを参照する方法。
- 選択(Select):Excelを普段操作するように、VBAでもシートやセルを画面上で表示して、アクティブにする方法。
別シートを事前に選択するかしないかの違いです。
多くの場合は、選択しない方が処理速度は速いですし、また、余計な処理をしなくて済むという利点もあります。
選択しない方法が優れている3つの理由
- 処理速度が大幅に向上 : 参照であれば画面の再描画が不要なため、その分処理が速くなります。参照するシートやセルなどのデータが多くなるほど顕著です。
- 画面のちらつきを防止 : シートの切り替えが多数発生すると画面のちらつきがありますが、参照時であればそれが無くなります。
- アクティブシートが変わらない : 表示しているシートを変えずに別シートの操作が可能になるため、現在表示中のシートの作業を中断せずに済みます。
方法1. 別シートを選択せずに参照する方法(オススメ)
別シートを選択せずに、別シートのA1セルに”100″を入力するサンプルです。
2行目でWorksheetオブジェクト用の変数を用意し、4行目で別シートのオブジェクトを格納しています。
あとは、その別シートを格納したWorksheetオブジェクトを参照すれば別シートを選択せずに参照することが可能になります。
この関数が終わった直後もシートは元のシートを選択したままの状態です。別シートを選択してA1セルを見ると”100″が入力されていることが確認できます。
1 2 3 4 5 6 7 8 9 |
Sub SheetReferTest() Dim sht As Worksheet '// Sheet1をワークシート変数にセット。これ以降、sht.RangeなどでSheet1シートの操作が可能。 Set sht = Sheets("Sheet1") sht.Range("A1").Value = "100" sht.Range("B1").Value = "200" sht.Range("C1").Formula = "=A1+B1" End Sub |
方法2. 別シートを選択して参照する方法(非推奨)
別シートを選択して、選択後のシートのA1セルに”100″を入力するサンプルです。
この関数が終わった直後は一番左のシートがアクティブになっている状態になります。
1 2 3 4 5 |
Sub SheetSelectReferTest() Sheets(1).Select Range("A1").Value = "100" End Sub |
別シートを選択した方がいいかどうか
別シートのデータを参照する際に、その別シートを選択すべきかどうかですが、プログラミングと処理速度の観点から言えば多くの場合は選択しない方が良いです。
しかし、VBAの処理開始以降でシートの遷移などが目視できることを重要視するなどの場合であれば別シートを選択することもあります。
絶対に別シートを選択しなければならない場合
絶対に別シートを選択しなければならない場合があります。それはセルを選択する場合です。
セルを選択する場合は以下の手順を必ず踏む必要があります。
- シートを選択する。
- セルを選択する。
この順番は必須です。シートを選択せずにセルを選択することは出来ません。
もし別シートを選択せずにセルを選択するとエラーになります。
エラーになる例
以下のコードはシートを選択せずにセルを選択しようとして、エラーになります。
1 2 3 4 |
Sub WrongWay() ' エラー: Sheet1を選択せずにセルを選択しようとしている Sheets("Sheet1").Range("A1").Select ' ← 実行時エラー End Sub |
別シートのセルの選択をする場合の正しい方法
別シートのセルを選択する場合は、まず別シートを選択(Select)して、そのあとにそのシートのセルを選択(Select)します。
1 2 3 4 5 6 7 8 9 |
Sub CorrectWay() ' 1. まずシートを選択 Sheets("Sheet1").Select ' 2. その後セルを選択 Range("A1").Select ' これでA1セルがアクティブになる End Sub |