Excel VBA

In Excel VBA, the Activate method is used to make the specified workbook or worksheet active, thereby focusing subsequent operations on it.

Activate [method]

Activateメソッドとは?

Activateメソッドは、対象となるオブジェクトを“アクティブ”な状態にするために使います。例えば、次のようにWorkbookをアクティブにしたり、Worksheetをアクティブにすることが可能です。

Workbookの例:

VBA

Workbooks("Book2.xlsx").Activate
上記のコードでは、既に開いている「Book2.xlsx」という名前のブックをアクティブにします。
Worksheetの例:

VBA

Worksheets("Sheet2").Activate
上記のコードでは、「Sheet2」というシートをアクティブにします。

メソッド名のとおり「操作対象(オブジェクト)をアクティブにする」ことが主な役割です。具体的には、VBAがそのオブジェクトを「現在作業している」対象として認識するようになる、というイメージを持ってください。

Activateを使うタイミング

実務やVBAマクロでよくあるのが、コードの中で「別のブックに移動して処理を行う」必要がある場合です。Excelは複数のブックやシートを同時に開けますが、VBAがどのブックやシートを操作しているかを明示的に切り替える必要が出てきます。その際に「Activate」を使って作業対象を切り替えることで、次のような処理が可能になります。

  1. 別のブックをアクティブにする
  2. 必要なシートをアクティブにする
  3. アクティブなシート上でセルや範囲にアクセスする

例として、以下のようなコードを考えてみましょう。

VBA

Sub SampleActivate()
	' ブック Book2.xlsx をアクティブ化
	Workbooks("Book2.xlsx").Activate
	
	' シート Sheet2 をアクティブ化
	Worksheets("Sheet2").Activate
	
	' A1セルに値を代入
	Range("A1").Value = "Hello Activate"
End Sub

このコードでは、Workbooks("Book2.xlsx").Activate によって、Book2.xlsxというブックがアクティブになります。その後、Worksheets("Sheet2").Activate によって、そのブック内のSheet2をアクティブにしたうえでRange("A1").Value = "Hello Activate"とセルへの書き込みを行います。

ActivateとSelectの違い

同じようによく目にするメソッドとしてSelectがあります。どちらも「オブジェクトにフォーカスを移す・アクティブ化する」といった役割を想像しがちですが、厳密には微妙に異なります。

Select
シートやセルなどを「選択状態」にする
例: Worksheets("Sheet2").SelectRange("A1:B10").Selectなど
Activate
ウィンドウやブック、シートなどを「アクティブ化(焦点を当てる)」する
例: Workbooks("Book2.xlsx").ActivateWorksheets("Sheet2").Activateなど

通常は「セルや範囲」にはSelectを、「ブックやシート」にはActivateを使うことが多いです。ただし、セルやRangeにもActivateメソッドがあり、たとえばRange("A1").ActivateでセルA1をアクティブにすることもできますが、慣習的にはセル範囲を操作する際はSelectを使うほうが多いです。

Activateを避けるべきケース(中級者以上向け)

実際のVBAコーディングでは、ActivateSelectを頻繁に使わないほうが良いと推奨されるケースが多くあります。理由としては、Activateを使わなくても、オブジェクトを直接指定する記述の方が可読性と保守性が高く、実行速度や安定性にも優れるからです。

例えば、以下のコードを考えてみます。

VBA

' 悪い例:ActivateやSelectを多用
Workbooks("Book2.xlsx").Activate
Worksheets("Sheet2").Select
Range("A1").Select
Selection.Value = "Hello"

このように、アクティブなブックやシート、セルに順次フォーカスを移しながら操作する書き方は、一見分かりやすいように見えますが、複数のブックを並行して操作するときにバグが発生しやすくなるだけでなく、コードが長くなりがちですし、実行速度も遅くなる可能性があります。

そこで推奨されるのが、オブジェクトを直接指定して操作するやり方です。

VBA

' よい例:ActivateやSelectを使わずに直接指定
Workbooks("Book2.xlsx").Worksheets("Sheet2").Range("A1").Value = "Hello"

このようにコードを1行で書くことで、「どのブックのどのシートのどのセルにアクセスしているのか」が明確になります。結果的にバグを減らし、長期的に見て保守もしやすくなります。

ただし、場合によってはどうしてもアクティブなシートを前提にした処理を書きたいケース(画面上の見た目を操作したい時や、ユーザー操作を前提としたイベント)もあるため、一概に否定するのではなく、「不要なところでは極力使わない」というスタンスで考えるのがベストです。

Activateを使う具体的な例

ユーザーフォームや画面操作を伴うマクロ

ユーザーフォームから、指定ブックにデータを書き込んだり読み込んだりする場面を考えます。たとえば、「ユーザーフォームで選択したブックを画面上に表示させる」というような演出を行うために、あえてActivateを使う場合があります。

VBA

