VBAのオブジェクト変数とは、シート・セル範囲・ブックなど「Excelの中のモノ」を一時的に格納しておく変数です。Dim ws As Worksheet と宣言し、Set ws = Worksheets("集計") で代入することで、長いパスを何度も書かずに済み、コードが短くなり修正も1か所で完結します。
この記事では、次の内容を順番に解説します。
- オブジェクト変数の宣言・代入・使い方の基本
- よく使うオブジェクト変数の型一覧
- With構文との組み合わせ方
- For Eachループでのオブジェクト変数の使い方
オブジェクト変数の基本的な使い方を知るには?
オブジェクト変数は「宣言 → Setで代入 → プロパティ・メソッドを使う」という3ステップで使います。
Sub ObjectVarBasic()
'宣言(Worksheet型の変数wsを用意する)
Dim ws As Worksheet
'代入(Setを使って「集計」シートをwsに格納する)
Set ws = ThisWorkbook.Worksheets("集計")
'使う(wsを通じてシートを操作する)
ws.Range("A1").Value = "売上高"
ws.Range("B1").Value = "金額"
ws.Range("A1:B1").Font.Bold = True
End Sub
通常の変数と何が違うかを比較します。
| 種類 | 宣言 | 代入 | 例 |
|---|---|---|---|
| 通常の変数(値) | Dim i As Long | = で代入 | i = 10 |
| オブジェクト変数 | Dim ws As Worksheet | Set で代入 | Set ws = Worksheets("集計") |
よく使うオブジェクト変数の型を知るには?
VBAでよく使うオブジェクト変数の型とSetの書き方をまとめます。
| 型 | 意味 | 代入の例 |
|---|---|---|
Worksheet | シート1枚 | Set ws = Worksheets("データ") |
Workbook | ブック1冊 | Set wb = Workbooks.Open("C:¥ファイル.xlsx") |
Range | セルまたはセル範囲 | Set rng = ws.Range("A1:A100") |
Cell(Range) | 1つのセル | Set cell = ws.Cells(i, 1) |
Sub MultipleObjects()
Dim wb As Workbook
Dim ws As Worksheet
Dim rng As Range
Set wb = ThisWorkbook
Set ws = wb.Worksheets("売上")
Set rng = ws.Range("B2:B100")
'合計をC1に書き込む
ws.Range("C1").Value = WorksheetFunction.Sum(rng)
End Sub
Withと組み合わせてさらにスッキリ書くには?
オブジェクト変数と With 構文を組み合わせると、同じオブジェクトへの操作をまとめて書けてさらに読みやすくなります。
'オブジェクト変数だけの場合
Sub WithoutWith()
Dim ws As Worksheet
Set ws = Worksheets("レポート")
ws.Range("A1").Value = "売上高"
ws.Range("A1").Font.Bold = True
ws.Range("A1").Font.Size = 14
ws.Range("A1").Interior.Color = RGB(68, 114, 196)
ws.Range("A1").Font.Color = RGB(255, 255, 255)
End Sub
'WithとオブジェクトVariable変数を組み合わせた場合
Sub WithWithStatement()
Dim ws As Worksheet
Set ws = Worksheets("レポート")
With ws.Range("A1")
.Value = "売上高"
.Font.Bold = True
.Font.Size = 14
.Interior.Color = RGB(68, 114, 196)
.Font.Color = RGB(255, 255, 255)
End With
End Sub
For Eachループでオブジェクト変数を使うには?
複数のシートやセルをループで処理するときも、オブジェクト変数を使うのが基本です。For Each ws In Worksheets のように書くと、ブック内の全シートを順番に処理できます。
'全シートのA1セルに同じ値を書き込む例
Sub LoopAllSheets()
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
ws.Range("A1").Value = "更新済み"
Next ws
End Sub
'特定のセル範囲の各セルをループする例
Sub LoopCells()
Dim ws As Worksheet
Dim cell As Range
Set ws = Worksheets("データ")
For Each cell In ws.Range("A2:A100")
If cell.Value = "" Then Exit For '空欄になったら終了
If cell.Value < 0 Then
cell.Font.Color = RGB(255, 0, 0) 'マイナス値を赤字に
End If
Next cell
End Sub
まとめ
- オブジェクト変数は
Dim ws As Worksheetと宣言し、Set ws = Worksheets("〇〇")で代入する - 通常の変数との違いは代入に
Setが必要なこと。Setを忘れるとエラー424が発生する - 同じシートやセル範囲を何度も使う処理では変数にまとめることでコードが短くなり修正が1か所で済む
With構文と組み合わせると同じオブジェクトへの複数操作をさらにスッキリ書けるFor Eachでループするとき、ループ変数にもオブジェクト型を使うのが基本
よくある質問
オブジェクト変数の型を間違えるとどうなりますか?
型の不一致エラー(実行時エラー13)が発生します。例えば Dim ws As Worksheet と宣言した変数に Set ws = Workbooks("test.xlsx") のようにWorkbook型を代入しようとするとエラーになります。型を確認して正しい型で宣言してください。
型がわからないときはどうすればいいですか?
Dim obj As Object で汎用のObject型として宣言すると、どのオブジェクトでも代入できます。ただし型チェックが働かないため、できるだけ具体的な型(Worksheet・Range など)を使うのが安全です。型が不明なときは TypeName(変数名) で確認できます。
ActiveSheetをオブジェクト変数に入れることはできますか?
できます。Set ws = ActiveSheet と書くと、実行時点でアクティブになっているシートが変数に格納されます。ただし処理の途中でアクティブシートが変わる場合は意図しない動作になるため、Worksheets("シート名") で明示的に指定する方が安全です。
同じシートを何度も使う処理で、毎回 Worksheets(“名前”) と書くのはダメですか?
動作はしますが、シート名を変更したときに修正箇所が増えてミスの原因になります。オブジェクト変数に Set ws = Worksheets("売上") と1回だけ代入しておけば、以降は ws だけで参照でき、シート名を変えるときも1行直すだけで済みます。コードが長くなるほどこの差が大きくなるため、同じシートを3回以上使う処理ではオブジェクト変数にまとめることをおすすめします。
プロシージャが終わったらオブジェクト変数は自動で解放されますか?
はい、プロシージャが終わると変数は自動的に解放されます。明示的に解放したい場合は Set ws = Nothing と書きます。大量のオブジェクトをループ処理するときや、長時間動くマクロではNothingで解放するとメモリの無駄遣いを防げます。
動画で学びたい方へ
「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。
VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。



