VBA入門
RangeとCellsの使い方

ExcelマクロVBAの基本と応用、エクセルVBAの初級・初心者向け解説
最終更新日:2021-10-16

第11回.RangeとCellsの使い方


VBA Range Cells


VBAではセルを指定する方法としてRangeCellsがあります。
RangeもCellsも、どちらもRangeオブジェクトでセルを指定するものです。


✅どちらを使ったらよいのでしょうか
✅どう使い分けたらよいのでしょうか

実際のマクロVBA記述では、RangeとCellsを使い分ける必要があります、
RangeとCellsの使い方・使い分け方について解説をします。

以下で、基本的な使い分け方から、使用する場面に応じての実際の書き方を見ていきましょう。


RangeとCellsの基本的な使い分け方

Rangeを使うのは

固定位置のセルの場合
セル範囲(複数セル)の場合
名前定義を使う時

以上のいずれかになります。
単一セル(1つの)セルの指定で変数を使う場合は、Cellsを使うようにします。

Cellsを使うのは

単一(1つの)セルを指定する場合

複数セルであるセル範囲や名前定義をCellsで指定することはできません。


固定セル(固定位置)の指定

最初に書いたように、固定位置で条件によって変化する事が無い場合は、

Range("B2")
Range("A1:C5")
Range("1:5")
Range("A:C")

このように書けば良いでしょう。

また、名前定義を使って、
Range("名前定義の名前")
このように名前定義を使う場合は、Rangeでしか記述できません。


Rangeに変数は使わないようにします

時々、このような書き方を見かけます、

Range("A" & i)
iは変数で、数値が入っている場合です。
(変数については、次回に説明します。)

このような使い方は極力避けましょう。
使ってはダメだという事でもないのですが、あまり良い書き方ではありません。

そして、実行速度もほんの僅かではありますが遅くなります。
つまり、このような記述をする特段の理由が見当たらないという事になります。
変数を使う場合は、Cellsがあるのですから基本的にはこれを使うようにしましょう。

とはいえ、
Rangeに変数を使う場面として、これならありかなという場面としては
繰り返し処理の中ではなく、範囲の最後が変数に入っているような場合でしょうか。
変数の、lastRowに最後の行数が入っているとして、その範囲に何か設定するような場合。

Cellsを使うと、
Range(Cells(2, 1), Cells(lastRow, 1)) = ""
Range(Cells(2, 3), Cells(lastRow, 3)) = ""

Rangeだけで書くと、
Range("A1:A" & lastRow) = ""
Range("C1:C" & lastRow) = ""

これなら、どちらもありだとは思います。
特に、後々に出てきますがRangeやCellsにシート指定をするようになると、
Rangeで書くほうが記述がかなり短く済むので使っても良いと思います。

ただしこの場合でも、実はResizeプロパティを覚えると、もっと簡単に記述することができるようになります。
・Resizeプロパティの構文 ・Resizeの使用例 ・Resizeのまとめ
したがって、Rangeで変数を使う事はVBAの学習が進めばなくなってくるものと思います。


1つの(VBAで位置を変化させる)セルを指定する場合

VBAで位置を変化させるような1つのセルを指定する場合の書き方の基本は、

Cells(行, 列)

このように書いて下さい。
列は、数字だけでなく、列記号も使えます。

Cells(5, 3)
Cells(5, "C")

どちらで書いても同じC5セルになります。

※上記では固定数値で書いていますが、マクロVBAではこの数値部分を変数で指定する場合が多くなります。

変数 ijに数値が入っているとして、
Cells(i, 3)
Cells(i, j)
このように書きます。


セル範囲(複数セル)を指定する場合

セル範囲(複数セル)の場合の書き方の基本は、

Range(始点セル, 終点セル)

この、始点セルと終点セルに、Cellsを指定します。

Range(Cells(行, 列), Cells(行, 列))

このように書きます。
例えば、

A1セルからA5セルなら
Range(Cells(1, 1), Cells(5, 1))

A1セルからC1セルなら
Range(Cells(1, 1), Cells(1, 3))

A1セルからC5セルなら
Range(Cells(1, 1), Cells(5, 3))

このようになります。
※上記では固定数値で書いていますが、マクロVBAではこの数値部分を変数で指定する場合が多くなります。

変数 i に数値が入っているとして、
Range(Cells(1, 1), Cells(i, 1))
Range(Cells(1, 1), Cells(1, i))
このように書きます。


複数行全体、複数列全体の指定

複数行の場合、1行から5行なら、
Range(Rows(1), Rows(5))

