シートを開く


シートを開くときは、SelectメソッドまたはActivateメソッドを使います。次のコードは、Sheet2を開いてメッセージを表示し、続いてSheet3を開きます。

Sub Sample01()
    Worksheets("Sheet2").Select
    MsgBox "Sheet2を開きました"
    Worksheets("Sheet3").Activate
    MsgBox "Sheet3を開きました"
End Sub

厳密に言うと、SelectメソッドとActivateメソッドでは動作が異なりますが、そんなもの枝葉末節です。普通の人が普通のマクロを組むのでしたら「○○でなければダメ」など意識する必要はありません。ちなみに、Selectメソッドではシートをグループ化できます。次のコードはSheet1、Sheet2、Sheet3をグループ化します。

Sub Sample01_1()
    Worksheets(Array("Sheet1", "Sheet2", "Sheet3")).Select
End Sub

Activateメソッドでは、シートをグループ化できません。Activateメソッドはアクティブシートを指定するメソッドだからです。アクティブシートとは現在表示されているシートのことですから、どんな場合でも1つしかあり得ません。それより、開きたいシートの特定方法です。これには注意が必要です。

シートの名前とインデックス

上記のSample01では、開きたいシートをWorksheets("Sheet2")と指定しました。これは、Worksheetsコレクション内のSheet2メンバという意味です。Sheet2を指定するには他にも方法があります。冒頭で解説したとおり、ワークシートはシートの一部ですから、Sheetsコレクションを使ってSheets("Sheet2")と記述することもできます。また、コレクションでは、名前ではなくインデックス番号でもメンバを特定できますので、Sheet2を開くとき次のコードのように記述することもあります。

Sub Sample01_2()
    Worksheets(2).Select
End Sub

これは、Worksheetsコレクション内の2番目のメンバという指定方法です。一般的なブックで、Sheet2は左から2番目に位置していますから、そのようなブックでは正常に動作するでしょう。しかし、当たり前ですが、Sheet2が左から2番目に存在しないと意味がありません。実はVBAでは、コレクション内のメンバを指定するとき、Worksheets("Sheet2")と名前で指定するよりWorksheets(2)とインデックスで指定する方が若干速度が有利なのです。これは、Excelが内部で名前をインデックスに変換しているからです。しかし、この速度差は微妙なものです。体感的にはほとんど差がないと言ってもいいでしょう。速度を重視するにしても、あえて危険を冒す場所ではありません。

シートのオブジェクト名

また、次のようなコードでSheet2を開くこともできます。

Sub Sample01_3()
    Sheet2.Select
End Sub

シートには2つの名前があります。1つはExcelのシート見出しに表示される名前です。シート見出しをダブルクリックするか、[書式]メニューの[シート]をポイントし[名前の変更]を実行して自由な名前を設定することができます。もう1つは、VBAが内部で使用する名前です。VBEを起動してプロジェクトエクスプローラを見てみましょう。

ワークブックを表す[VBProject]の下に[Sheet1 (Sheet1)]と記載されています。最初の[Sheet1]はVBAの内部で、シートを特定するために使う名前です。これをオブジェクト名と呼びます。一方の括弧で囲われているのが、シート見出しなどで自由に設定できるシートの名前です。Excel上でシート名を変更すると、括弧内のSheet1は変わりますが最初のSheet1はそのままです。

このように、シートを特定するには次の3通りがあります。

  • シートの名前を指定する
  • シートのインデックスを指定する
  • シートのオブジェクト名を指定する

どの方法も一長一短です。シート名を指定する方法では、シートの並びを気にする必要がありませんし、マクロのコードを見たとき「どのシートを操作しているか」が一目瞭然です。インデックス値を指定する方法は、複数のシートを連続して操作するときなどに便利です。オブジェクト名では、ユーザーがシート名を勝手に変更してもマクロの動作に影響が出ません。ケースに応じて3通りの方法を使い分けてください。