● 用語:~Excel2000~RangeプロパティでのRangeオブジェクトの取得と、Cellsプロパティでのそれとの違いについて
  
※まだ書きかけです。すみません。
※間違ってたらすみません。
※メモ書きなので、自分でも意味不明な箇所も多いです。ごめんなさい。

※本記事は、僕自身が「ヘルプ」を読んで、そこに書いてあったことを自分なりにまとめなおして書いただけですので、間違いがあったらすみません。(でも、ここに書いてあることは、「For Each ~ Next 文」以外のことは全部、ヘルプに書いてあります。なのでぜひヘルプも読んでみてください。Web記事や市販書籍だけだと間違います。)

※参考記事
『だまされるな!RangeとCellsの使い分け!https://excel-ubara.com/excel5/EXCEL813.html』←どうしてもExcelで数万行のテーブルを頻繁に扱うデータベースなどを作らないといけなくなった、どうしても速度が出ない、というようなかた向けです。最初からリレーショナルデータベースとExcelと連携で使う人にはさほど関係ありません。(「だまされるな!」はさすがに「極端な意見」なので、「自分のことだけが自動化できればいい、他人のファイルは扱わない、ファイルも同時に2つくらいしか扱わない、という方は参考程度で。もちろん勉強にはすごくなります。)
このWebページの巻末にある関連ページも、CellsとRangeの使い分けには、非常に参考になると思います。
今すぐ使えるかんたんEx Excelマクロ&VBA プロ技 BESTセレクション [Excel 2016/2013/2010/2007対応版] 』の「第3章 セルや行・列の指定方法を知ろう」「第4章 セルや行・列の操作方法を知ろう」がすごく参考になります。セルの「Selection」を「Range(××)」や「ActiveCell」などに書き換えることでいろいろに使えます。VBA初心者の方は買っておくととっても良いと思います。
Excel VBA逆引き辞典パーフェクト 第3版』の、「第1章 セルの操作」の部分もとても参考になります。上記2冊は、ExcelVBAビギナー必携だと思います。他の本は、以下に記した「真の基本の市販書籍」以外は、ビギナーさんは買わなくても良いと思います。(僕もビギナーですので)
この2冊は、決して「レベルとして簡単」ではないですが、初心者の立場に立ってできるだけ易しく書いてあります。また、初心者の方を「誤った道」に行かせないように作ってありまして、「ExcelVBAのレジェンドさんたちの初心者本やその関連団体の本」や「教科書を名乗る書籍」、「思想が極端なサイトの一部のWebページ」を読んで「騙される、勘違い人間」になる、よりは100倍良いかと思います。
いちばんやさしいExcelVBAの教本 人気講師が教える実務に役立つマクロの始め方 (「いちばんやさしい教本」シリーズ)
スラスラ読める Excel VBA ふりがなプログラミング (ふりがなプログラミングシリーズ)

番外:必須ではないですが、人によっては読みやすい本
図解! Excel VBAのツボとコツがゼッタイにわかる本 “超"入門

思想が極端だけど、ビギナー目線はとてもコスパアップになるサイト
「Go!Go! エクセルマクロを はじめよう!」http://www.start-macro.com/55/

目次
 ★ はじめに
 ★ Rangeプロパティ
 (01)「絶対」的な感じのセル操作(セル取得)について
   【参考】「For Each ~ Next 文」の基本的な書き方
 (02)「相対」的な感じのセル操作(セル取得)について
 (03)注意事項
 ★ Cellsプロパティ
 (01)「絶対」的な感じのセル操作(セル取得)について
 (02)「相対」的な感じのセル操作(セル取得)について
 (03)注意事項
 ★ RangeとCellsの混合
※Shift+TABキー、もしくは、Homeキー、Homeキー+TAB数回、を押すと、目次付近に戻れます。
  
  
★ はじめに

Rangeオブジェクトを取得するには、RangeプロパティやCellsプロパティを使うことができます。
(Rangeオブジェクト=セル・セル範囲、取得≒選択)

