★★★ Access2000VBA・Excel2000VBA独学~用語:ExcelVBA~「Rangeオブジェクト」とは?~
  
※まだ書きかけです。すみません。
※間違ってたらすみません。
※メモ書きなので、自分でも意味不明な箇所も多いです。ごめんなさい。
  
  

  

VBAプログラミングにおける「オブジェクト」とは、「目に見える・見えない・大きい・小さい」にかかわらず、「ユニット、パーツ、部品、複合機能体」あるいは「ミニミニロボット」のことだと思って頂ければよいです。

※絶対にこちらも読んでおいてください!! ↓↓↓
★★★★★★★★★★★★★★★★ 超重要!!必読!!ExcelVBAが上達するかどうかの最初の分かれ道!オブジェクトとオブジェクト式について~★★★★★★★★★★★★★★★★
少し詳しく、でもそこそこまとめた記事です。
  
  
ではその際、「Rangeオブジェクト」とは、どんな感じで捉えたらよいでしょうか?

いろいろと考えられると思います。
例えば、「単一のセルや選択範囲」という説明とか。

でもそれだと(「選択範囲」みたいなとらえかただと)、「ミニミニロボット」とか「ユニット」「パーツ」「複合機能体」としてちょっと捉えづらいので、僕の場合は以下のようにとらえています。

  
  
「Rangeオブジェクト」とは・・・、

「単一のセル」というロボット

あるいは

「複数のセル」というロボット
「複数のセルの ” 集まり ” 」というロボット

・・・という風にとらえています。
  
  
そしてそのロボットは・・・、

・データの入力機能
・書式の設定機能
・数式の保持機能

・・・といった機能を持っているロボット・・・・、という風にとらえています。
  
  
また、別の角度から見ると(=「機能の大分類」的な視点から見ると)・・・、
・プロパティ機能
・メソッド機能
・階層構造上下自由往来機能(上下階層のオブジェクトの機能流用機能)
・データ入力機能
などの機能は保持=内包されていますが、
・イベント機能
だけは保持=内包していません。
  
  
そして、Rangeオブジェクトの場合、 ただ単に「選択範囲」ととらえるよりは・・・、

「 ” セルの集まり ” というユニット・ミニミニロボット」
「 セルという ” 単一のオブジェクト ” が複数集まってできたもの」
「 セルという ” 単一オブジェクト ” が複数集まってできた ” コレクション的なもの ” 」

・・・と、とらえたほうが良いと思います。

(※「コレクション」・・・単一オブジェクトを複数集めたもの=複数集めた単一オブジェクトたちを、ごそっと一括処理するためのオブジェクト=ツール=ユニット=ミニミニロボット。)

そうすると、Rangeオブジェクトを対象に、「For Each 文」という命令も使える・・・と割とすんなりと理解できるからです。(「For Each 文」・・・コレクションオブジェクトを利用・経由して、単一オブジェクトたちにごそっと一括処理するための命令文。)

その意味では、「選択範囲」という言葉の意味自体を、最初から、「セルという単一オブジェクトの集まり」・・・という風にとらえてしまったほうが良いかもしれません。

ちなみにですが、Rangeオブジェクトとは違いますが、「ShapeRange」オブジェクトというものもあります。これは図形としての集まりですが、この場合も、「選択範囲」などととらえるよりも、「図形たちの集まり」、ととらえたほうが関連事項の理解が早まると思います。

  
  
なお、「Rangeオブジェクト」というミニミニロボットを取得するには、
(取得=選択するには、
   =GETするには、
   =操作対象として指定するには、
   =操作対象として決定するには、)
色んなものが使えます。

例えば「プロパティ」と呼ばれるものを使うときもあれば、「メソッド」と呼ばれるものを使う場合もあります。(ただ、「プロパティ」と呼ばれるものを使うことが圧倒的に多いです。)

たとえば
・単体の1つのセルをRangeオブジェクトとして取得する場合は、「Cellsプロパティ」、
・「A1:G10」のような複数のセルをRangeオブジェクトとして一括取得する場合は、
  「Rangeプロパティ」、
・複数のセル範囲を結合しつつ取得する場合は、「Unionメソッド」、
といったような感じで、どんなセルの集合体を取得したいか、で、つかうプロパティやメソッドが変わってきます。

このような違いは、Rangeオブジェクトだけでなく、他のオブジェクトにもあると思います。多分・・・。(僕は基本、ExcelVBA初心者なので、詳しく知らないのですみません。)

