
ExcelVBA ワークシートを変数として扱うSetで、繰り返し処理 や コードの可読性向上、実行速度の向上 などのメリットがあります。使い方や注意点など、サンプルコードをもとに具体的に解説します。
Excel VBA Setの予備知識
よくある質問
確かに、その通りです。しかし、Setを使うと便利になるのです。この↓に、その理由をたとえで説明します。
Setを使う理由
Setは「シートにあだ名(変数名)をつける」ための命令です。
たとえば、人にあだ名をつける。
あなたの職場にこんな人がいるとします。営業部 東京本社 第1営業課 山田太郎さん
毎回フルネームで呼ぶ場合は、
営業部 東京本社 第1営業課 山田太郎さん、これ見てください。
営業部 東京本社 第1営業課 山田太郎さん、これもお願いします。
これ、長くて面倒で、ミスりますね。
この問題を解消するため、あだ名をつけます。
営業部 東京本社 第1営業課 山田太郎さんは、山さんと呼ぼう。
山さん = 営業部 東京本社 第1営業課 山田太郎さん
あだ名をつけると、その後の呼び方は、
山さん、これ見てください
山さん、これもお願いします
これで、短い簡単なのでミスらない。わかりやすいですね。
人にあだ名をつけるですが、これはExcelVBAで同じことが起きています。
あだ名をつけない(Setなし)場合
Worksheets("売上データ").Cells(1, 1).Value = "テスト"
Worksheets("売上データ").Cells(2, 1).Value = "テスト"
Worksheets("売上データ").Cells(3, 1).Value = "テスト"
あだ名をつける(Setあり)場合
Dim ws As Worksheet
Set ws = Worksheets("売上データ")
ws.Cells(1, 1).Value = "テスト"
ws.Cells(2, 1).Value = "テスト"
ws.Cells(3, 1).Value = "テスト"
- Worksheets("売上データ")のあだ名(ws)をつける箱を準備(Dim ws As Worksheet)
- あだの箱(ws)と正式名称(Worksheets("売上データ"))を対応付けさせる(Set ws = Worksheets("売上データ"))
- その後の呼び方は、wsになる
Setなし
毎回フルネームで呼ぶ
↓
Worksheets("売上データ") を何度も書く
Setあり
↓
ws = Worksheets("売上データ")
↓
wsだけでOK
- 短くなる
- ミスが減る
- 管理しやすい
- 読みやすい
Excel VBA ワークシートを変数に格納して扱うSET|シーン
以下のシーンで利用します。
- 特定のシートを何度も参照する
- 複数のシートを操作する
- シート名が変更されても影響を受けにくくする
- 可読性の高いコードを書く
Excel VBA Setのサンプルコード
ワークシートを変数に格納する方法
標準モジュール
Option Explicit
Sub シートを変数に設定()
Dim ws As Worksheet
' "Sheet1" を変数 ws に格納
Set ws = ThisWorkbook.Sheets("Sheet1")
' A1セルに値を入力
ws.Range("A1").Value = "Hello, VBA!"
End Sub
自分の実力を客観的にチェックしたい…。そんな方のために、自分に合った学習スタート地点がわかる無料の選択問題集をご用意しました。(VBAエキスパートベーシック資格試験から抜粋した問題です)
80%ならスタンダード合格レベル、50〜79%はベーシック理解途中、49%以下は基礎理解不足 (※ご安心ください。この問題をされた人の情報は一切残りません。実力のチェックができる問題集で、クリックすぐにスタートではありません。解説内容の下に問題があります)
- Dim ws As Worksheet でワークシート型の変数 ws を宣言
- Set ws = ThisWorkbook.Sheets("Sheet1") ` で "Sheet1" を ws に代入
- ws.Range("A1").Value = "Hello, VBA!" でA1セルに値を設定
シートのインデックスで変数に格納
標準モジュール
Option Explicit
Sub インデックスでシート指定()
Dim ws As Worksheet
' 左から1番目のシートを指定
Set ws = ThisWorkbook.Sheets(1)
' A1セルに値を入力
ws.Range("A1").Value = "1番目のシート"
End Sub
・ シートの並び順が変わると 異なるシートを参照するリスクがあるので、インデックス指定はしない。
複数のシートを変数に格納
標準モジュール
Option Explicit
Sub 複数のシートを変数に格納()
Dim ws1 As Worksheet, ws2 As Worksheet
' Sheet1とSheet2を変数に格納
Set ws1 = ThisWorkbook.Sheets("Sheet1")
Set ws2 = ThisWorkbook.Sheets("Sheet2")
' Sheet1のA1セルに"データ1"を入力
ws1.Range("A1").Value = "データ1"
' Sheet2のB1セルに"データ2"を入力
ws2.Range("B1").Value = "データ2"
End Sub
- 複数のシートを指定 することで、可読性が向上
- ws1.Range("A1").Value で `"Sheet1"` のセルに直接アクセス可能
自分の実力を客観的にチェックしたい…。そんな方のために、自分に合った学習スタート地点がわかる無料の選択問題集をご用意しました。(VBAエキスパートベーシック資格試験から抜粋した問題です)
80%ならスタンダード合格レベル、50〜79%はベーシック理解途中、49%以下は基礎理解不足 (※ご安心ください。この問題をされた人の情報は一切残りません。実力のチェックができる問題集で、クリックすぐにスタートではありません。解説内容の下に問題があります)
ループを使って複数シートを操作
標準モジュール
Option Explicit
Sub すべてのシートにタイトルを入力()
Dim ws As Worksheet
' ワークブック内の全シートをループ
For Each ws In ThisWorkbook.Sheets
ws.Range("A1").Value = ws.Name & " のデータ"
Next ws
End Sub
- For Each ws In ThisWorkbook.Sheets で 全シートをループ
- ws.Name を使って 各シート名を取得し、A1セルに入力
wsと呼ぶシートの箱を準備する
- For Each
- 1つずつ順番に取り出す
- ws
- 取り出したシートを入れる箱(ws)
- ThisWorkbook.Sheets
- このExcelにある全部のシート
→このExcelの全シートを1枚ずつ取り出してwsに入れて処理する
Sheets(全部)
↓
[Sheet1] → wsに入る → 処理(ws.Range("A1").Value = ws.Name & " のデータ")
[Sheet2] → wsに入る → 処理(ws.Range("A1").Value = ws.Name & " のデータ")
[Sheet3] → wsに入る → 処理(ws.Range("A1").Value = ws.Name & " のデータ")
シートの数だけ
次のシートに進む
注意点
- Setを忘れない
- Set ws = ThisWorkbook.Sheets("Sheet1") の Set を省略すると エラーになる
- オブジェクト変数には必ず Set を使う
- シート名の変更に注意
- ThisWorkbook.Sheets("Sheet1") の "Sheet1" が変更されると エラーになる
- 定数を使って管理すると良い
- インデックス指定は慎重に
- ThisWorkbook.Sheets(1) は 並び順が変わると異なるシートを指す ので注意
Excel VBAワークシートを変数に格納して扱う|まとめ
| 方法 | 使い方 | 特徴 |
| シート名で指定 | Set ws = ThisWorkbook.Sheets("Sheet1") | 確実に指定できる |
| インデックスで指定 | Set ws = ThisWorkbook.Sheets(1) | 並び順が変わると別のシートになる |
| 複数シートを変数に格納 | Set ws1 = ThisWorkbook.Sheets("Sheet1") | 異なるシートを効率的に管理 |
| For Eachでループ処理 | For Each ws In ThisWorkbook.Sheets | すべてのシートを処理可能 |
ワークシートを変数に格納すると、コードの可読性や実行速度が向上 するので、積極的に活用しましょう。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
すでに気づいている人もいるかもしれません。
VBAができる人は、特別なコードを書いているわけではなく、
作る順番が違うだけです。まとめたガイドを公開しています。
▶ 実務マクロ設計ミニガイド(無料)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━