ほかに、Range+Cells、Offsetプロパティ、Unionメソッド、でも取得できますが、ここではRangeプロパティとCellsプロパティだけの「取得」の雰囲気の違いを少しご説明します。

※僕自身が「ヘルプ」を読んで、そこに書いてあったことを自分なりにまとめなおして書いただけですので、間違いがあったらすみません。(でも、ここに書いてあることは、「For Each ~ Next 文」のこと以外は全部、ヘルプに書いてあります。なのでぜひヘルプも読んでみてください。。Web記事や市販書籍だけだと間違います。)
  
  
★ Rangeプロパティ

(01)「絶対」的な感じのセル操作(セル取得)について

RangeプロパティでRangeオブジェクトを取得する場合、親オブジェクトの記述を省略するか、あるいは逆に、親オブジェクトに明示的に「ActiveSheet」や「Worksheetオブジェクト」を指定すると、次の(ア)や(イ)のような形のセル取得やセル範囲取得ができます。

(ア)「A1」とか「C1」といった感じで、「A1形式」での「単一セル」の取得(≒選択)ができます。(絶対的な感じです。)

(イ)また、「A1:D10 」といった感じの、「A1形式」での「セル範囲」の取得(≒選択)もできます。

(※:親オブジェクトの記述を省略すると、「親にActiveSheetが指定された」とみなされます。つまり、「ActiveSheetのセルやセル範囲」、ということになります。今現在アクティブなワークシートのセルやセル範囲を選択できます。当然ですが、アクティブでない(今目に見えてない)ワークシートのセル・セル範囲は取得できません。アクティブでないワークシートのセル・セル範囲を取得したい場合は、ActiveSheetではなくて「Worksheetオブジェクト」を親オブジェクトとして明示的に指定する必要があります。)

また、Rangeプロパティでは、「”A” & 変数」といった感じで、数字の部分を数値型の変数に置き換えることで、繰り返し処理(ループ処理)をセルの縦方向にだけ、やりやすいです。
横方向はやりにくいです。(「A1形式」の場合、横方向は数値ではなく、A、B、C、・・・とアルファベットで変数を使って指定しなければならないため。繰り返し処理ではアルファベットを使っての処理はもともと難しいです。)

ただ、「For Each ~ Next 文」を使って、
「For Each 空のオブジェクト変数 In Rangeでのセル範囲 ~ Next」
と書くと、「セル範囲のすべてのセル」を処理の対象とできますので、つまりは、セルの横方向への処理も、一応は可能となります。
例えば、1行分だけ横方向に処理をしたかったら、「In Rangeでのセル範囲」のところで
「In Range("A1:F1")」といったように指定すれば、A1セル~F1セルまで6個のセル・1行分だけを、すべて一括で 横方向に 処理できます。

そのほか(1行分でも複数行でも)、処理したくないセルがあれば、「For Each ~ Next 文」の中で、「何らかの基準でセルを区別するための、条件分岐の命令」を書けば、ある条件下のもと、特定のセルをとばしとばしにして一括処理ができます。

逆に言うと、もし処理速度にこだわらないなら、(後述のCellsプロパティを使わずに)Rangeプロパティ「だけ」で・しかも・「のちのちの可読性もよく・かつ・少ないプログラム量で」、セルの横方向の一括処理がしたいなら、原則としては 変数+繰り返し文 の利用ではなく「For Each ~ Next 文」を使うしかないことになります。
(そうしたほうが手っ取り早くて便利・・・、ということにはなります。ただ、処理速度についてはFor Each を使うほうが速いのか遅いのかはこちらでは未確認ですので、ご自分でも調べてみてください。もし遅かったとしてもそれほど大きな問題にはならないと思いますけど・・・。それに、「In Rangeでのセル範囲」のところでは、「Worksheet.UsedRange プロパティやRange.CurrentRegion プロパティなどでのRangeオブジェクト指定」も使えます。「Rangeプロパティでのオブジェクト指定」だけしか使えないわけじゃないので、いろいろ使えるので、やはり「For Each ~ Next 文」は便利です。)
  
  
【参考】「For Each ~ Next 文」の基本的な書き方

  Dim 単一オブジェクト用の空のオブジェクト変数 As Object
         '( 「As Object」は「As 明示的なオブジェクト名」でも可。)

  For Each 宣言したオブジェクト変数 In コレクション

    単一オブジェクト変数に一括でやりたい処理
    条件分岐での処理を書いてもOK。

  Next 宣言したオブジェクト変数