※ただし、「プロパティ」や「メソッド」には、名前が同じものがたくさんあります。そして、名前が同じでも「親オブジェクト」が異なる場合が多い・・・ので注意が必要です。
「親オブジェクト」とは「1つだけ上の階層のオブジェクト」という意味で使うことが多いですが、実は、その親オブジェクトが「異なる」と、「たとえ同名であっても」、そのプロパティやメソッドなどの「意味・使い方」等々が違ってきてしまうのです。
(※例えば Rangeオブジェクトの場合は、Worksheet.Rangeプロパティで取得できるRangeオブジェクトとか、Range.RangeプロパティやShapes.Range プロパティで取得できるもの、等々があります。この場合、RangeオブジェクトはRangeオブジェクトでも、それぞれの親オブジェクトが「WorkSheet」「Range」「Shapes」と異なります。いくら名前が同じでも、異なった親オブジェクトに属するRangeオブジェクトとなる・・・ということです。なので、オブジェクトとしての名前は同じですが、やれること・動きはまったく異なります。そのようにその親オブジェクトが「異なる」と、「たとえ同名であっても」、そのプロパティやメソッドなどの「意味・使い方」等々が違ってきてしまうのです。
結果として、「プロパティやメソッドは、たとえ同名であっても親オブジェクトが変わると意味や動きが変わってくる」ということをあらかじめ知っていないと、「同じ単語で指定しているのに思ったように選択できない、動かない、変な動きになる、エラーが出る(他の場所でエラーが出る)といったことになります。
どの親オブジェクトになるとどんな動きをするのかは、ヘルプを読むのが一番です。
Webで調べてもいいですが、Webには誤情報(かなりテキトーでいいかげんな情報)が多いので、必ずヘルプとも見比べてください。
先生に質問する際にも、ヘルプを一緒に読んでもらうほうが確実で、絶対に良いです。
ヘルプには誤訳もあったりするそうで、過信は禁物のようですが、ただ、少なくとも「Webや市販書籍・電子書籍など」の「テキトーな記述」に騙されるよりは遥かにマシです。
僕はExcelVBAのド素人ですが、それでもヘルプやオブジェクトブラウザなどを読むようになってから、Web情報や市販書籍が、ウソまがいのテキトーなこをを書いているかどうかくらいはわかるようになりました。
だからといって偉いわけでもなんでもないんですが、でもそのおかげで、「これはおおむね信じていい」という判断の速度が以前の20倍以上になったので、基礎的な何かを調べる回数も激減してきましたし、無駄なことを調べないで済むようになりましたし、Webに書いてある7~8割くらいはすらすら分かるようになってきました。(未だド素人なのに。)
そのような体験を、ぜひ、これをお読みの皆さんにも、体験してほしい・・・と願うのです。
逆にヘルプとオブジェクトブラウザの意味が分からねば、僕のほうこそ、永遠に「バカでクズ・クソのニセモノ野郎のまま」でした。(まあ、今でも人格が低いのそんなようなものなのですが・・・)

※実際にクリックやドラッグで選択された状態の「セルの集まり」あるいは「図形の集まり」は、「Application.Selection プロパティ」や「ActiveWindows.Selection プロパティ」で取得することができます。それらは「今選択されているモノ」という感じです。
  
  
では、「Rangeオブジェクト」の取得方法ですが、それには、以下の(01)以降に示したようなものを使います。
  
  

(01)「Worksheet.Range プロパティ」を使う
(Applicationオブジェクトの中のWorkbookオブジェクトの中のWorksheetオブジェクトが内包しているRangeプロパティ を使います。)

この場合は
『「親オブジェクト」が「Worksheetオブジェクト」の「Rangeプロパティ」を使う』・・・
という意味でもあります。

もう少しイメージしやすいように言いますと、
「親オブジェクトがワークシートの選択範囲」とか、
「ワークシート上における選択範囲」とか、
「ワークシート上で一括選択したセルの集まり(というミニミニロボット)」
といった意味でもあります。

ちょっと話を逸らしますが、基本、「親オブジェクト」とは、「1つ上のオブジェクト」という意味で使うことが多いですが、それがワークシートではない「Rangeオブジェクト(選択範囲)」の場合もありますので少し注意が必要です。
例えば「Hyperlink.Rangeプロパティ」で取得できる=選択できる「Rangeオブジェクト(=選択範囲)」の場合、その直上(1つ上)のオブジェクトは「Hyperlinkオブジェクト」であって、Worksheetオブジェクトではありません。
なので、「Worksheet.Rangeプロパティ」で取得できるRangeオブジェクトとは、若干ですがその「意味や使える命令など」が異なってきます。
ただ、「Hyperlinkオブジェクト」の更にもう1つ上のオブジェクトは「Worksheetオブジェクト」となります。
そういう感じの「階層構造」になっていますので、その「違い」を理解することが、ExcelVBAの場合は、かなり重要です。(AccessVBAの場合よりも重要だと思います。)

というわけで、「Hyperlinkオブジェクト」の場合は・・・、
「ワークシート上の、ハイパーリンク設定がなされたセル、のみ、を選択の対象とする」
・・・というようなニュアンスが含まれることになります。
また、でありますので、単なる「無条件のセル選択とも違う」ということにもなります。
それに対して、「Worksheet.Rangeプロパティ」で取得できるRangeオブジェクトの場合は、「単なる無条件のセル選択」「ただ単にクリックやドラッグしただけのセルの集まり(というミニミニロボット)」という意味合いになります。
厳密には「Activewindows.Selection」ではないので違いますが、でも似ていて、イメージ的にはそういうイメージです。
親オブジェクト(直上の階層のオブジェクト)が変わると、そのように少しだけ意味合いが違ってきますので、そのことは絶対に意識するようにしてください。(でないとエラーの自力解決も難しいし、Q&Aサイトでも回答者の言っていること自体が理解できません。)
「セルの集まりはセルの集まりでも、 ” どんなタイプのセル ” の集まりか?」ということが変わってくる・・・ということです。
これは他のオブジェクトでも、同じようなことが結構あります。(親オブジェクトの違いによって、プロパティやメソッドの意味や動き、命令内容が少しだけ変わってきます。)

話を戻します。

なお、「Worksheet.Rangeプロパティ」を使う場合、親オブジェクトがワークシートであれば、どのブックのどのシートの「セルの集まり=Rangeオブジェクト」でもOKです。
ワークシートは「Activesheet」にて、相対的な感じで指定してもいいです。「Activesheet」だけで指定すれば、自動的に「ActiveWorkbook」も指定したことになりますので。
もちろん、ブック名やシート名を使って絶対的な感じで「決め打ちして指定」してもOKです。

よって、指定の仕方としては、たとえば・・・、
Excel.Application.Workbooks("Book1.xlsx").Worksheets("Shees1").Range("A1")
Excel.Application.Workbooks("Book1.xlsx").Worksheets("Shees1").Range("A1:C5")
Application.Workbooks(1).Worksheets(1).Range("A1:C5")
Application.ActiveWorkbook.Activesheet.Range("A1:C5")
Application.ActiveWorkbook.Worksheets("Shees1").Range("A1:C5")
ActiveWorkbook.Worksheets(1).Range("A1:C5")
ActiveWorkbook.Activesheet.Range("A1:C5")
Activesheet.Range("A1:C5")
Range("A1:C5")
・・・といったような指定方法となります。
  
  
(02)Range.Range プロパティを使う
(Rangeオブジェクトが内包しているRangeプロパティ。ここでの親オブジェクトのRangeオブジェクトのさらに親となりオブジェクトはApplication直接や、Worksheetオブジェクトなどがあります。)
  
  
(03)Worksheet.Cells プロパティを使う
(Applicationオブジェクトの中のWorkbookオブジェクトの中のWorksheetオブジェクトが内包しているCellsプロパティ
  
  
(04)Range.Cells プロパティを使う
(Rangeオブジェクトが内包しているRangeプロパティ。ここでのRangeオブジェクトの親オブジェクトはApplication直接や、Worksheetオブジェクトなどがあります。)
  
  
(05)Application.Cells プロパティを使う
(Applicationオブジェクトが直接内包するCells プロパティ)
  
  
(06)RangeプロパティでのRangeオブジェクトの取得と、Cellsプロパティでのそれとの違いについて

Rangeオブジェクトを取得したい際には(色んな方法がありますが)、特に、RangeプロパティとCellsプロパティを使うことがとても多いので、その違いについて大雑把に書いておきました。
ヘルプに書いてあることばっかりですけど、でも、これが最初にわかるだけでも、だいぶ、セルの操作ができるようになると思いますし、へんなサイトや書籍に騙されることも減ると思います。

 (ア)RangeプロパティでのRangeオブジェクトの取得
    全セル、単一セル、セルの集まり、といったRangeオブジェクトを取得できる。
       (セルの集まり→→ 例えば「A1:B5」などの。)
    A、B、C、・・・などのアルファベットの列番号を使える。
    Rangeプロパティ単独使用だけだと縦方向のループしかできない。
      ただし、For Each 文と組み合わせると
        横方向にもループできる場合も少なくない。
    親オブジェクトがWorksheetやApplicationなどではなくRangeオブジェクトだと
    (=「A1:D3」のような複数セルの集まりだと)相対的なイメージの取得が可能。
     ※親オブジェクトがRange("D3:F10")だと、
      例えばRange("D3:F10").Range("A1").Value と書いた場合は、
      「D3」セルの値がA1とみなされて取得できます。      
                (参考:こちら

 (イ)CellsプロパティでのRangeオブジェクトの取得
    全セル、単一セル、といったRangeオブジェクトは取得できるが、
       「セルの集まり」というRangeオブジェクトは取得できない。っぽい。
       (例えば「A1:B5」などの。)
    A、B、C、・・・などのアルファベットの列番号を使えないが、
                 R1C1形式のように列も行も数値で指定できる。
    Cellsプロパティ単独使用だけで縦方向も横方向もループできる。
    こちらも、親オブジェクトがWorksheetやApplicationなどではなく
     Rangeオブジェクトだと(=「A1:D3」のような複数セルの集まりだと)
     相対的なイメージの取得が可能。
     ※親オブジェクトがRange("D3:F10")だと、
      例えばRange("D3:F10").Cells(1,1).Value と書いた場合は、
      「D3」セルの値が「1,1」とみなされて取得できます。      
                (参考:こちら
    配列を使わなくても、Rangeプロパティで処理するよりも高速な場合が
                                 あるらしい。
    (参考:思い込みが強いページですので注意が必要ですが参考になります。
     『RangeとCellsの使い方
     『だまされるな!RangeとCellsの使い分け!』)

※参考記事
RangeプロパティでのRangeオブジェクトの取得と、Cellsプロパティでのそれとの違いについて

  
  
(05)Worksheet.UsedRange プロパティを使う
(Applicationオブジェクトの中のWorkbookオブジェクトの中のWorksheetオブジェクトが内包しているUsedRange プロパティ)
Excel.Application.Workbooks("Book1.xlsx").Worksheets("Shees1").UsedRange
Application.Workbooks(1).Worksheets(1).UsedRange
Application.ActiveWorkbook.Activesheet.UsedRange
ActiveWorkbook.Activesheet.UsedRange
Activesheet.UsedRange

※「UsedRange」だけの記述だと「オブジェクトが必要です」というエラーになります。
(この場合は「親オブジェクトが必要です」という意味のエラーです。)

なお、「UsedRange」は、以下のセルも含まれます。そのセルをも含んだ、すべての使用されたセルの矩形のエリアとなります。

・数式が入っているが、IF関数などで空白セルであるかのように見せているセル。
・過去に、「標準」以外の書式設定が1度でもなされてたセル。
  (書式を標準に戻してもダメ。列を丸ごとを消さないとダメ。)
・値が入力されていないのに、でも、例えば 白い塗りつぶし設定がなされいるセル。
・値が入力されていないのに、罫線が設定されているセル。
  (特に淡いグレーで見分けがついにくいとか)
・「コンボボックス+関数」、などの利用で、「文字色:白」の設定をしてしまったセル。
・その他

  
  

(08)Range.CurrentRegion プロパティ

  
  
(09)AutoFilter.Range プロパティを使う

  
  
(10)Hyperlink.Range プロパティを使う
(Applicationオブジェクトの中のWorkbookオブジェクトの中のWorksheetオブジェクトの中のHyperlinkオブジェクトが内包しているRangeプロパティ を使う)
  
  
(11)PivotCell.Range プロパティを使う

(12)Application.Selection プロパティを使う
(Applicationオブジェクトが内包しているSelection プロパティ を使う)
まさに、クリックやドラッグで「選択されたもの」という意味の「セルの集まり」です。
Ctrlキーを押しながらクリックやドラッグをし、別々の場所を複数・一括選択した「セルの集まり」もこれで取得できます。

(13)Window.Selection プロパティを使う
(Applicationオブジェクトの中のWindowオブジェクトが内包しているSelection プロパティ を使う)

(14)Window.RangeSelection プロパティを使う

など