Excel VBA の「オブジェクト」と「コレクション」を、初心者向けにやさしく
初めてだと「オブジェクトって何?」からつまずきがち。ここでは、身近なたとえと小さな例題で、手を動かしながら理解できるように説明します。
オブジェクトとは何か
- ざっくり定義:
オブジェクト: Excelの中の「もの」そのもの。たとえば「ブック」「シート」「セルの範囲」など。 - たとえ:
Excelを「家」に例えると…- Application: 大家さん(Excelそのもの)
- Workbook: 家(ブック)
- Worksheet: 部屋(シート)
- Range: 机の上のスペース(セル範囲)
- 操作の仕方:
メソッド: オブジェクトに「やってもらう動作」(掃除する、コピーする)
プロパティ: オブジェクトの「見た目や状態」(色、値、サイズ)
まずはセルを触ってみる(最小の例)
例題1: A1 に「こんにちは」を書く
Sub WriteHello()
Worksheets(1).Range("A1").Value = "こんにちは"
End Sub
VB- ポイント:
- Worksheets(1): 左から1番目のシート
- Range(“A1”): A1セル
- Value プロパティ: セルの中身を設定
例題2: A1 を消す(クリア)
Sub ClearA1()
Worksheets(1).Range("A1").Clear
End Sub
VB- ポイント:
- Clear メソッド: セルの内容・書式をまとめて消す
コレクションってなに?
- ざっくり定義:
コレクション: 同じ種類のオブジェクトをまとめた「グループ」。
例: Worksheets(そのブック内の全シート)、Workbooks(開いている全ブック) - 指定のしかたは2通り:
- 番号で指定:
Worksheets(1)→ 一番左のシート - 名前で指定:
Worksheets("売上")→ シート名「売上」
- 番号で指定:
- 初心者あるある対策:
シート名は目視と完全一致が必要。全角・半角・スペースに注意。
例題3: 「売上」シートのB2に数値を入れる
Sub WriteToSalesSheet()
Worksheets("売上").Range("B2").Value = 12345
End Sub
VB- ポイント:
- シート名が存在しないとエラーになる(まずは作ってから実行)
オブジェクトは階層でつながっている
- 階層イメージ:
Application(Excel全体) └─ Workbooks(複数のブック) └─ Worksheets(複数のシート) └─ Range(セルや範囲) └─ Font(文字の見た目) - 短縮形:
多くの場合「今アクティブなブック・シート」を前提に省略できます(ただし、慣れるまでは明示指定が安全)。
例題4: 2番目のシートのA2を大きく太字に
Sub StyleA2()
Worksheets(2).Range("A2").Value = "見出し"
With Worksheets(2).Range("A2").Font
.Bold = True
.Size = 20
.Color = RGB(0, 102, 204) ' 少し落ち着いた青
End With
End Sub
VB- ポイント:
- With ~ End With: 同じオブジェクトの設定をまとめて書ける
よく使うメソッドとプロパティ(まずはこれだけ)
- メソッド(動作)
- Clear: 内容と書式を消す
- Copy / PasteSpecial: コピーと貼り付け
- Select: 選択(初心者はよく使うが、慣れたら非推奨。直接Rangeに操作するほうが速く安定)
- プロパティ(状態)
- Value: セルの中身
- Formula: 公式(例
"=SUM(A1:A10)") - Interior.Color: 背景色
- Font.Size / Font.Bold / Font.Color: 文字の見た目
- NumberFormat: 表示形式(例
"#,##0"、"yyyy/mm/dd")
例題5: 合計を自動で入れて書式も整える
Sub SumAndFormat()
With Worksheets(1)
.Range("B1:B10").Value = 10 ' B1~B10にまとめて 10 を入れる
.Range("B11").Formula = "=SUM(B1:B10)" ' 合計
.Range("B11").NumberFormat = "#,##0" ' カンマ区切り
.Range("B11").Interior.Color = RGB(255, 255, 204) ' 薄い黄色
.Range("B11").Font.Bold = True
End With
End Sub
VB- ポイント:
範囲指定はまとめて操作できる。表示形式と色は見やすさに直結。
コレクションを回す(複数に同じことをする)
例題6: 全シートのA1に日付を入れる
Sub SetDateToAllSheets()
Dim ws As Worksheet
For Each ws In Worksheets
ws.Range("A1").Value = Date ' 今日の日付
ws.Range("A1").NumberFormat = "yyyy/mm/dd"
Next ws
End Sub
VB- ポイント:
- For Each: コレクション(Worksheets)を1つずつ順番に処理
- 失敗しづらい基本形。覚えると一気に楽になる。
よくあるつまずきと回避策
- シートやブックの特定ミス:
- 対策: できるだけ「名前」で指定する。外部ファイルならフルパスで開いて、その戻り値を変数に入れて扱う。
- Select や Activate に頼りすぎ:
- 対策: 直接オブジェクトを指定して操作(
Worksheets("売上").Range("B2").Value = ...)
- 対策: 直接オブジェクトを指定して操作(
- 実行対象のブックが違う:
- 対策: 明示的にブックを掴む。
Sub SafeWorkbookAccess() Dim wb As Workbook Set wb = Workbooks("売上管理.xlsx") wb.Worksheets("2025").Range("A1").Value = "OK" End Sub
- 対策: 明示的にブックを掴む。
練習課題
- 課題1: 書式整え
- 目標: シート1のC1~C10に1~10を入れ、合計をC11に出し、C11を太字・薄緑に。
- ヒント:
For i=1 To 10とFormula、Interior.Color
- 課題2: 複数シートに同じ見出し
- 目標: すべてのシートのA1に「月次レポート」と青太字20pt。
- ヒント:
For Each ws In WorksheetsとFontプロパティ
- 課題3: 名前でセル範囲を扱う
- 目標: シート「集計」の範囲「Data」(名前定義済み)に一括で「OK」を入力。
- ヒント:
Range("Data")は名前付き範囲にアクセスできる
まとめの一言
- 核となる考え: 「どのオブジェクトに、何のメソッド(動作)・プロパティ(状態)を使うか」を明確にするだけ。
- 最初の一歩: RangeのValue、Font、Interior、NumberFormatを自在に操れるようになると、急に楽になります。
- 次のステップ: ループ(For Each)、With構文、名前指定で「頑丈なコード」に。
