VBAでシートを指定するには、「シート名」「インデックス番号」「コード名」の3つの方法があります。基本的にはシート名で指定するのが一番わかりやすく、初心者にはおすすめです。
この記事では、次の内容を順番に解説します。
- シート名で指定する方法
- インデックス番号で指定する方法
- コード名で指定する方法
- 3つの使い分けの考え方
なぜシートの指定が必要なのか?
1つのシートだけで作業するマクロなら、特にシートを指定しなくても動きます。しかし、複数のシートをまたいで処理する場合は、「どのシートのセルか」を明確にする必要があります。
' シートを指定しない場合(今選択しているシートのA1)
Cells(1, 1).Value = "Hello"
' シートを指定した場合(「一覧」シートのA1)
Sheets("一覧").Cells(1, 1).Value = "Hello"
シートを指定しないと、マクロ実行時にどのシートを開いているかによって結果が変わってしまいます。複数シートを扱うマクロでは、必ずシートを指定しましょう。
シート名で指定するには?
最も一般的でわかりやすい方法です。シートのタブに表示されている名前をそのまま使います。
' 「一覧」シートを選択する
Sheets("一覧").Select
' 「一覧」シートのA1に値を入れる
Sheets("一覧").Cells(1, 1).Value = "Hello"
メリット:シート名がそのままコードに書かれるので、何を操作しているか一目でわかります。
デメリット:シート名を変更すると動作しなくなります。シート名を変えたらコードも修正が必要です。
インデックス番号で指定するには?
ブック内で左から何番目のシートかを番号で指定します。
' 左から1番目のシートを選択する
Sheets(1).Select
' 左から2番目のシートのA1に値を入れる
Sheets(2).Cells(1, 1).Value = "Hello"
メリット:シート名がわからなくても順番で指定できます。全シートをループ処理するときに便利です。
デメリット:シートの追加・削除・並び替えで番号がずれるリスクがあります。
注意点として、シート名が数字の場合は "" で囲む必要があります。
Sheets(1) ' 左から1番目のシート
Sheets("1") ' シート名が「1」のシート(別物)
コード名で指定するには?
VBE(Visual Basic Editor)内でシートに割り当てられているオブジェクト名で指定します。デフォルトでは「Sheet1」「Sheet2」などの名前がついています。
' コード名で指定する
Sheet1.Select
' コード名でA1に値を入れる
Sheet1.Cells(1, 1).Value = "Hello"
メリット:シート名を変更しても、シートの順番を変えても影響を受けません。最も安定した指定方法です。
デメリット:コード名はVBEを開かないと確認できないため、初心者には少しわかりにくいです。
3つの指定方法をどう使い分ける?
おすすめは、基本的にはシート名で指定し、必要に応じて他の方法を組み合わせることです。
- シート名:普段使いに最適。コードが読みやすい。
- インデックス番号:全シートをループ処理するときに使う。
- コード名:シート名や順番が変わる可能性があるときに使う。
また、同じシートに対して複数の操作をする場合は、With を使うとコードがすっきりします。
Sub WithExample()
With Sheets("一覧")
.Cells(1, 1).Value = "Hello"
.Cells(1, 1).Interior.Color = RGB(255, 0, 0)
End With
End Sub
まとめ
- シート名で指定:
Sheets("一覧").Select— 一番わかりやすい。シート名変更時はコード修正が必要。 - インデックス番号で指定:
Sheets(1).Select— ループ処理に便利。シートの順番変更に注意。 - コード名で指定:
Sheet1.Select— 最も安定。VBEでの確認が必要。 - おすすめ:基本はシート名で指定し、必要に応じて使い分ける。
よくある質問
SheetsとWorkSheetsの違いは?
WorkSheets はワークシートだけを対象にします。Sheets はワークシートに加えてグラフシートなども含みます。通常のExcel作業ではどちらを使っても結果は同じですが、厳密にはワークシートだけを扱う場合は WorkSheets が正確です。
存在しないシート名を指定するとどうなる?
「インデックスが有効範囲にありません」というエラーが発生します。シート名を変数で指定する場合は、事前にそのシートが存在するかチェックしてからアクセスすると安全です。
コード名はどこで確認できる?
VBE(Alt+F11で開く)の左側にある「プロジェクトエクスプローラー」で確認できます。「Sheet1(一覧)」のように表示されていて、カッコの外がコード名、カッコの中がシート名です。
全シートに対して同じ処理をしたい場合は?
For Each を使うと、すべてのシートに対してループ処理ができます。For Each ws In Sheets と書いて、ws の中で各シートを操作します。
シートを指定せずにCells(1,1)と書くとどうなる?
その時点で選択されている(アクティブな)シートのA1セルが対象になります。1つのシートだけを操作するマクロなら問題ありませんが、複数シートを扱う場合は意図しないシートが操作される原因になるので、必ずシートを指定しましょう。
動画で学びたい方へ
「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。
VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。



