VBA シートを取得する

はじめに

Excel VBA マクロでシートを指定して取得する方法を紹介します。

Sheets または Worksheets プロパティから、シートを取得できます。

ActiveSheet オブジェクトから、アクティブシートを取得できます。

ActiveWindow.SelectedSheets プロパティから、選択しているシートを取得できます。

シート名を取得するには「シート名を取得または変更する」をご覧ください。
  • 目次
    • シートを取得する
    • アクティブシートを取得する
    • 別ブックのシートを取得する

シートを取得する

sheet1

Sheets または Worksheets からシートを取得できます。

Sheets と Worksheets の違いはワークシート以外を取得するかどうかです。

  • Sheets:すべてのシートを取得
  • Worksheets:ワークシートのみ取得(グラフシートなどは取得しない)

Worksheets からは必ずワークシート (Worksheet 型) が取得されますが、Sheets からはグラフシート (Chart 型) なども取得できるので Variant 型の変数で受け取ります。

インデックスで取得

Sheets の引数にインデックスを指定すると、そのシートを取得できます。

1 番左のシートを取得するには Sheets(1) または Worksheets(1) を入力します。1 番左のシートが 1 です。

Dim ws As Worksheet
Set ws = Sheets(1)     ' 1 番左のシートを取得
Set ws = Worksheets(1) ' 1 番左のシートを取得
Set ws = Sheets(2)     ' 2 番目のシートを取得
Set ws = Worksheets(2) ' 2 番目のシートを取得
Debug.Print(ws.Name)

シート名で取得

Sheets の引数に名前を指定すると、そのシートを取得できます。大文字と小文字は区別しません。

シート名「Sheet1」のシートを取得するには Sheets("Sheet1") または Worksheets("Sheet1") を入力します。

Dim ws As Worksheet
Set ws = Sheets("Sheet1")     ' シート「Sheet1」を取得
Set ws = Worksheets("Sheet1") ' シート「Sheet1」を取得
Debug.Print(ws.Index)

指定したシートが存在しないときは「エラー 9 インデックスが有効範囲にありません。」が発生します。

シートの存在チェックをするには「シートの存在確認をする」をご覧ください。

1 番右のシートを取得

1 番右のシートを取得するには Sheets(Sheets.Count) または Worksheets(Worksheets.Count) を入力します。

Dim ws As Worksheet
Set ws = Sheets(Sheets.Count)         ' 1 番右のシートを取得
Set ws = Worksheets(Worksheets.Count) ' 1 番右のシートを取得
Debug.Print(ws.Name)

複数のシートを取得

1 番目と 2 番目のシートを取得するには Sheets(Array(1, 2)) または Sheets(Array("Sheet1", "Sheet2")) のように入力します。

Dim sts As Sheets
Set sts = Sheets(Array(1, 2))               ' 1 番目と 2 番目のシートを取得
Set sts = Sheets(Array("Sheet1", "Sheet2")) ' シート「Sheet1」と「Sheet2」を取得

Set sts = Worksheets(Array(1, 2))               ' 1 番目と 2 番目のシートを取得
Set sts = Worksheets(Array("Sheet1", "Sheet2")) ' シート「Sheet1」と「Sheet2」を取得

Dim ws As Variant
For Each ws In sts
    Debug.Print(ws.Name)
Next

引数に配列でインデックスやシート名を指定します。

すべてのシートを取得

Sheets または Worksheets はコレクションになっているので、これをループしてすべてのシートを取得できます。

' Sheets を For Each でループする
Dim ws As Variant
For Each ws In Sheets
    Debug.Print(ws.Name)
Next

' Worksheets を For Next でループする
Dim i As Integer
For i = 1 To Worksheets.Count
    Set ws = Worksheets(i)
    Debug.Print(ws.Name)
Next

アクティブシートを取得する

アクティブシートを取得するには ActiveSheet を入力します。

Dim ws As Worksheet
Set ws = ActiveSheet ' アクティブシートを取得
Debug.Print(ws.Name)

アクティブシートとは、開いているシートのことです。

選択シートを取得

アクティブブックの選択しているシートを取得するには ActiveWindow.SelectedSheets を入力します。複数のシートが選択されているときは、そのすべてのシートを取得します。

Dim ws As Worksheet
Set ws = ActiveWindow.SelectedSheets(1)        ' 選択している 1 番左のシートを取得
Set ws = ActiveWindow.SelectedSheets("Sheet2") ' 選択しているシート「Sheet2」を取得
Debug.Print(ws.Name)

VBA を実行しているブックの選択しているシートを取得するには ThisWorkbook.Windows(1).SelectedSheets を入力します。

' このコードを実行しているブックの選択シートを取得
Dim ws As Worksheet
For Each ws In ThisWorkbook.Windows(1).SelectedSheets
    Debug.Print(ws.Name)
Next

' 開いているブック「Book1.xlsx」の選択シートを取得
For Each ws In Workbooks("Book1.xlsx").Windows(1).SelectedSheets
    Debug.Print(ws.Name)
Next

SelectedSheets のインデックスは、選択している中で 1 番左のシートが 1 です。

ブックの指定について詳しくは下記の「別ブックのシートを取得する」をご覧ください。

別ブックのシートを取得する

ブックを指定しないシートの操作はすべて「アクティブブック」に対して行われます。

  • アクティブブック:開いているすべてのブックの中で一番手前に表示されているブックです。
  • VBA を実行しているブック:実行している VBA のコードがあるブックです。

アクティブブック

ブックを指定しないシートの操作は、アクティブブックを表す ActiveWorkbook. が省略されています。

' どちらも同じコード
Call Sheets.Add
Call ActiveWorkbook.Sheets.Add
ショートカットや VBA の IDE から実行したときに、別ブックがアクティブになっていることがあります。

VBA を実行しているブック

VBA を実行しているブックに対して操作するには ThisWorkbook を入力します。

' VBA を実行しているブックに対して操作
Call ThisWorkbook.Sheets.Add
Call ThisWorkbook.Worksheets.Add

ブックを指定

ブックを指定するには Workbooks の引数にブック名またはインデックスを指定します。

ブック「Book2.xlsx」を指定するには Workbooks("Book2.xlsx") を入力します。

Dim ws As Worksheet
' ブック「Book2.xlsx」のシート「Sheet1」を取得
Set ws = Workbooks("Book2.xlsx").Sheets("Sheet1")
' 2 番目のブックの 2 番目のシートを取得
Set ws = Workbooks(2).Sheets(2)

Debug.Print(ws.Name)

Workbooks のインデックスは、ブックを開いた順番に 1 からスタートします。