複数列の場合、1列(A列)から3列(C列)なら、
Range(Columns(1), Columns(3))

このように指定します。
※上記では固定数値で書いていますが、マクロVBAではこの数値部分を変数で指定する場合が多くなります。

変数 i に数値が入っているとして、
Range(Rows(1), Rows(i))
Range(Columns(1), Columns(i))
このように書きます。


RangeとCellsの使い分け方のまとめ

RangeとCellsの使い分け方については、
セル範囲と名前定義の場合はRangeを使う、それ以外はCellsを使う。
これが基本になります。

別の言い方をすれば、
変数を使う時はCells、Rows、Columnsを使用すると言う事です。


RangeとCellsの基本の関連記事

RangeとCellsは、VBAの基本中の基本であり、これが理解できなければVBAは何も始まりません。
これから多くのRange、Cellsに関することを説明していきますので順に学んで行ってください。

第8回.セルに文字を入れるとは(Range,Value)
・前回書いたVBAコード ・セル番地ついて ・= 記号について ・値はValue ・オブジェクトとは、プロパティとは ・セルに文字を入れるとは
第9回.Rangeでのセルの指定方法
・複数のセル(矩形のセル範囲) ・列全体 ・行全体 ・名前定義のセル範囲 ・特殊な指定方法 ・マクロVBAで良く使う書き方
第10回.Range以外の指定方法(Cells,Rows,Columns)
・Cells(行番号, 列番号) ・Rows(行番号) ・Columns(列番号) ・RangeとCellsの関連記事
第31回.セルの書式(表示形式,NumberFormatLocal)
・マクロでの表示書式の指定 ・表示書式指定文字 ・表示書式指定文字の調べ方 ・Range.NumberFormatについて
第32回.セルの書式(配置,Alignment)
セル内での値を表示する位置(縦位置、横位置)をマクロVBAで指定できます。「セルの書式設定」→「配置」で指定する内容です。マクロVBAでの配置の指定 Range.プロパティ=設定値 指定できるプロパティの設定値は以下になります。
第33回.セルの書式(フォント,Font)
・マクロでの指定 ・色定数 ・RGB関数 ・色の指定を解除(自動) ・フォント(Font)設定についての注意点
第34回.セルの書式(塗りつぶし,Interior)
・マクロVBAでのInterior指定 ・色定数 ・RGB関数 ・塗りつぶしなし ・条件付き書式との使い分け
第35回.セルの書式(罫線,Border)
・A1セル~B5セルに格子線を引いた時のマクロの記録 ・マクロVBAでの罫線指定 ・Bordersのプロパティ ・Range.BorderAroundメソッド ・マクロVBAでの罫線の注意点
第38回.セルに計算式を設定(Formula)
・計算式を設定できるプロパティ ・Valueプロパティ ・Formulaプロパティ , FormulaLocalプロパティ ・FormulaR1C1プロパティ , FormulaR1C1Localプロパティ ・R1C1参照形式 ・Localが付くプロパティについて ・それぞれの違い(Localは除く) ・何故、こんなに多くのプロパティが存在しているのか ・R1C1形式を使うメリット ・たった1行のVBAで複数のセルに計算式を入れる
第39回.セルのクリア(Clear)
・セル(Rangeオブジェクト)のクリア関係のメソッド(動作を与える) ・Range.Clear ・Range.ClearContents ・クリア関係メソッドについて
第40回.セルのコピー・カット&ペーストCopy,Cut,Paste)
・セルをコピー(複写)する場合 ・セルを切り取る(移動する)場合 ・セル範囲のコピーについて ・別のシートにコピーする場合 ・アクティブシート以外へのコピー ・セルのコピーについてのサイト内参考ページ
第41回.セルのコピー&値の貼り付け(PasteSpecial)
・PasteSpecialメソッド ・値の貼り付け ・いろいろなコピーのVBAの書き方 ・PasteSpecialの使用例 ・最後に
第42回.セルをコピーするとは
・セルをコピーするとは ・上記方法ではコピーできないプロパティ ・.Valueのセル範囲間のコピー ・.Value以外の場合は、セル範囲をセル範囲にコピーは出来ません ・コピー方法の使い分け ・セルのコピー(Copyメソッド)実行時の注意点 ・最後に
第82回.Rangeのプロパティ(Resize)
・Resizeプロパティの構文 ・Resizeの使用例 ・Resizeのまとめ
第83回.Rangeのプロパティ(Offset)
・Offsetプロパティの構文 ・Offsetの使用例 ・Offsetの注意点 ・Offsetのまとめ
第84回.Rangeのプロパティ(Address)
Addressプロパティは、セル範囲(Rangeオブジェクト)の参照範囲を表す文字列の値を返します。引数により、参照方法($の付いた絶対参照)や形式(R1C1形式)を指定できます。Addressは、マクロVBAの中で処理の一環として使う事はあまり多くないかもしれませんが、VBA作成過程ではRangeオブジェクト変数…
第85回.結合セルの扱い
・セル結合に関する、メソッド・プロパティ ・セル結合のマクロVBA使用例 ・セル結合時の値消去 ・指定セル範囲に結合セルが存在するか判定するマクロVBA ・セル結合時のOffsetとResizeの注意点

