Loading
  • LIGHT

  • DARK

ROUTE

ルートゼロの
アクティビティ

VBA RangeとCellsの使い分け判断マップ|配列で50ms高速化

1

VBAのRangeとCells使い分け完全ガイド|基本から高速化、エラー’1004’対策まで

導入

VBAでForループを使ってセルを一つずつ更新したら、処理が遅すぎてExcelが固まってしまった…
RangeとCells、結局どっちを使えばいいのか分からず、コードがぐちゃぐちゃ…」 「ネットで見つけたコードを試すと、決まって『実行時エラー ‘1004’』が出て先に進めない…

こうした悩み、私たち現場のエンジニアなら一度は体験しています。
「焦った」「ハマった」とき、何が起きているのか――その“モヤモヤ”を一緒に解消しましょう。

この記事ではセルの扱い、特にRangeCellsの特性を「現場感覚」で徹底解説します。

(VBA配列の高速化やエラー対策については『VBA配列の使い方完全ガイド|高速化の仕組みとエラー対策まで』もご参照ください)

  • なぜセルへの直接アクセスが遅いのか(原因を“見える化”)
  • Range×配列で劇的に高速化する方法(理由も腹落ち)
  • エラー’1004’の完全攻略法(よくあるミスを再現付きで)

豊富なサンプルコードで“コピペしてすぐ動かせる”レベルまで分解。
今日から実装に自信が持てるようになります。


結論ファースト!RangeとCellsの使い分けマップ

まず結論から――「どっちをどう使う?」に即答します。

基本はCells、範囲指定はRange、高速化の鬼は『Range × 配列』。

やりたいこと 推奨 理由
1つのセルを変数(ループ等)で動的に扱いたい Cells 行・列を数値指定でき、ループ変数と相性が抜群
特定のセルや決まった範囲を固定で指定したい Range “A1”など見た目が分かりやすい
大量のセルを高速に読み書きしたい Range × 配列 Excelとの通信回数を減らせて劇的に高速化

この判断マップを“腹に落として”おけば、迷いません。


1. CellsとRangeの基本構文と違い

Cellsプロパティ(行・列番号で動的指定)

例えば、ループ処理でセルに連番を書き込みたい時に便利です。

用語解説:Cells
Excelシート上のセルを「行番号・列番号」で動的に指定できるVBAのプロパティ。ループ処理や変数と組み合わせて柔軟にセル操作が可能。

' 3行目・2列目(B3セル)に "Hello" を入力
Cells(3, 2).Value = "Hello"

' B列1行目〜5行目に連番を入力
For i = 1 To 5
    Cells(i, 2).Value = i
Next i

ポイント:行・列番号を直接使うことで“変数”との親和性が高く、シンプルに書けます。


Rangeプロパティ(A1記法・複数セルもOK)

' A1セルに"Apple"を入力
Range("A1").Value = "Apple"

' A1:C5の範囲を黄色に
Range("A1:C5").Interior.Color = vbYellow

' Cellsと組み合わせて動的範囲も指定可能
Range(Cells(1, "A"), Cells(10, "C")).Font.Bold = True

強み:

  • どのセルか直感的に分かる
  • 複数範囲や名前付き範囲も簡単に指定できる

用語解説:Range
Excelのセルやセル範囲を「A1」などのアドレス表記や名前で指定できるVBAのプロパティ。複数セルや範囲指定、名前付き範囲にも対応。

用語解説:A1記法
Excelでセルや範囲を「A1」「B2:C5」などの文字列で表す方法。直感的に位置が分かるのが特徴。


メリット・デメリット比較表

プロパティ メリット デメリット
Cells 行・列を数値で指定できループ処理に最適 列番号(26等)が直感的に分かりにくい
Range A1記法で直感的・複数範囲・名前付き範囲対応可 ループと組み合わせると記述がやや煩雑になる

2. なぜVBAは遅い?Range×配列が高速な「本当の理由」

原因:ExcelとVBAの「通信回数」

私たちが陥りがちな罠――「1セルずつアクセスする」=“1万回通信”で爆遅!

NG例:激遅ループ

Sub SlowDataAccess()
    For i = 1 To 10000
        Worksheets("Sheet1").Cells(i, 1).Value = i
    Next i
End Sub

→ 毎回VBA→Excel間で通信。1万回アクセス=“待ち時間”地獄。

用語解説:配列
複数の値(データ)をまとめて格納できるデータ構造。VBAではRangeの値を一括で読み書きする際に使うと高速化できる。

用語解説:通信回数
VBA(プログラム)とExcel(アプリ本体)がデータをやり取りする回数。1セルずつ操作すると通信が多くなり遅くなる。


