VBAのオブジェクト変数の使い方|Worksheet・Range・Workbook의宣言・Set代入・For Eachループ

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 WorksheetSet で代入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が初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。

動画で学ぶExcelマクロ|JIMOVEオンラインスクール

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール