Worksheets は「ブックの中に並んでいる“ワークシートの集合”」
まずイメージからいきます。
1つの Excel ファイル(Workbook)の中には、シートが何枚も入っていますよね。
その「ワークシートたち全部」をまとめて持っているのが Worksheets コレクション です。
Workbook:ファイル1冊
Worksheet:その中のシート1枚
Worksheets:そのブックの中にあるワークシート全部
という関係です。
VBA では、
ThisWorkbook.Worksheets
ActiveWorkbook.Worksheets
VBのように、「どのブックの Worksheets か」を指定して使うのが基本です。
特定のシートを名前や番号で取り出す
名前で指定するのが一番わかりやすい
一番よく使うのは「シート名で指定する」書き方です。
Sub SampleWorksheetsByName()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("集計")
ws.Range("A1").Value = "テスト"
End Sub
VBここでの流れは、
ThisWorkbook(このブック)の
Worksheets(シート全部)の中の
“集計” という名前のシート
を取り出して、ws に入れています。
「どのブックの、どのシートか」をはっきりさせるために、
超初心者のうちは必ず ThisWorkbook や Workbooks("名前") からたどる書き方を意識してほしいです。
インデックス番号(1, 2, 3…)で指定する
シートは左から順に 1, 2, 3… という番号も持っています。
Sub SampleWorksheetsByIndex()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(1) ' 一番左のシート
ws.Range("A1").Value = "一番左のシートです"
End Sub
VBただし、シートの並び順が変わると指しているシートも変わってしまうので、
「固定のシートを触りたい」ときは、基本的には名前指定の方が安全です。
Worksheets.Add / Worksheets.Count で「シートを増やす・数える」
新しいシートを追加する
新しいシートを追加したいときは、Worksheets.Add を使います。
Sub SampleWorksheetsAdd()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets.Add
ws.Name = "新しいシート"
ws.Range("A1").Value = "追加されたシートです"
End Sub
VBWorksheets.Add の戻り値は「追加されたばかりの Worksheet」なので、
それを ws に受け取ってから名前を付けたり、セルに値を入れたりします。
どの位置に追加するか(先頭・末尾など)を細かく指定することもできますが、
超初心者のうちは「とりあえず Add で1枚増える」と覚えておけば十分です。
シートの枚数を数える(Count)
Sub SampleWorksheetsCount()
Dim n As Long
n = ThisWorkbook.Worksheets.Count
MsgBox "このブックには " & n & " 枚のシートがあります。"
End Sub
VBWorksheets.Count は、そのブックに何枚シートがあるかを返します。
ループ処理を書くときの基礎になります。
すべてのシートに対して同じ処理をする(For Each)
全シートを順番に回して処理する
Worksheets は「コレクション(集合)」なので、For Each で1枚ずつ取り出せます。
Sub SampleWorksheetsLoop()
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 で 1枚ずつ ws に取り出して
同じ処理を繰り返している
という構造です。
「全シートに同じ書式を設定したい」「全シートの同じセルを集計したい」など、
実務でよくあるパターンに直結します。
Worksheets と ActiveSheet の違いを整理する
Worksheets は“全部”、ActiveSheet は“今選ばれている1枚”
ここで一度、よく混ざる2つを整理します。
ThisWorkbook.Worksheets ' このブックのシート全部
ActiveSheet ' 今アクティブなシート1枚
VB例えば、
Sub SampleActiveSheet()
MsgBox "今アクティブなシートは " & ActiveSheet.Name & " です。"
End Sub
VBActiveSheet は「ユーザーが今選んでいるシート」です。
マクロの途中でアクティブシートが変わると、指しているシートも変わります。
一方で、
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("集計")
VBのように変数に入れてしまえば、
その後はアクティブシートが変わっても、ws はずっと「集計」シートを指し続けます。
超重要なのは、
「ActiveSheet に頼りすぎると、ユーザーの操作に振り回される」
「Worksheets(“名前”) を変数に握っておくと、安定して同じシートを触れる」
ということです。
Worksheets を使うときに意識してほしい重要ポイント
「どのブックの Worksheets か」を必ず書く癖をつける
いきなり
Worksheets("集計").Range("A1").Value = 1
VBと書くこともできますが、
これは「アクティブなブックの Worksheets」を暗黙に使っています。
マクロ用ブックとデータブックが別になってくると、
「どのブックのシートを触っているのか」が分からなくなり、バグの元になります。
超初心者のうちから、
ThisWorkbook.Worksheets("集計")
Workbooks("売上集計.xlsx").Worksheets("集計")
VBのように、「どのブックか」を明示して書く癖をつけておくと、後で自分を助けてくれます。
変数に入れてから使うと、読みやすさと安全性が上がる
1行で全部書くよりも、あえて分解して書いた方が、
「自分が何をしているのか」がはっきり見えます。
Dim wb As Workbook
Dim ws As Worksheet
Set wb = Workbooks("売上集計.xlsx")
Set ws = wb.Worksheets("集計")
ws.Range("A1").Value = "OK"
VBこの書き方だと、
どのブックを触っているのか
どのシートを触っているのか
が一目で分かります。
オブジェクトを変数に入れてから使う、という習慣は、
この先ずっと効いてくる大事な基礎スキルです。
まとめ:Worksheets は「ブックの中のシートたちへの入口」
Worksheets の本質は、
「1つのブックの中にある、すべてのワークシートをまとめた“集合オブジェクト”」
です。
押さえておきたいポイントをコンパクトにまとめると、
Workbook の中に Worksheets があり、その中の1枚が Worksheet
Worksheets(“名前”) で特定のシートを取り出し、変数に Set してから使うと安全
Worksheets.Add で新しいシートを追加、Worksheets.Count で枚数を取得
For Each で「全シートに同じ処理」を書ける
ActiveSheet に頼りすぎず、「どのブックのどのシートか」を常に意識する
