HOWTO · VBA
VBA で Excel のワークシートをアクティブにする方法
この記事では、VBA を使用して Excel のワークシートをアクティブにする方法を理解できます。名前、インデックス、変数によるアクティブ化など、さまざまな方法を学びましょう。実用的な例と明確な説明により、このガイドは Excel スキルを高め、ワークフローを効率化します。
このページの内容
Excel VBA でワークシートを現在のシートにするには、その Activate メソッドを呼び出します。たとえば、Worksheets("Sheet2").Activate は Sheet2 という名前のワークシートを選択します。コードがセルの読み取りや変更だけを行う場合は、アクティブシートを変更せずにワークシートを直接参照するほうが明確なことがよくあります。
名前でワークシートをアクティブにする
Worksheets コレクションでワークシートのタブ名を使用します。最小限の VBA プロシージャは Sub ShowSummary(): Worksheets("Summary").Activate: End Sub です。Summary を、スペースを含めた正確なタブ名に置き換えてください。このコレクション内の名前は表示されるワークシート名であり、シートの VBA コード名ではありません。メンバー名は Activate で、シート参照に使用されるオブジェクト型は Worksheet です。
この小さな Python モデルは、タブ名でワークシートを検索し、セルの値を読み取る方法を示しています。
worksheets = {
"Summary": {"A1": "Ready"},
"Archive": {"A1": "Saved"},
}
selected = worksheets["Summary"]
print(selected["A1"])
Ready
このモデルは名前による選択を示しています。Excel VBA では、上記の Worksheets("Summary").Activate ステートメントを使用してください。ブックには、その正確なタブ名を持つワークシートが含まれている必要があります。
対象がマクロを含むブックに属していない可能性がある場合は、コレクションをブックで修飾します:Workbooks("Reports.xlsx").Worksheets("Summary").Activate。ブックは開いている必要があり、その名前は開いているブックと一致しなければなりません。これは、たまたまアクティブになっているブックに頼るよりも明確です。
インデックスでワークシートをアクティブにする
ワークシートは位置によっても選択できます:Worksheets(2).Activate。インデックスは 1 から始まるため、Worksheets(1) はそのブックの Worksheets コレクションの最初のワークシートを指します。インデックスはシートを順序どおりに処理するときに便利ですが、シートが挿入、削除、移動された後は別のワークシートを指すことがあります。シートの位置よりもその同一性が重要な場合は、名前を使用してください。
ActiveSheet でアクティブシートを参照する
ActiveSheet は、Excel で現在選択されているシートを指します。たとえば、ActiveSheet.Range("A1").Value = "Ready" はそのシートのセル A1 に書き込みます。修飾されていない Range("A1") もワークシートのコンテキストではアクティブなワークシートを使用するため、Excel の現在の選択に依存します。この依存関係により、別の操作でアクティブシートが変更されると、プロシージャが誤ったシートに影響を与えることがあります。対象が分かっている場合は、明示的なワークシート参照を優先してください。
シートをアクティブにすると Excel の表示上の選択が変わります。そのシートを編集するためだけに必要な操作ではありません。Worksheets("Summary").Range("A1").Value = "Ready" のような直接の参照は、対象を明示的に指定します。
ワークシート変数を使用する
Worksheet 変数は特定のワークシートへの参照を保持し、後続のステートメントで再利用できます。変数を宣言し、Set でオブジェクトを代入してから、Activate を呼び出すか、そのセルを操作します。たとえば、プロシージャのステートメントは Dim ws As Worksheet、Set ws = ThisWorkbook.Worksheets("Summary")、ws.Activate です。ThisWorkbook は VBA コードを含むブックを意味します。対象が別の開いているブックの場合は、Workbooks("Reports.xlsx") 参照を使用してください。
ws を代入した後は、セル操作でシートをアクティブにせずに ws.Range("A1").Value = "Ready" を使用できます。これにより、ユーザーが選択したシートを変更しても、操作先は明示されたままになります。
ループでワークシートをアクティブにする
タスクで各ワークシートを順番に表示することが本当に必要な場合は、Worksheets コレクションを反復処理します。VBA ループは Dim ws As Worksheet と書き、続けて For Each ws In ThisWorkbook.Worksheets、ws.Activate、Next ws と書けます。アクティブシートを必要とする操作はループの中に配置してください。Worksheets はグラフシートを除外します。Sheets はワークシートとグラフシートの両方を含むため、ワークシートのみの作業には前者を使用してください。
繰り返しのセル操作のほとんどでは、アクティブ化は不要です。代わりに、ws.Range("A1").Value = "Ready" のような直接の操作をループの中に配置してください。これにより、アクティブな選択に依存せず、各対象が明確になります。
一般的なアクティブ化のエラーと制限に対処する
名前またはインデックスは、指定したブック内のワークシートを識別しなければなりません。名前のつづりの誤りや欠落、閉じられたブック、範囲外のインデックスがあると、VBA は実行時エラーを報告します。ブック名とタブ名を確認し、アクティブにする前に対象が存在することを確認してください。
非表示のワークシートは、非表示のままではアクティブにできません。まず、たとえば Worksheets("Summary").Visible = xlSheetVisible で表示してから、ユーザーが見る必要がある場合はアクティブにしてください。完全非表示のワークシートも、アクティブ化の前に VBA または Visual Basic Editor から表示状態を変更する必要があります。
Excel では、アクティブなブックで一度にアクティブにできるシートは 1 つだけです。ブックには多くのワークシートを含めることができますが、別のシートをアクティブにすると、現在のアクティブシートが置き換わります。目的が複数のシートを更新することである場合は、複数のシートをアクティブに保とうとするのではなく、ワークシート参照をループで処理し、それぞれに直接操作してください。