ExcelVBA ワークシートを変数に格納して扱うSetで繰返し処理に使う方法

 

ExcelVBA  ワークシートを変数として扱うSetで、繰り返し処理 や コードの可読性向上、実行速度の向上 などのメリットがあります。使い方や注意点など、サンプルコードをもとに具体的に解説します。

 

Excel VBA Setの予備知識

 

よくある質問

命令を普通に書けば問題ないと思うのです。だから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 = "テスト"

 

  1. Worksheets("売上データ")のあだ名(ws)をつける箱を準備(Dim ws As Worksheet)
  2. あだの箱(ws)と正式名称(Worksheets("売上データ"))を対応付けさせる(Set ws = Worksheets("売上データ"))
  3. その後の呼び方は、wsになる

 

Setなし
毎回フルネームで呼ぶ

Worksheets("売上データ") を何度も書く

Setあり

ws = Worksheets("売上データ")

wsだけでOK

 

Setを使う理由
  1.  短くなる
  2.  ミスが減る
  3.  管理しやすい
  4.  読みやすい

 

Excel VBA ワークシートを変数に格納して扱うSET|シーン

以下のシーンで利用します。

  1. 特定のシートを何度も参照する
  2. 複数のシートを操作する
  3. シート名が変更されても影響を受けにくくする
  4. 可読性の高いコードを書く

 

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エキスパートベーシック資格試験から抜粋した問題です)

無料138問でいまの実力をチェック

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エキスパートベーシック資格試験から抜粋した問題です)

無料138問でいまの実力をチェック

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セルに入力

 

Dim ws As Worksheet

wsと呼ぶシートの箱を準備する

 

For Each ws In ThisWorkbook.Sheets
  • 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 & " のデータ")

 

何回動くの?

シートの数だけ

Next wsって何?

次のシートに進む

 

注意点

  1.  Setを忘れない
    •  Set ws = ThisWorkbook.Sheets("Sheet1") の Set を省略すると エラーになる
    •  オブジェクト変数には必ず Set を使う
  2.  シート名の変更に注意
    •  ThisWorkbook.Sheets("Sheet1") の "Sheet1" が変更されると エラーになる
    •  定数を使って管理すると良い
  3.  インデックス指定は慎重に
    •  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ができる人は、特別なコードを書いているわけではなく、
作る順番が違うだけです。まとめたガイドを公開しています。
実務マクロ設計ミニガイド(無料)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━