Worksheet は「1枚のシートそのもの」
まずイメージからいきます。
Worksheet オブジェクト = Excel のシート1枚そのもの です。
Workbook(ブック)が「ファイル1冊」だとしたら、
Worksheet は「その中に入っている1枚のシート」です。
画面下のタブで「集計」「入力」「マスタ」などと名前が付いている、あの1枚1枚が Worksheet に対応します。
VBA では、「どのシートを触るのか」を Worksheet でハッキリさせることが、安定したコードへの第一歩です。
Worksheet を変数として扱う基本パターン
変数宣言と、特定のシートを入れてみる
まずは Worksheet 型の変数を宣言します。
Dim ws As Worksheet
VBそして、ブックの中の特定のシートを入れてみます。
Sub SampleWorksheetBasic()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("集計")
ws.Range("A1").Value = "ここは集計シートです"
End Sub
VBここでの流れは、
ThisWorkbook(このブック)の
Worksheets(“集計”)(「集計」という名前のシート)を
Worksheet 変数 ws に Set している
という構造です。
重要なのは、「どのブックの、どのシートか」を最初に決めて、
そのシートを ws として握ってしまうことです。
そうすると、その後は ws.Range("A1") のように、迷いなく書けるようになります。
インデックス番号で指定する書き方
シートは左から順に 1, 2, 3… という番号も持っています。
Set ws = ThisWorkbook.Worksheets(1) ' 一番左のシート
VBただし、シートの並び順が変わると指すシートも変わってしまうので、
「特定のシートを確実に触りたい」ときは、名前で指定する方が安全です。
Worksheet から Range へ“たどる”感覚を身につける
「どのシートの、どのセルか」を明確に書く
Worksheet を変数に持っていると、そのシート上のセルや範囲に、はっきり道筋をつけてアクセスできます。
Sub SampleWorksheetToRange()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("入力")
ws.Range("A1").Value = "名前"
ws.Range("B1").Value = "点数"
End Sub
VBここでのポイントは、
「Range(“A1”) だけだと“どのシートの A1 か”が曖昧」
「ws.Range(“A1”) と書けば、“入力シートの A1” とハッキリする」
ということです。
超初心者のうちから、
Range(“A1”) ではなく
必ず「どのシートか」を付けて
ws.Range(“A1”) の形で書く
という癖をつけておくと、後で自分をかなり助けてくれます。
Worksheet を使ってシートを操作する基本テクニック
シートをアクティブにする・選択する
Sub SampleWorksheetActivate()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("集計")
ws.Activate
End Sub
VBActivate は「そのシートをアクティブにする」命令です。
画面上でそのシートが前面に出てきます。
ただし、VBA 的には「必ずしも Activate しなくても、変数経由で直接 Range を触れる」ので、
慣れてきたら「選択せずに触る」スタイルに移行していくと、コードがスッキリします。
シート名を取得・変更する
Sub SampleWorksheetName()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(1)
MsgBox "元のシート名: " & ws.Name
ws.Name = "新しい名前"
MsgBox "変更後のシート名: " & ws.Name
End Sub
VBws.Name は「シートタブに表示されている名前」です。
読み取ることも、書き換えることもできます。
Worksheet をループで回して「全シートに同じ処理」をする
For Each で1枚ずつ取り出す
Worksheet は、Worksheets コレクションの中の1要素です。
なので、For Each で全シートを順番に処理できます。
Sub SampleWorksheetLoop()
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
ws.Range("A1").Value = ws.Name
Next ws
End Sub
VBこの例では、「すべてのシートの A1 に、そのシート名を書き込む」処理をしています。
ここで大事なのは、
ThisWorkbook.Worksheets という「集合」から
For Each で Worksheet を1枚ずつ ws に取り出して
同じ処理を繰り返している
という構造を体で覚えることです。
「全シートの同じセルを集計したい」「全シートに同じヘッダーを入れたい」など、
実務でよくあるパターンに直結します。
Worksheet と ActiveSheet の違いをはっきりさせる
ActiveSheet は“今選ばれている1枚”
Sub SampleActiveSheet()
MsgBox "今アクティブなシートは " & ActiveSheet.Name & " です。"
End Sub
VBActiveSheet は「ユーザーが今選んでいるシート」です。
マクロの途中でユーザーが別のシートをクリックしたり、
コードの中で Activate したりすると、指しているシートが変わります。
Worksheet 変数は“自分で決めた1枚をずっと指す”
一方で、Worksheet 変数に Set したシートは、
その変数が生きている間はずっと同じシートを指し続けます。
Sub SampleWorksheetStable()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("集計")
' ここで別のシートをアクティブにしても
ThisWorkbook.Worksheets("入力").Activate
' ws はずっと「集計」シートを指している
ws.Range("A1").Value = "ここは集計シート"
End Sub
VBここが超重要ポイントです。
ActiveSheet に頼ると、
「ユーザーの操作」や「他のコード」によって、
触るシートが勝手に変わってしまうリスクがあります。
Worksheet 変数に握っておけば、
「自分が触りたいシート」を常に確実に触れます。
Worksheet を使うときに意識してほしい重要ポイント
「どのブックの、どのシートか」を常に意識する
いきなり
Range("A1").Value = 1
VBと書くと、
「アクティブなブックの、アクティブなシートの A1」に書き込まれます。
これは一見楽ですが、
ブックやシートが変わった瞬間に、意図しない場所を書き換えてしまう危険があります。
超初心者のうちから、
どのブックか → ThisWorkbook や Workbooks(“名前”)
どのシートか → Worksheets(“名前”)
どのセルか → Range(“A1”)
という順番で、必ず「上からたどる」書き方を意識してほしいです。
変数に入れてから使うと、読みやすさと安全性が一気に上がる
1行で全部書くこともできますが、
あえて分解して書いた方が、自分の頭の中も整理されます。
Dim wb As Workbook
Dim ws As Worksheet
Set wb = Workbooks("売上集計.xlsx")
Set ws = wb.Worksheets("集計")
ws.Range("A1").Value = "OK"
VBこの書き方だと、
どのブックを触っているのか
どのシートを触っているのか
が一目で分かります。
「オブジェクトを変数に入れてから使う」という習慣は、
この先ずっと効いてくる、かなり重要な基礎スキルです。
まとめ:Worksheet は「シート1枚を丸ごと握るためのオブジェクト」
Worksheet の本質は、
「ブックの中のシート1枚を、プログラムから確実に扱うための“単位”」
です。
押さえておきたいポイントをコンパクトにまとめると、
Worksheet = シート1枚、Worksheets = そのブックのシート全部
Worksheets(“名前”) を Worksheet 変数に Set してから使うと、安定して同じシートを触れる
Worksheet から Range へ「ws.Range(“A1”)」のように“上からたどる”書き方が大事
ActiveSheet に頼りすぎず、「どのブックのどのシートか」を常に意識する