Private Sub CommandButton1_Click()
	Dim bookName As String
	bookName = TextBox1.Text  ' ユーザーフォームのTextBoxに入力されたファイル名
	
	On Error Resume Next
	Workbooks(bookName).Activate ' 指定ブックをアクティブに
	If Err.Number <> 0 Then
		MsgBox "指定のブックが開いていません。"
		Err.Clear
		Exit Sub
	End If

	' ここから先はアクティブになったブックに対して処理
	Worksheets("Sheet1").Activate
	Range("A1").Select
	MsgBox "ブックとシートをアクティブにしました"
End Sub

上記コードはシンプルですが、「ブックを画面上にフォーカスする」「エラー処理でブックが開いていない場合を検出する」など、ユーザーの操作を補助するためにあえてActivateを利用しています。

ウィンドウの切り替えが必要なマクロ

Excelのウィンドウを複数開いている場合や、別ウィンドウで開いているブックに移動したい場合、Windowオブジェクトと組み合わせて使うケースがあります。

VBA

Sub SwitchWindow()
	Dim w As Window
	For Each w In Application.Windows
		Debug.Print w.Caption ' ウィンドウのキャプション(名前)をイミディエイトウィンドウに表示
	Next w
	
	' ウィンドウ名で判別してアクティブにする(例: Book2.xlsx:1)
	Windows("Book2.xlsx:1").Activate
End Sub

上記のように、ウィンドウの一覧を走査して目的のウィンドウを探し当てたあと、Activateでウィンドウを切り替えていくことができます。Excelでは、同じブックを別のウィンドウで開いている場合や、複数ブックを並べて作業している場合に、このようなメソッドが役立ちます。

Activateの使いどころと注意点

必要な時だけ使う
Activateを使うと、実際のExcelの画面も切り替わります。そのため、ユーザーの目線を意図的に誘導する場合や、画面の状態を重視する作業フローでは便利です。
自動化マクロでは極力使用を控える
画面を頻繁に切り替えることは、マクロの実行速度の低下や混乱の原因となりがちです。複数のオブジェクトを直接的に参照できるなら、Activateの代わりにオブジェクトを指定する方法を選ぶ方が良いケースがほとんどです。
イベントとの組み合わせに注意
シートをActivateするときには、Worksheet_Activateイベントが発生します。意図しないイベントが実行されるとバグの原因になり得ますので、イベントマクロを組んでいる場合は注意が必要です。
SelectActivateを使った直後のオブジェクト参照
ActiveSheetActiveWorkbookSelectionActiveCellなどは、ActivateSelectによって切り替わるため、コードで複数操作が続くと混乱しがちです。特に長いマクロでは、どのブックやシートがアクティブなのか分からなくなる可能性があります。定義をしっかりと把握してから書くか、可能なら明示的にオブジェクトを指定しましょう。
Activateでのエラー処理
ブック名やシート名が正しいかどうか、または開いているかどうかを検証するためには、On Error Resume NextIf Err.Number Then...といったエラー処理も組み込む必要があります。アクティブにできなかった場合の代替処理を含め、マクロで確実にハンドリングするのが望ましいです。

中級者以上が押さえておくと便利なポイント

Avoid using Activate/Select
中級者の方はよくご存じのとおり、マクロの可読性・保守性・実行速度の面から、なるべくActivateSelectを使わないほうが望ましいとされています。コードを構造化しやすくなるため、シンプル・モジュール的に組み立てやすいです。
Withステートメントの活用
Activateせずとも、Withステートメントを使うと、ブロック内で同じオブジェクトを対象とするコードを連続で書けるため、コードがスッキリします。

VBA

With Workbooks("Book2.xlsx").Worksheets("Sheet2")
	.Range("A1").Value = "Hello"
	.Range("B1").Value = "World"
End With
上記の例では「Sheet2」に対する操作をまとめて書くことができます。Activateせずともシートを直接操作しているので、バグを誘発する余地が少なくなります。
イベントマクロと併用するときの注意
例えばシートをActivateしたときにWorksheet_Activateイベントを自動的に呼び出したい場合など、あえてActivateをトリガーにするシナリオもあります。ただし、そのようなイベントベースのマクロが複雑になるほどデバッグが難しくなるため、イベントによる一連の流れを図示するなど、管理に気を配る必要があります。
複数ブック・複数ウィンドウを開いている場合の動作
同名のブックを複数開いている、あるいは一つのブックを複数ウィンドウで開いている場合には注意が必要です。Activateする対象のウィンドウ名やブック名を正確に把握し、想定通りのウィンドウをアクティブにしているかを確認しましょう。

まとめ

以上の点を押さえておけば、Activateメソッドを適切に使い分けることができるようになります。特に実務においては「無駄なActivateSelectを避ける」ことが品質の高いマクロを組むための一歩となりますが、最終的にはシステム要件やユーザーが期待する画面操作を踏まえて柔軟に選択するのが重要です。