ここで、「単一オブジェクト用の空のオブジェクト変数」を作った・用意したということは、「空のオブジェクト変数に実際のオブジェクトを代入する」ということを前提としているわけなのですが・・・、そしてそれをするには、通常は「Set ×× = ・・・」というSetを使った文が必要なのですが・・・、どうやらその作業は「For Each ~ Next 文」自体が「表には見えないけど裏で代わりに自動的にやってくれる」ようですので、ユーザー側としては「Set ×× = ・・・」という文は書かなくてもいいっぽいです。

なお、上記構文の「コレクション」の部分は、基本、コレクション(コレクションオブジェクト)を用います(=コレクション名を書きます)。これはWordでもAccessでも同じです。
ただ、Excelの場合は、「Rangeオブジェクト(セル範囲)」のように、「もともとコレクション的な構造を持つオブジェクト」でもOKのようです。例えば「Application.Selection」や「Windows(××).Selection」など・・・、つまり、「シート上で実際にドラッグなどで選択されているセル範囲」を使うこともできます。
(※「Application.」や「Windows(××).」は一応省略できます。省略すると、Application. を指定したとみなされます。ただし、「Worksheet.UsedRangeプロパティ」のように、「In」 のところで親オブジェクトを省略するとエラーになってしまうようなものもあります。)

なお、「セル範囲」ということで言うと、「名前の定義」をしたセル範囲も使えます。
その「名前」を使うことで「For Each ~ Next 文」でセルの一括操作できます。
『 For Each 宣言したオブジェクト変数 In Range("名前の定義でつけた名前") 』
といったかたちでセルの一括操作ができます。
例えば
『 For Each ObjCel01 In Range("顧客一覧表") ~ Next ObjCel01 』
といった感じで使えます。
この場合、Rangeをセルのアドレスで表現しなくて済み、定義した表の名前で表現できるので、あとからプログラムを読み返すときに読み返しやすくなります。引継ぎ者もラクになります。

【補足】「For Each ~ Next 文」の利用シーンにてついて

「For Each ~ Next 文」は、基本、オブジェクト操作やオブジェクト変数操作に使う繰り返し文で、オブジェクトに対する一括処理がとってもしやすいです。

例えば、コレクションの中の単一オブジェクトを(最小限の少ないプログラムコードで)すべて走査してしてくれます。

また、コレクションの中の単一オブジェクトの「すべて」を走査してしてくれので、処理を適用したい・あるいは・したくない単一オブジェクトの条件を、IF文などで指定すれば済んでしまいます。

前述のとおり、コレクションだけでなく、セル範囲の中のすべてのセル、また、DAOやADOなどのオブジェクト(列とか)にも利用できます。

ただし、一般変数=文字ベースデータの変数の繰り返し処理・一括処理には、基本、使えません。その場合は、「For i = ・・・Next i 文」などを使います。カウンタ用の変数も必要です。

(ただし、一般変数でもそれが「配列」になっていたら、配列に対しては使えます。For Each 文のヘルプページには『 配列やコレクションの各要素に対して、一連のステートメントを繰り返し実行するフロー制御ステートメントです。』と記載されています。)

ちなみにですが、「For Each ~Next 文」では、カウンタ変数は、「コレクション内の全ての単一オブジェクトたち」に対しては、基本的には、必要ありません。
その他の何かの処理・操作には必要となることがあるかもしれませんけど・・・。
カウンタ変数が基本、要らないのでとても便利です。

なお、『「もともと一括処理ができてしまうメソッド」では、細かいところの操作ができない・・・』といった場合には、「For Each ~Next 文」のほうが便利なことも少なくないかもしれません。適材適所で使えると思います。

  
  