RangeとCellsの応用の関連記事

是非読んでほしいRangeとCellsに関する説明ページ
RangeとCellsの深遠
RangeとCells特集にします。今さら…と、あなどるなかれ、結構奥が深いのです。すでに説明した内容もありますが、知っておいた方が良い事、知らなくても困らない事(笑) これらを、まとめてみました。まずは基本 A1セルに"エクセル"と入れる場合。
だまされるな!RangeとCellsの使い分け!
ネットを見ていると、Range("A"&i) と言う記述を良く見かけます。初心者の方が、マクロの自動記録を見て、記録されたマクロを自分で工夫して、行数を変数にしたというのなら素晴らしい事です。しかし、マクロについて、かなり手慣れた人や、時にはExcelマクロの指導的立場にいる人が、
Rangeの使い方:最終行まで選択を例に
Rangeの使い方・書き方について、データ最終行まで選択する場合を例に説明します、Rangeの書き方なので、RangeオブジェクトではなくRangeプロパティの解説という事になります。最近続けざまに、以下のようなコードを見かけました。Range("A2",Range("A2"…

リファレンス
Rangeのプロパティ一覧 ・・・ 詳細解説ページへのリンクあり
・Excel2010までのRangeオブジェクトのプロパティ一覧 ・Excel2016で追加されたRangeオブジェクトのプロパティ一覧 ・スピルにより追加されたRangeオブジェクトのプロパティ一覧
Rangeのメソッド一覧 ・・・ 詳細解説ページへのリンクあり
・Excel2010までのRangeオブジェクトのメソッド一覧 ・Excel2013で追加されたRangeオブジェクトのメソッド一覧 ・Excel2016で追加されたRangeオブジェクトのメソッド一覧

RangeやCellsの書き方次第で、マクロVBAの見た目が大きく変わってきます。
処理結果が同じであるなら、読みやすいVBAコードを書くようにしましょう。





同じテーマ「マクロVBA入門」の記事

第8回.セルに文字を入れるとは(RangeオブジェクトのValueプロパティ)
第9回.Rangeでのセルの指定方法
第10回.Range以外の指定方法(Cells,Rows,Columns)
第11回.RangeとCellsの使い方
第38回.セルに計算式を設定(Formula)
第12回.変数宣言のDimとデータ型
第13回.定数宣言のConstと型宣言文字
第14回.文字の結合(&アンパサンド)と継続行(_アンダーバー)
第15回.四則演算と注釈(コメント)
第16回.繰り返し処理(For Next)
第17回.繰り返し処理(Do Loop)


新着記事NEW ・・・新着記事一覧を見る

TOROW関数(配列を横1行の配列にして返す)|エクセル入門(2022-10-31)
TOCOL関数(配列を縦1列の配列にして返す)|エクセル入門(2022-10-31)
CHOOSECOLS関数(配列から複数の指定された列を返す)|エクセル入門(2022-10-29)
CHOOSEROWS関数(配列から複数の指定された行を返す)|エクセル入門(2022-10-29)
WorksheetFunctionの効率的な使い方とスピル新関数の利用|VBA入門(2022-10-27)
VSTACK関数(配列を縦方向に順に追加・結合)|エクセル入門(2022-10-25)
HSTACK関数(配列を横方向に順に追加・結合)|エクセル入門(2022-10-25)
LAMBDA以降の新関数の問題と解説(配列操作関数編)|エクセル入門(2022-10-24)
LAMBDA以降の新関数の問題と解説(ヘルパー関数編)|エクセル入門(2022-10-24)
LAMBDA以降の新関数の問題集|エクセル入門(2022-10-24)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.Excelショートカットキー一覧|Excelリファレンス
7.並べ替え(Sort)|VBA入門
8.マクロって何?VBAって何?|VBA入門
9.エクセルVBAでのシート指定方法|VBA技術解説
10.ExcelマクロVBAの基礎を学習する方法|エクセルの神髄




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