OK例:配列×Rangeで2回通信だけ

Sub FastDataAccess()
    Dim dataArr As Variant
    dataArr = Worksheets("Sheet1").Range("A1:A10000").Value ' 読み込み1回
    For i = 1 To 10000
        dataArr(i, 1) = i
    Next i
    Worksheets("Sheet1").Range("A1:A10000").Value = dataArr ' 書き戻し1回
End Sub

比較:

  • Cellsループ:約5,000ミリ秒
  • Range×配列:約50ミリ秒(100倍以上の高速化!

結論:大量データは「配列→Rangeで一括処理」が絶対正義。

(Excelマクロの現場実践や未経験者向けの基礎は『SES現場でVBAできますか?未経験向けExcelマクロ実践術』をご参照ください)


3. 実行時エラー’1004’の完全攻略ガイド

(VBAでよくある日付変換やFormat関数のエラー対策は『VBA日付文字列変換を完全理解|Format・CDateとエラー回避の原理』もご参照ください)

VBA初心者が必ずぶつかる「実行時エラー ‘1004’」。実は、よくある3つのパターンに集約できます。

用語解説:実行時エラー ‘1004’
VBAでよく発生するエラーの一つ。存在しないセルや範囲、シート指定ミスなどで発生しやすい。エラー内容を確認し、原因を特定することが重要。


1. シートの指定漏れ(最頻出)

' NG例:アクティブなシート以外だとエラー
Range("A1").Value = 100

' OK例:シートを明記
Worksheets("Sheet1").Range("A1").Value = 100

' ベスト:変数化
Dim ws As Worksheet
Set ws = Worksheets("Sheet1")
ws.Range("A1").Value = 100

コツ:With文を使うと複数行まとめて明示できます。

用語解説:Worksheets
Excelブック内の各シートを参照・操作するためのVBAオブジェクト。シート名で明示的に指定することで、意図しないシート操作ミスを防げる。

用語解説:With文
複数行にわたって同じオブジェクト(例:ws)を繰り返し操作する際に使うVBAの構文。コードの簡潔化とミス防止に役立つ。


2. Range名のミス or 存在しない範囲

' 打ち間違いや範囲未定義だとエラー
Range("AA1")  '→本当は"A1"だった

対策:定数や変数化でヒューマンエラーを防止。


3. 結合セルへの誤アクセス

' A1:B1が結合されている場合
Range("B1").Value = "Error" '→エラー

' 対策
Range("B1").MergeArea.Cells(1, 1).Value = "OK"

鉄則:結合セルは「左上セル」をターゲット。

用語解説:MergeArea
結合セル範囲全体を表すVBAのプロパティ。MergeArea.Cells(1,1)で結合範囲の左上セルを取得できる。


4. よくある質問(FAQ)

  • Q1. ValueValue2、どちらが速い?
    A1. パフォーマンス優先ならValue2
    Valueは日付・通貨の変換を含むため遅く、Value2は生データで高速。

    用語解説:Value / Value2
    Valueはセルの値を取得・設定する標準プロパティ。Value2は日付や通貨の自動変換を行わず、より高速に値を扱える。

  • Q2. 飛び飛びの範囲も選択できる?
    A2. UnionメソッドでOK。

    Union(Range("A1"), Range("C3")).Select

    用語解説:Union
    複数の離れたセルや範囲をまとめて一つのRangeとして扱うVBAのメソッド。

  • Q3. Findで見つかったRangeの扱い方は?
    A3. 見つからなければNothing返却なので、

    If Not foundCell Is Nothing Then ...

    で分岐。

  • Q4. Rows/Columnsとの違いは?
    A4. 行全体はRows、列全体はColumns
    セル単位はCells、範囲単位はRange

    用語解説:Rows / Columns
    Rowsは行全体、Columnsは列全体を表すVBAのプロパティ。大量データの一括操作や書式設定に便利。

  • Q5. OffsetやResizeって何?
    A5. 指定セルから“ズラす”・“サイズ変更”できるテクニック。データ量変動時に便利。

    用語解説:Offset / Resize
    Offsetは基準セルからの相対位置、Resizeは範囲の行数・列数を変更できるVBAのプロパティ。動的な範囲指定やデータ追加時に活躍。


まとめ

  • Cellsはループ、Rangeは固定範囲
  • 高速化のカギは「通信回数」削減
  • 配列×Rangeで一括処理が最速
  • エラー1004対策は「シート明記」など3つが鉄板

まずは手元のプロジェクトで、今日のコードをコピペ&実行してみてください。


RANKINGranking-icon

LATEST POSTS

もっとルートゼロを知りたいなら

DISCOVER MORE