次の例は、A1~F1までの1行の6つのセルをすべてチェックして、もしセルの値が1よりも大きかったら値の文字の色を赤にするプログラムです。

  
  
(02)「相対」的な感じのセル操作(セル取得)について

なお、RangeプロパティでRangeオブジェクトを取得する場合、そのRangeオブジェクトの親オブジェクトをWorksheetオブジェクトではなく、Rangeオブジェクトにすると、「相対的なアドレス」でのセルの扱いができるようになります。
つまり「セル範囲」の一番左上のセルが相対的に「A1」になります。
(=「セル範囲」の一番左上のセルを、「相対的な”A1”」とみなすことが可能となります。)

例:イミディエイトウィンドウでのテスト
? Activesheet.Range("A4:D7").Range("A1").Address
$A$4

この例のように、Rangeプロパティの1つ上の階層の(=1つ親の)オブジェクトがRangeオブジェクトだった場合に、その親オブジェクト側にて、例えば「A4:D7」といった感じで「連続するセル範囲」が指定されていた場合、「子」側の「A1」は相対的なものとなります。
つまり、「Range("A1")」の「"A1"」は、「A4:D7」というセル範囲の中の、一番左上のセルのアドレスを意味します。
なので、上記の例では、イミディエイトウィンドウ「$A$4」とに表示されます。
これは、正しい動作です。

一方、1つ親のRangeオブジェクトの記述が省略されれば、ActiveSheet上のすべてのセルがセル範囲としてみなされるので、その一番左上のセルは「$A$1」となります。
  
  
(03)注意事項

1つ親のオブジェクトの記述を省略すると、「ActiveSheet」を指定したとみなされ、「絶対的なアドレス」でのセル操作となります。
ただし、「ActiveSheet」がワークシートじゃないと失敗します(エラーになります)。
例えばグラフシートがアクティブな時に、イミディエイトで
? Activesheet.Range("A4:D7").Range("A1").Address
とやるとエラーになります。

「ActiveSheet」が「単一オブジェクトなのかどうか?」を調べる方法
・オブジェクトブラウザで「ActiveSheet」で検索します。
・「検索結果」に出てきたものをどれでもいいのでクリック。
・下のほうの「説明ペイン」を見ます。
・「Property ActiveSheet As Object」とあるので「オブジェクト」とわかります。
・理由は、「説明ペイン」に「As Object」と表示されたものは、「オブジェクトである」と決まっていますので・・・。
  
  
  

★ Cellsプロパティ

(01)「絶対」的な感じのセル操作(セル取得)について

CellsプロパティでRangeオブジェクトを取得する場合、親オブジェクトの記述を省略するか、あるいは逆に、親オブジェクトに明示的に「ActiveSheet」や「Worksheetオブジェクト」を指定すると、次の(ア)や(イ)のような形のセル取得やセル範囲取得ができます。

(ア)「1,1」といった感じで、「R1C1形式」での単一セルの取得(≒選択)ができます。(絶対的な感じです。)

(イ)「A1形式」における「A1:D10 」のような、「セル範囲」の取得自体は「できません」。
シート上の「すべてのセル」か、単一セルしか取得できません。

(※:親オブジェクトの記述を省略すると、「親にActiveSheetが指定された」とみなされます。つまり、「ActiveSheetのセルやセル範囲」、ということになります。)

(Cellsプロパティを使って・・・、単一セルではなく「セル範囲」を取得したい場合は、「Range(Cells(1, 1), Cells(10, 10))」といった感じで、Rangeプロパティと組み込み合わせるしかないようです。例:イミディエイトウィンドウでのテスト → ? Activesheet.Range(Cells(1, 1), Cells(10, 10)).Address → 結果 → $A$1:$J$10 ※J列は左から10列目。)

ただし、Cellsプロパティでは、「1,1」を「変数,変数」といった感じで、数字の部分を数値型の変数に置き換えることで、繰り返し文(ループ処理)もいっしょに使うと、「セルの縦方向にも横方向にも」一括処理がやりやすいです。

