

CellsとRangeの違いが分りません。違いを明確にするために以下の説明文を書きましたが、正しいでしょうか?
----------------------
Cellsはセルを表すコレクションである。Cell(s)と複数形になっている。コレクションはオブジェクトの集合体なので、コレクションCellsはセルオブジェクトの集合体である。Cellsはあくまでコレクションであってオブジェクトではない。
一方、Rangeはセルを表すオブジェクトである。
----------------------
CellsがコレクションならばCells(Range("A10"))の表記があってもいいと思いますが、実際にはありません。Cells(1,10)です。なぜですか?
コレクションCellsとオブジェクトRangeの違いを明確に示す例はありませんか?
A 回答 (10件)
- 最新から表示
- 回答順に表示
No.10
- 回答日時:
#自分の文章表現力というか、
#解説力?みたいなもののスキルの低さに自己嫌悪に陥ってますが
読み返してみると『CellsとRangeの違い』というより
『セルオブジェクトの集合体であるコレクションは何か』
というのがポイントのような気がしてきました。
答えは『Rangeオブジェクト』です。
単独のセルを表すのは『Rangeオブジェクト』であり、
その集合体であるコレクションも『Rangeオブジェクト』です。
範囲(range)は1つでも複数でも複合でも構わないわけです。
>Rangeオブジェクト(Rangeコレクションでもある)が呼び出されます。
>..あえて言えばRangeコレクション
奥歯にモノが詰まったような言い方をしてるのは
混乱の元になるから避けたい点だったからなんですけど。
「Rangeコレクション」という言葉自体はヘルプにも記載があります。
でも実際にはセルの集合体であるコレクションも『Rangeオブジェクト』であり、
「Rangeコレクション」クラスはありません。
WorkSheetオブジェクトクラスとWorkSheetsコレクションクラス、
単体用と集合体用にクラスが2つがある、のと同じように
RangeオブジェクトクラスとRangesコレクションクラスがあるわけではないのです。
セル『範囲』として1つの『Rangeオブジェクト』クラスがあるだけです。
後はプロにまかせます。
http://msdn.microsoft.com/ja-jp/library/dd296886 …
#2007からRangesクラスが追加されてますがこれは別。
#WorkbookConnectionオブジェクト対象なので通常は使えません。
No.9
- 回答日時:
#いや、『参照する』だと余計に解らなくなりますか。
例えば
MsgBox Worksheets.Item(1).Range("A1").Address
この構文のItemはプロパティである、という事は解りますね。
ItemプロパティはWorksheetオブジェクトを返します。
貴方の捉え方だと、『Itemはプロパティであり、オブジェクトでもある』ように見えるという事ですよね。
では
MsgBox Worksheets.Add.Range("A1").Address
この構文のAddメソッドはどう捉えますか?
ここではAddはオブジェクトを返す(Function)メソッドです。
貴方の捉え方だと、『Addはメソッドであり、オブジェクトでもある』ように見えてしまいます。
違いますよね。
『.』で繋ぐ時に、『.』の前のプロパティやメソッドで返されたオブジェクトを参照しているだけです。
Worksheets.Add.Range("A1").Address
これを1行で表現するなら
Worksheetsプロパティ(で返されるWorksheetsコレクション).(の)Addメソッド(で返されるWorkSheetオブジェクト).(の)Rangeプロパティ(で返されるRangeオブジェクトA1).(の)Addressプロパティ
と、なります。
>そうなるとVBAで定義されるプロパティの定義って何?と思ってしまいます。
全てのプロパティがオブジェクトを返すわけではありません。
ValueプロパティやColorプロパティのように単なる値を返すプロパティもあります。
単に、オブジェクトを返すプロパティやメソッドがある。ってだけなんですけどね -"-
No.8
- 回答日時:
>回答を拝見する限り、プロパティとコレクションは分離されるものではなく
>「プロパティでありコレクションでもある」のように見えます。
>そう捉えていいですか?
ダメです。
仰ってるのは『Cells は プロパティ であり コレクション でもある』ように見えるという意味ですよね。
私がずっと言ってるのは『Cells は プロパティであり コレクションではない』という事です。
プロパティ と コレクション(オブジェクト)は違います。
>CellsプロパティもItemプロパティもオブジェクトを呼び出す、という事を理解してください。
『CellsプロパティはRangeオブジェクトを返す』
『CellsプロパティによってRangeオブジェクトが呼ばれる』
とか、意味が解りませんか?
『CellsプロパティはRangeオブジェクトを参照する』
だったら解りますかね?
あまりゴチャゴチャ書くから解らないんですかね?
最初のレス#3の
>ActiveSheet.Cells とした時、CellsプロパティはActiveSheetの『すべてのセル (Range オブジェクト)』を返します。
>という事は
>ActiveSheet.Range("A1:IV65536") と書いているのと同じ事です。
これは理解できますか?
No.7
- 回答日時:
>プロパティについて受けた説明は、オブジェクトの様子、例えばセルの「値」「色」等を表すもの、でした。
Property Value([RangeValueDataType])
Excel.Range のメンバ
「値」はRangeオブジェクトの設計図(=Rangeクラス)にPropertyとして定義されています。
[RangeValueDataType]の引数を持った、型指定なしのValueプロパティとして定義されています。
Property Color As Variant
Excel.Interior のメンバ
「色」はInteriorオブジェクトの設計図(=Interiorクラス)にPropertyとして定義されています。
引数を持たない、Variant型のColorプロパティとして定義されています。
同じように
Property Cells As Range
読み取り専用
Excel.Worksheet のメンバ
「Cells」はWorksheetオブジェクトの設計図(=Worksheetクラス)にPropertyとして定義されています。
引数を持たない、Range型のCellsプロパティとして定義されています。
そのように設計されているからPropertyであって、
>Worksheets(sheet1).Cells
この記述で判断するわけではありません。
重ねて書きますが
>ワークシートの1様子を表す「セル」であるからプロパティである..
と判断するのではなくて
Property Cells As Range と定義されているからPropertyなのです。
>Worksheets(sheet1).Cells(1,1)
これは、省略せずに書くと
(Excel.Global.)Worksheets.Item(sheet1).Cells.Item(1, 1)
#6の繰り返しになりますが
(ExcelライブラリのGlobalクラスの)Worksheetsプロパティを書いたら
WorksheetオブジェクトのコレクションWorksheetsが呼び出されます。
呼び出されたWorksheetsコレクションの設計図(=Worksheetsクラス)
に定義されたItemプロパティに引数sheet1を与えて書いたら
Worksheetオブジェクトが呼び出されます。
呼び出されたWorksheetオブジェクトの設計図(=Worksheetクラス)
に定義されたCellsプロパティを書いたら
Rangeオブジェクト(Rangeコレクションでもある)が呼び出されます。
呼び出されたRangeオブジェクトの設計図(=Rangeクラス)
に定義されたItemプロパティに引数(1, 1)を与えて書いたら
Rangeオブジェクトが呼び出されます。
上記の意味で
>Worksheets(sheet1).Cells(1,1)において
Worksheetsは(Worksheets)コレクション
Worksheets(sheet1)は(Worksheet)オブジェクト
sheet1は(Worksheet)オブジェクト
Cellsは(Range)コレクション
Cells(1,1)は(Range)オブジェクト
です。
CellsはCellsコレクションではなくあえて言えばRangeコレクション
Cells(1,1)はCellオブジェクトではなくあえて言えばRangeオブジェクト
Cells.Select のSelectはCellsプロパティによって呼び出されたRangeオブジェクトに定義されたメソッドです。
>しかしCellsもプロパティ、Itemもプロパティで2つ重なりませんか?特に問題はないのでしょうか?
Worksheets(sheet1).Cells(1,1) これもプロパティが重なっています。
WorksheetsプロパティとItemプロパティとCellsプロパティとItemプロパティ。
問題には思わないでしょう?
あえて書けば
MsgBox Cells.Item(1).Item(1).Item(1).Item(1).Item(1).Address
CellsプロパティもItemプロパティもオブジェクトを呼び出す、という事を理解してください。
Cellsプロパティで呼び出したオブジェクトの、
Itemプロパティで呼び出したオブジェクトの、
Itemプロパティで呼び出したオブジェクトの..
..を繰り返してます。
ありがとうございます。
>Worksheets(sheet1).Cells(1,1)において
>Worksheetsは(Worksheets)コレクション
>Worksheets(sheet1)は(Worksheet)オブジェクト
>sheet1は(Worksheet)オブジェクト
>Cellsは(Range)コレクション
>Cells(1,1)は(Range)オブジェクト
>CellsはCellsコレクションではなくあえて言えばRangeコレクション
>Cells(1,1)はCellオブジェクトではなくあえて言えばRangeオブジェクト
ほぼ私の理解と同じです。ただCellsはCellsコレクションでなくRangeコレクション、の部分は違ってましたが。プロパティの識別は、あくまで「VBAでプロパティとして分類されているか否か」だけで決まるようですね。回答を拝見する限り、プロパティとコレクションは分離されるものではなく「プロパティでありコレクションでもある」のように見えます。そう捉えていいですか?そうなるとVBAで定義されるプロパティの定義って何?と思ってしまいます。
No.6
- 回答日時:
1)Set x = Application
2)Set x = Workbooks
3)Set x = Range("A1")
4)Set x = Cells
1)ApplicationプロパティによってApplicationオブジェクトが呼び出されてSetされる。
2)WorkbooksプロパティによってWorkbookオブジェクトのコレクションWorkbooksが呼び出される。
3)RangeプロパティによってRangeオブジェクトが呼び出される。
4)CellsプロパティによってRangeオブジェクトが呼び出される。
普段は意識する必要がないのですが、
オブジェクトを呼び出して使う時、どうやって呼び出しているか、という問題なのだろうと思います。
通常は、上位オブジェクトのプロパティとして用意された.xxxプロパティを使ってxxxオブジェクトを呼び出します。
Excelでは、大抵、プロパティとオブジェクトで同じxxxという名称が使われています。
でもCellsプロパティはCellsオブジェクトを呼び出しているわけではなくて
Rangeオブジェクトを呼び出しています。
(そもそもCellsオブジェクトやCellオブジェクトはない。Cellsコレクションもない。)
Rangeオブジェクトを呼び出すプロパティは他にも
Itemプロパティ、Offsetプロパティ、Resizeプロパティ、Dependentsプロパティ..とか色々あります。
IntersectやUnionなど、Rangeオブジェクトを返す(Function)メソッドもあります。
>CellsとRangeの違い
ResizeとRangeの違い と同じように違う..と言ったら言い過ぎでしょうか。
No.5
- 回答日時:
>え、何で?
?
何で、と言われても。
VisualBasicEditorで[F2]キー。「オブジェクトブラウザ」の見方はわかりますか?
Property Cells As Range
読み取り専用
Excel.Application のメンバ
Property Cells As Range
読み取り専用
Excel.Range のメンバ
Property Cells As Range
読み取り専用
Excel.Worksheet のメンバ
ExcelライブラリのApplicationクラスのメンバに Property Cells As Range
ExcelライブラリのRangeクラスのメンバに Property Cells As Range
ExcelライブラリのWorksheetクラスのメンバに Property Cells As Range
..があります。
CellsはRange型を返すPropertyです。
オブジェクトでもコレクションでもメソッドでもありません。
>▼Cells プロパティを Worksheet オブジェクトに指定した場合
>これ、どういう意味なのでしょうか?ワークシートオブジェクトに指定するというのは具体的には何でしょう?
続けて
>expression.Cells
>expression 必ず指定します。Worksheet オブジェクトを返すオブジェクト式を指定します。
とありますよね。
Cellsプロパティを使う時は
『expression.Cells』というように『対象オブジェクト.Cells』と書きます。
expression(対象オブジェクト)の部分が Worksheetオブジェクトだった時は、という意味で
>▼Cells プロパティを Worksheet オブジェクトに指定した場合
▼Worksheet オブジェクトに Cells プロパティを 指定した場合
です。
『Worksheetオブジェクトを表すオブジェクト』とは
ActiveSheetとかSheet1とかSheets.Item(1)とかWorksheets.Item(1)とか。
Worksheetオブジェクト.Cells と書いたら
WorksheetオブジェクトのCellsプロパティの事で、
WorksheetオブジェクトのCellsプロパティは
WorksheetオブジェクトのRangeオブジェクト、Range("A1:IV65536")を取得します。
CellsプロパティはRangeオブジェクトを取得する..というより
CellsプロパティによってRangeオブジェクトが呼び出される..と言ったほうが理解しやすい?
また、Cellsプロパティは引数を持ちません。
先にも書きましたが
Cells(10, 1)はCells.Item(10, 1)のItemプロパティが省略されたもので、
(10, 1)というのはItemプロパティの引数です。
再度ありがとうございます。
オブジェクトブラウザ、初めて見ました。
プロパティについて受けた説明は、オブジェクトの様子、例えばセルの「値」「色」等を表すもの、でした。Worksheets(sheet1).CellsのCellsがプロパティというのは、ワークシートの1様子を表す「セル」であるからプロパティであるということですか?例えば Workbooks(book1).sheet1だったらsheet1はワークブックの1シートを表すからプロパティなのでしょうか?
現在の私の理解
Worksheets(sheet1).Cells(1,1)において
Worksheetsはコレクション
Worksheets(sheet1)はオブジェクト
sheet1はオブジェクト
Cellsはコレクション
Cells(1,1)はオブジェクト
Cellsに関しては例外的にセル全体を表すオブジェクトとしても使用される、例えばCells.select
(selectはメソッド?)
Cells.Item=(10,1)については私にもItemがプロパティに見えます、Itemは初めて見ますが。しかしCellsもプロパティ、Itemもプロパティで2つ重なりませんか?特に問題はないのでしょうか?
No.4
- 回答日時:
ワークシートのセル(単一セル,単一セル範囲,複数のセル範囲)は,Rangeコレクションオブジェクトとして取得したり操作することができます。
rangeではA1型式若しくは定義された名前を使い,R1C1型式で記入することはできません。
また,range(rangeオブジェクト,rangeオブジェクト)の書式により,単一セル範囲を取得,操作する事ができます。
range("A1").select
range("A1:B4").value = 1
range(range("A1"), range("E5")).select
range("A1:B4,D1:E5").interior.colorindex = 6
range("Print_Area").select
ワークシートの単一セルは,cellsを使って取得したり操作することも出来ます。
cellsでは基本として行と列を指定します。
cells(2, 3).value = 2
range(cells(1, 1), cells(5, 5)).select
例外:
cellsのもう一つの使い方として,親オブジェクトに含まれる全てのセルを取得,操作する事もできます。
activesheet.cells.clearcontents
range("A1:B3,E1:F3").cells.value = 1
cellsの例外的な使い方として,rangeコレクションオブジェクトの既定のプロパティであるItemの代わりとして使う事ができます。
msgbox range("A1:E7").cells(35).address
親オブジェクトにrangeプロパティがある場合は,親オブジェクトに含まれるセル(セル範囲)をrangeで取得できます。
activesheet.autofilter.range.select
msgbox activesheet.hyperlinks(1).range.address
rangeプロパティはワークシートのセル以外のオブジェクトについても定義されている場合があります。
activesheet.shapes.range(3).select
-----------
既出回答でも指摘されていますが,「cellsコレクション」なる用語や説明はありません。sが付いているからコレクションと思った?のでしょうか。
また,コレクションはオブジェクトです。
「コレクション」についてよくわからない点があるようでしたら,VBAのヘルプから「Microsoft Visual Basic Documentation」に含まれている「Visual Basicプログラミングヒント」に掲載されている「オブジェクト、プロパティ、メソッド、およびイベントの概要」を読み込んでください。
この回答への補足
最後の概要を読みました。
現状の私の理解と合ってるように思えます。Cellsの記載がないものの、オブジェクト、プロパティ、メソッドに関して、大きな疑問はありません。
Cellsコレクションについて
オデッセイコミュニケーションズ発行 Excel VBAベーシック (著者 田中 了)より引用
Cellsは複数形になっていることからコレクションとわかりますが、(中略)、単体のセル(Rangeオブジェクト)の集合体が、ワークシートの全セルを表すCellsコレクションとなります。
回答頂いた内容では例外より上の記述では、Cellsはコレクションとしても無理はないように見えます。
>また,コレクションはオブジェクトです。
例えばコレクションを使った表現Worksheets(sheet1)がオブジェクトである、との意味でしょうか。ならば私もそうだと思います。
No.3
- 回答日時:
ヘルプを見てもらうと良いのですが
<引用>
Cells プロパティ
▼Cells プロパティを Application オブジェクトに指定した場合
アクティブ シートがワークシートのとき、そのワークシートにあるすべてのセル (Range オブジェクト) を返します。アクティブ シートがワークシートでないとき、このプロパティは失敗します。値の取得のみ可能です。
expression.Cells
expression 必ず指定します。Application オブジェクトを返すオブジェクト式を指定します。
▼Cells プロパティを Range オブジェクトに指定した場合
指定した範囲のセル (Range オブジェクト) を返します。値の取得のみ可能です。
expression.Cells
expression 必ず指定します。Range オブジェクトを返すオブジェクト式を指定します。
▼Cells プロパティを Worksheet オブジェクトに指定した場合
ワークシートのすべてのセル (Range オブジェクト) を返します。値の取得のみ可能です。
expression.Cells
expression 必ず指定します。Worksheet オブジェクトを返すオブジェクト式を指定します。
</引用>
ActiveSheet.Cells とした時、CellsプロパティはActiveSheetの『すべてのセル (Range オブジェクト)』を返します。
という事は
ActiveSheet.Range("A1:IV65536") と書いているのと同じ事です。
Cells(10, 1) は
Range("A1:IV65536")(10, 1) と同じです。
これは、RangeオブジェクトのItemプロパティが省略された書き方で、省略しなければ
Cells.Item(10, 1) や
Range("A1:IV65536").Item(10, 1) と書きます。
これはCellsあるいはRange("A1:IV65536")の10行目,1列目のアイテムを返します。つまりA10セル。
前述ヘルプ引用
>▼Cells プロパティを Range オブジェクトに指定した場合
に書いてあるように、Cellsは常にシートの全てのセルを表すわけではありません。
ActiveSheet.Range("A1:A10").Cells
と、対象であるオブジェクトRange("A1:A10")を指定すると
Range("A1:A10")のCells、つまり A1:A10 セルを返します。
With ActiveSheet.Range("A1:A10")
':
v = Application.Transpose(.Cells)
End With
Cellsプロパティで対象のRangeオブジェクトそのものを指定するという使い方をする事もあります。
ありがとうございます。
ヘルプは確認しましたが、プロパティである、にビックリしました。え、何で?
▼Cells プロパティを Worksheet オブジェクトに指定した場合
これ、どういう意味なのでしょうか?ワークシートオブジェクトに指定するというのは具体的には何でしょう?
No.2
- 回答日時:
>Cellsはセルを表すコレクションである。
Cell(s)と複数形になっている。⇒NGです。
Cellsは複数形ですが、ただのメソッドでありコレクションでは有りません。
コレクション階層は、Application→WorkBooks(Book)→WorkSheets(Sheet)→Range(Cell)なのでセルのコレクションはRangeです。
>CellsがコレクションならばCells(Range("A10"))の表記があってもいいと思いますが
⇒前述の通り、Cellsはただのメソッドだから、この構文はあり得ません。
>コレクションCellsとオブジェクトRangeの違いを明確に示す例はありませんか?
⇒階層が相違しているので例えられません。
No.1
- 回答日時:
Cellsはコレクションとして使われ、Rangeはオブジェクトとして使われますね。
常にオブジェクトはコレクションよりも優先して使われますのでCells(Range("A10"))の表記などコレクションの中にオブジェクトが使われるといったことはありません。ありがとうございます。
>オブジェクトはコレクションよりも優先して使われます
例えばWorksheets(sheet1)で説明するなら
Worksheets コレクション
Worksheets(sheet1) オブジェクト
の意味と考えていいのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エラーコード1004 6 2022/06/09 14:12
- Excel(エクセル) エクセル VBAの構文について 2 2023/02/10 18:26
- Visual Basic(VBA) エクセルVBA(実行時エラー438)の対処法を教えてもらえないでしょうか 3 2023/04/22 13:43
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Visual Basic(VBA) ExcelVBAのマクロについて。 9 2022/05/04 14:50
- Visual Basic(VBA) 送付元、送付先が同じ大きさの複合セルのコピーがVBAで、できません。 1 2023/06/01 20:51
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
- Visual Basic(VBA) エクセルVBA 3 2022/06/23 20:00
- Visual Basic(VBA) vba 等間隔の列に対しての計算 6 2022/05/17 20:15
- Visual Basic(VBA) VBA 請求書自動作成 3 2022/04/24 01:58
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「Columns("A:C")」の列文字を...
-
カラーダイアログの指定色で塗...
-
worksheetFunctionクラスのVloo...
-
Crystal report を 8.0 から 6....
-
VBAで既に開いている別アプリケ...
-
テキストボックス中の文字列の...
-
VBAで Set wb = Sheets(1).Cop...
-
VBAについてです。 初心者です...
-
VBA (Row とRowsの違いについて)
-
エクセルのVBAの標準モジュール...
-
MSDEでオートメーションエラー
-
エクセルVBAでWeb画面の切り替え
-
VisualBasic2008からExcelの操...
-
エクセルVBAで配列内に空白デー...
-
オブジェクト変数またはWITHブ...
-
Excel VBA グラフを任意sheetに...
-
vbaからIEを操作するための記載...
-
Outlook の予定表データをVB...
-
DataGridのつかいかた
-
PowerPointVBAでスライドマスタ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
worksheetFunctionクラスのVloo...
-
「Columns("A:C")」の列文字を...
-
エクセルのVBAの標準モジュール...
-
Excelでフィルタをかけると警告...
-
実行時エラー 3265「要求された...
-
VBAで既に開いている別アプリケ...
-
テキストボックス中の文字列の...
-
ExcelVBAでのNZ関数について
-
[VBA]CDOメッセージ送信エラー
-
EXCEL VBA オートシェイプナン...
-
VBAで Set wb = Sheets(1).Cop...
-
エクセルマクロエラー「'Cells'...
-
AccessVBAで「dim dbs as datab...
-
Excel VBAでWordの複数ファイル...
-
オブジェクトが見つかりません
-
CreateObjectとGetObjectの違い
-
エクセルVBAで配列内に空白デー...
-
オブジェクト変数またはWITHブ...
-
VBScriptからDLL参照設定したい
-
エクセルVBAでcode128のバー...
おすすめ情報