Excel VBAでRangeとCellsはどっちを使うべきか

Excel VBA

Excel VBAでRangeとCellsはどっちを使うべきか

Excel VBAでセルを指定するとき、

Range

Cells

の両方が出てきます。

どちらもセルを扱うための書き方ですが、

指定方法と向いている場面が違います。

違いを理解しないまま使うと、

コードが読みにくくなったり、

意図しないセルへ書き込んだりする原因になります。

特に、

業務用Excelツールや、

他人に配布するマクロでは注意が必要です。


結論:固定セルはRange、ループ処理はCellsが無難

まず結論です。

固定セルや固定範囲を指定するなら、

Range

が分かりやすいです。

行番号や列番号を変数で扱うなら、

Cells

が向いています。

ただし、

実務配布用のVBAでは、

RangeCells かよりも、

対象シートを明示すること

の方が重要です。

迷ったら、

  • 固定セルは Range
  • ループ処理は Cells
  • どちらも ws.Range / ws.Cells の形で対象シートを明示する

という考え方で十分です。


RangeとCellsの違い

書き方 指定方法 向いている場面 注意点 実務でのおすすめ用途
Range A1形式で指定 固定セル・固定範囲 変数で行列を動かす処理は少し書きにくい 設定セル、入力欄、帳票の固定セル
Cells 行番号・列番号で指定 ループ処理・一覧処理 Cells(行, 列)の順番を間違えやすい マスタ行処理、一覧表処理、繰り返し処理

ざっくり言うと、

Range("A1")

はExcel画面上のセル番地に近く、

直感的です。

一方、

Cells(1, 1)

は行番号と列番号で指定するため、

For文などの繰り返し処理に向いています。


Rangeとは

Range は、

A1形式でセルや範囲を指定する書き方です。

例えば、

Range("A1")

と書けば、

A1セルを指します。

また、

Range("A1:C10")

のように書けば、

A1からC10までの範囲を指定できます。

Excel画面上のセル番地と対応しているため、

コードを読んだときに位置をイメージしやすいのが特徴です。

固定セルや固定範囲を扱う場合は、

Range の方が読みやすい場面が多いです。


Cellsとは

Cells は、

行番号と列番号でセルを指定する書き方です。

例えば、

Cells(1, 1)

は、

A1セルを意味します。

Cells(1, 2) はB1セルです。

Cells(2, 1) はA2セルです。

ここで注意したいのは、

Cells(行番号, 列番号)

の順番です。

Excel画面では、

「A列の1行目」

というように列を先に考えがちですが、

VBAの Cells

行、列

の順番です。

この順番を間違えると、

意図しないセルを操作する原因になります。


固定セルならRangeが読みやすい

位置が決まっているセルを扱うなら、

Range が読みやすいです。

例えば、

  • 設定値をB3セルから読む
  • 入力値をC5セルへ書く
  • タイトルをA1セルへ入れる
  • 帳票の決まったセルへ転記する

といった場合です。

Range("B3").Value = "設定値"

のように書くと、

Excel画面上の位置と対応しやすくなります。

帳票系のVBAでは、

転記先セルが固定されていることが多いため、

Range が分かりやすい場面は多いです。


ループ処理ならCellsが扱いやすい

一方で、

一覧表やマスタ行を順番に処理する場合は、

Cells が向いています。

例えば、

2行目から10行目までを順番に処理する場合、

行番号を変数で扱えます。

Cells(i, 1).Value

のように書けば、

i行目のA列を処理できます。

行番号を1ずつ増やす処理では、

Cells の方が自然です。

列番号も変数にできるため、

行方向だけでなく列方向の処理にも使いやすいです。


危ないのはRangeかCellsかではなく対象シート省略

実務で一番危ないのは、

RangeCells のどちらを使うかではありません。

危ないのは、

対象シートを省略すること

です。

例えば、

Range("A1").Value = "test"
Cells(1, 1).Value = "test"

のように書くと、

基本的には現在アクティブなシートが対象になります。

つまり、

別のシートが選択されているだけで、

処理先が変わる可能性があります。

業務用マクロでは、

これはかなり危険です。


対象シートは明示する

実務用のVBAでは、

対象シートを明示する方が安全です。

例えば、

次のように書きます。

ThisWorkbook.Worksheets("設定").Range("A1").Value = "test"

または、

Worksheet変数を使って、

次のように書きます。

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("設定")

ws.Range("A1").Value = "test"
ws.Cells(1, 1).Value = "test"

このように書くと、

どのシートを操作しているのかが明確になります。

配布用Excelツールでは、

RangeCells か以上に、

ws.Range

ws.Cells

の形で書くことが重要です。


コピペで試せる確認用コード

次のコードは、

RangeCells の違いを確認するためのサンプルです。

このコードは、

標準モジュールに貼って、テスト用のxlsmで実行してください。

