イントロダクション
Excel VBAでコーディングする際、似たような効果のある書き方というのはたくさんあります。
その中で今回はWorksheetオブジェクトにある Activate と Select に注目しました。
Worksheet の Activate と Select
Worksheets("Sheet1").Activate
と Worksheets("Sheet1").Select
が混在しているソースコードはよく見かけます。
両方ともそのシートを手前に表示させる効果がありますが、細かい仕様は当然違いがあります。
そして、その違いをはっきりと言える人は少ないのではないでしょうか?
私が認識している範囲で違いを以下に書き出します。
Activate
- アクティベート:活性化
- 表示させたいワークブックが一番手前に表示されていなくても、ワークブックごと一番手前に表示します。
- 一番手前に表示できるのは一つのシートのみ
- 複数シートに対して実行はできない(Worksheetsコレクションには存在しない)
- 単純に手前に表示したい場合はこちらの記述
使用例
Sheet1を前面に表示する
Worksheets("Sheet1").Activate
この書き方はエラー
Worksheets(Array("Sheet1", "Sheet2")).Activate
次の場合は最終的にBook2が手前に表示される
Workbooks("Book1.xlsx").Activate
Workbooks("Book2.xlsx").Worksheets("Sheet2").Activate
Select
- セレクト:選択
- ワークシートを選択します。
- おまけで、そのシートを表示させます。
- 複数シートの選択ができます
- 複数シートに対して同じ操作を行う必要がある場合に使用します。
- 複数のワークブックが立ち上がっている状態で、
Select
したシートの親ワークブックが裏に隠れている(最前面ではない)場合、エラーになります - 上記エラーの恐れがあるため、表示だけの場合は
Activate
を使用するほうが良い
記載例
Sheet1を前面に表示する
Worksheets("Sheet1").Select
Sheet1とSheet2を選択する(+ 追加処理)
Worksheets(Array("Sheet1", "Sheet2")).Select
Selection.Copy ' 2つのシート間で関数が参照されている場合、計算式の変化がない
Selection.PrintOut ' まとめて印刷:ページ番号が共通になる
ただし下記の書き方ができるため、シートに対しSelectする機会は少ない
Worksheets(Array("Sheet1", "Sheet2")).Copy
Worksheets(Array("Sheet1", "Sheet2")).PrintOut
' 複数の処理を同時に行うなら下記
With Worksheets(Array("Sheet1", "Sheet2"))
.Copy
.PrintOut
End With
次の場合はBook2.xlsxのところでエラーになる
Workbooks("Book1.xlsx").Activate
Workbooks("Book2.xlsx").Worksheets("Sheet2").Select
結論
- 基本的にはActivateを使用
- 複数選択する場合のみSelectが有効