Rangeプロパティでの「A1形式」のように「For Each ~ Next 文」を使わなくても、一応、変数と繰り返し文だけで、横方向(列方向)の一括処理ができます。
(それが良いことなのか悪いことなのかはTPOによって変わってくると思いますが…。)

Rangeプロパティでは、(「For Each ~ Next 文」を使わない場合に限っては)繰り返し処理を縦方向にしか扱いづらいですが、Cellsプロパティではセルの横方向にも、変数を使って、自動的に高速に繰り返し処理(一括処理)ができることになります。
なので、例えば「セルの横方向に”だけ”、変数だけを使って一括処理したい」、といったような場合は、 もしかしたらRangeプロパティよりも便利なこともあるかもしれません。

ただ、横方向のセルを一括処理するのに、『「横方向も含めたすべてのセル」を一括処理しちゃってもかまわない・・・条件分岐すれば処理しないセルを選ぶこともできるから・・・速度もここでは関係ないし・・・』という状況であるなら、変数(Cellsプロパティ+変数+繰り返し文)、を使わずに、「For Each ~ Next 文」を使ってしまうほうがわかりやすいし、早いです。のちのちのコードの読み返しもしやすいかもです。

初心者のうちは慣れるまでは、セルの一括処理には、基本、『 Rangeプロパティと「For Each ~ Next 文」』を使うことをメインとし、特別な事情があるときだけCellsプロパティを使う・・・というようなかたちでも、もしかしたら・・・、良いのかもしれません。

逆に、慣れてきたらCellsプロパティをたくさん使って、プログラムをどんどん書いていけばいいと思います。Cellsプロパティを使うほうが処理速度が一応速いらしいですし、その他のメリットもあるようですので・・・

  
  
(02)「相対」的な感じのセル操作(セル取得)について

なお、CallsプロパティでRangeオブジェクトを取得する場合、そのRangeオブジェクトの親オブジェクトをWorksheetオブジェクトではなく、Rangeオブジェクトにすると、「相対的なアドレス」でのセルの扱いができるようになります。これはRangeプロパティの場合と同じです。
つまり「セル範囲」の一番左上のセルが相対的に「1,1」になります。
(=「セル範囲」の一番左上のセルを、「相対的な”1,1”」とみなすことが可能となります。)
ひいては、「”セル範囲内”での縦横両方向のループ処理」についても、Rangeプロパティよりもやりやすいです。

例:Rangeプロパティと同じセル範囲でのイミディエイトウィンドウでのテスト
? Activesheet.Range("A4:D7").Cells(1, 1).Address
$A$4

Cellsプロパティの1つ上の階層の(=1つ親の)Rangeオブジェクトにおけるセル範囲が「A4:D7」の場合、相対的な「R1C1形式」での「1,1」、つまり、セル範囲の一番左上のセルのアドレスは、「$A$4」となり、正しいです。
1つ親のRangeオブジェクトの記述が省略されれば、ActiveSheet上のすべてのセルがセル範囲として捉えられるので、その一番左上のセルは「$A$1」となります。
  
  
(03)注意事項

1つ親のオブジェクトの記述を省略すると、「ActiveSheet」を指定したとみなされ、「絶対的なアドレス」でのセル操作となることもRangeプロパティと同じです。
こちらも、「ActiveSheet」がワークシートじゃないと失敗します(エラーになります)。
例えばグラフシートがアクティブな時に、イミディエイトで
? Activesheet.Range("A4:D7").Cells(1, 1).Address
とやるとエラーになります。
  
  
【「R1C1形式」について】
「R1C1形式」は以下のような値を使ってセルを特定します。
R=Row(行)=シートの「行番号」と同じ値
C=Colmun(列)=シートの列番号を数字に置き換えた値
           (A、B、C、・・・を順番に、1、2、3・・・と
            置き換えで数えたときのその値)
  
  
  

★ RangeとCellsの混合

前述のとおり、です。