アプリ版:「スタンプのみでお礼する」機能のリリースについて

CellsとRangeの違いが分りません。違いを明確にするために以下の説明文を書きましたが、正しいでしょうか?

----------------------
Cellsはセルを表すコレクションである。Cell(s)と複数形になっている。コレクションはオブジェクトの集合体なので、コレクションCellsはセルオブジェクトの集合体である。Cellsはあくまでコレクションであってオブジェクトではない。
一方、Rangeはセルを表すオブジェクトである。
----------------------

CellsがコレクションならばCells(Range("A10"))の表記があってもいいと思いますが、実際にはありません。Cells(1,10)です。なぜですか?
コレクションCellsとオブジェクトRangeの違いを明確に示す例はありませんか?

A 回答 (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オブジェクト対象なので通常は使えません。
    • good
    • 0
この回答へのお礼

ありがとうございます。
一度整理して、落ち着いて考えてみます。

お礼日時:2012/03/18 05:01

#いや、『参照する』だと余計に解らなくなりますか。


例えば
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プロパティのように単なる値を返すプロパティもあります。
単に、オブジェクトを返すプロパティやメソッドがある。ってだけなんですけどね -"-
    • good
    • 0

>回答を拝見する限り、プロパティとコレクションは分離されるものではなく


>「プロパティでありコレクションでもある」のように見えます。
>そう捉えていいですか?
ダメです。
仰ってるのは『Cells は プロパティ であり コレクション でもある』ように見えるという意味ですよね。
私がずっと言ってるのは『Cells は プロパティであり コレクションではない』という事です。
プロパティ と コレクション(オブジェクト)は違います。
>CellsプロパティもItemプロパティもオブジェクトを呼び出す、という事を理解してください。
『CellsプロパティはRangeオブジェクトを返す』
『CellsプロパティによってRangeオブジェクトが呼ばれる』
とか、意味が解りませんか?
『CellsプロパティはRangeオブジェクトを参照する』
だったら解りますかね?

あまりゴチャゴチャ書くから解らないんですかね?
最初のレス#3の
>ActiveSheet.Cells とした時、CellsプロパティはActiveSheetの『すべてのセル (Range オブジェクト)』を返します。
>という事は
>ActiveSheet.Range("A1:IV65536") と書いているのと同じ事です。
これは理解できますか?
    • good
    • 0

>プロパティについて受けた説明は、オブジェクトの様子、例えばセルの「値」「色」等を表すもの、でした。



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プロパティで呼び出したオブジェクトの..
..を繰り返してます。
    • good
    • 0
この回答へのお礼

ありがとうございます。
>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で定義されるプロパティの定義って何?と思ってしまいます。

お礼日時:2012/03/16 19:06

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の違い と同じように違う..と言ったら言い過ぎでしょうか。
    • good
    • 0

>え、何で?



何で、と言われても。
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プロパティの引数です。
    • good
    • 0
この回答へのお礼

再度ありがとうございます。
オブジェクトブラウザ、初めて見ました。

プロパティについて受けた説明は、オブジェクトの様子、例えばセルの「値」「色」等を表すもの、でした。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つ重なりませんか?特に問題はないのでしょうか?

お礼日時:2012/03/15 20:36

ワークシートのセル(単一セル,単一セル範囲,複数のセル範囲)は,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の記載がないものの、オブジェクト、プロパティ、メソッドに関して、大きな疑問はありません。

補足日時:2012/03/15 20:13
    • good
    • 0
この回答へのお礼

Cellsコレクションについて
オデッセイコミュニケーションズ発行 Excel VBAベーシック (著者 田中 了)より引用
Cellsは複数形になっていることからコレクションとわかりますが、(中略)、単体のセル(Rangeオブジェクト)の集合体が、ワークシートの全セルを表すCellsコレクションとなります。

回答頂いた内容では例外より上の記述では、Cellsはコレクションとしても無理はないように見えます。

>また,コレクションはオブジェクトです。
例えばコレクションを使った表現Worksheets(sheet1)がオブジェクトである、との意味でしょうか。ならば私もそうだと思います。

お礼日時:2012/03/14 21:52

ヘルプを見てもらうと良いのですが


<引用>
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オブジェクトそのものを指定するという使い方をする事もあります。
    • good
    • 0
この回答へのお礼

ありがとうございます。
ヘルプは確認しましたが、プロパティである、にビックリしました。え、何で?

▼Cells プロパティを Worksheet オブジェクトに指定した場合
これ、どういう意味なのでしょうか?ワークシートオブジェクトに指定するというのは具体的には何でしょう?

お礼日時:2012/03/14 21:37

>Cellsはセルを表すコレクションである。

Cell(s)と複数形になっている。
 ⇒NGです。
  Cellsは複数形ですが、ただのメソッドでありコレクションでは有りません。
  コレクション階層は、Application→WorkBooks(Book)→WorkSheets(Sheet)→Range(Cell)なのでセルのコレクションはRangeです。

>CellsがコレクションならばCells(Range("A10"))の表記があってもいいと思いますが
 ⇒前述の通り、Cellsはただのメソッドだから、この構文はあり得ません。

>コレクションCellsとオブジェクトRangeの違いを明確に示す例はありませんか?
 ⇒階層が相違しているので例えられません。
    • good
    • 0
この回答へのお礼

ありがとうございます。
Cells メソッド でグーグル検索かけると、確かにCellsメソッドが出て来ますね。

お礼日時:2012/03/14 22:20

Cellsはコレクションとして使われ、Rangeはオブジェクトとして使われますね。

常にオブジェクトはコレクションよりも優先して使われますのでCells(Range("A10"))の表記などコレクションの中にオブジェクトが使われるといったことはありません。
    • good
    • 0
この回答へのお礼

ありがとうございます。

>オブジェクトはコレクションよりも優先して使われます
例えばWorksheets(sheet1)で説明するなら
Worksheets コレクション
Worksheets(sheet1) オブジェクト
の意味と考えていいのでしょうか?

お礼日時:2012/03/14 21:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!