ご注意

以下のVBAコードは、動作イメージを確認するためのサンプルです。
実行前に必ずExcelファイルのバックアップを作成してください。
業務で使用しているファイルに、いきなり貼り付けて実行しないでください。
Excelのバージョンや設定により、動作が異なる場合があります。

Sub CheckRangeAndCells()

    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets(1)

    ws.Range("A1").Value = "RangeでA1へ書き込み"
    ws.Cells(1, 2).Value = "Cells(1, 2)でB1へ書き込み"

    MsgBox "RangeとCellsで値を書き込みました。", vbInformation

End Sub

このコードでは、

A1セルに Range で値を書き込み、

B1セルに Cells で値を書き込みます。

Cells(1, 2) は、

1行目、2列目、

つまりB1セルです。

Cells

行、列

の順番で指定することを確認できます。


実務配布ではどう使い分けるか

実務配布用のExcelツールでは、

次のように使い分けると分かりやすいです。

固定の入力セルや設定セル

固定セルは Range が読みやすいです。

ws.Range("B3").Value

のように書くと、

Excel上のセル位置と対応しやすくなります。

一覧表やマスタを行方向に処理する場合

行番号を変数で動かすなら、

Cells が向いています。

ws.Cells(i, 1).Value

のように書けば、

i行目のA列を処理できます。

帳票の決まったセルへ転記する場合

セル位置が固定なら、

Range が読みやすいです。

ただし、

転記先が列番号や行番号で管理されている場合は、

Cells の方が扱いやすいこともあります。

大量の行をループ処理する場合

一覧表や統合マスタのように、

行を順番に処理する場合は、

Cells が自然です。

行番号を変数で動かせるため、

コードが整理しやすくなります。


ActiveSheetに依存しない

初心者のうちは、

次のようなコードを書きがちです。

Range("A1").Value = "実行"
Cells(2, 1).Value = "結果"

短いコードなら動きます。

しかし、

実務用のマクロでは、

この書き方は危険です。

どのシートが対象なのかが、

コードから分かりにくいためです。

配布用Excelツールでは、

利用者がどのシートを開いているか分かりません。

そのため、

必ず対象シートを指定する癖をつけた方が安全です。


迷ったときの判断基準

RangeとCellsで迷ったら、

次の基準で考えるとよいです。

  • A1、B3、C10のようにセル番地で考えたい → Range
  • 行番号を変数で増やしたい → Cells
  • 固定範囲をまとめて扱いたい → Range
  • 一覧表を上から順番に処理したい → Cells
  • 帳票の決まった位置へ転記したい → Range
  • マスタデータを1行ずつ読む → Cells

ただし、

どちらを使う場合でも、

対象シートは必ず明示します。


まとめ

RangeCells は、

どちらもExcel VBAでセルを指定するための書き方です。

Range は、

A1形式で直感的に指定できます。

固定セルや固定範囲を扱う場合に向いています。

Cells は、

行番号・列番号で指定できます。

ループ処理や一覧表処理に向いています。

実務配布用のマクロでは、

固定セルは Range

ループ処理は Cells

という使い分けが無難です。

ただし、

それ以上に重要なのは、

対象シートを明示することです。

ws.Range

ws.Cells

のように書き、

どのシートを操作しているのかを明確にすることで、

セル参照ミスを減らせます。


関連記事

  • Excel VBAでThisWorkbookとActiveWorkbookは何が違うのか
  • Excel VBAでフォームコントロールのボタンにマクロを登録する方法

維持DXノートについて

維持DXノートでは、

建設コンサル実務で使うExcel/VBAや、

橋梁点検調書作成支援ツールの開発メモを公開しています。

Excel作業の自動化や、

帳票作成の手間を減らす考え方を、

実務目線で整理しています。


関連する無料Excelツール

維持DXでは、

橋梁点検・維持管理業務向けのExcel VBAツールを無料公開しています。

  • 橋梁点検調書の作成支援ツール
  • 評価結果一覧作成ツール
  • 旧様式から2024様式への移行支援ツール
  • 成果整合確認ツール

いずれも、

実務で発生しやすい

  • 転記作業
  • 写真貼付
  • 一覧作成
  • 旧成果移行
  • 整合確認

の負担を減らすための補助ツールです。

以下のフォームにメールアドレスを入力すると、

ダウンロードURLを自動返信メールでお送りします。

    お名前(任意)

    メールアドレス(必須)

    会社名・所属(任意)

    ご関心のある内容(任意)

    ご相談内容(任意)

    ご注意

    ダウンロードURLは、入力いただいたメールアドレス宛に自動返信で送信されます。

    ダウンロードしたExcelでマクロが実行できない場合は、

    右クリック → プロパティ →「許可する」 をチェック後、再度開いてください。

    (Windowsのセキュリティ機能により初回実行時にブロックされる場合があります)

    コメント