- 締切済み
エクセルVBA CellsとRangeの違い
CellsとRangeの違いが分りません。違いを明確にするために以下の説明文を書きましたが、正しいでしょうか? ---------------------- Cellsはセルを表すコレクションである。Cell(s)と複数形になっている。コレクションはオブジェクトの集合体なので、コレクションCellsはセルオブジェクトの集合体である。Cellsはあくまでコレクションであってオブジェクトではない。 一方、Rangeはセルを表すオブジェクトである。 ---------------------- CellsがコレクションならばCells(Range("A10"))の表記があってもいいと思いますが、実際にはありません。Cells(1,10)です。なぜですか? コレクションCellsとオブジェクトRangeの違いを明確に示す例はありませんか?
- みんなの回答 (10)
- 専門家の回答
みんなの回答
- end-u
- ベストアンサー率79% (496/625)
#自分の文章表現力というか、 #解説力?みたいなもののスキルの低さに自己嫌悪に陥ってますが 読み返してみると『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.aspx #2007からRangesクラスが追加されてますがこれは別。 #WorkbookConnectionオブジェクト対象なので通常は使えません。
- end-u
- ベストアンサー率79% (496/625)
#いや、『参照する』だと余計に解らなくなりますか。 例えば 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プロパティのように単なる値を返すプロパティもあります。 単に、オブジェクトを返すプロパティやメソッドがある。ってだけなんですけどね -"-
- end-u
- ベストアンサー率79% (496/625)
>回答を拝見する限り、プロパティとコレクションは分離されるものではなく >「プロパティでありコレクションでもある」のように見えます。 >そう捉えていいですか? ダメです。 仰ってるのは『Cells は プロパティ であり コレクション でもある』ように見えるという意味ですよね。 私がずっと言ってるのは『Cells は プロパティであり コレクションではない』という事です。 プロパティ と コレクション(オブジェクト)は違います。 >CellsプロパティもItemプロパティもオブジェクトを呼び出す、という事を理解してください。 『CellsプロパティはRangeオブジェクトを返す』 『CellsプロパティによってRangeオブジェクトが呼ばれる』 とか、意味が解りませんか? 『CellsプロパティはRangeオブジェクトを参照する』 だったら解りますかね? あまりゴチャゴチャ書くから解らないんですかね? 最初のレス#3の >ActiveSheet.Cells とした時、CellsプロパティはActiveSheetの『すべてのセル (Range オブジェクト)』を返します。 >という事は >ActiveSheet.Range("A1:IV65536") と書いているのと同じ事です。 これは理解できますか?
- end-u
- ベストアンサー率79% (496/625)
>プロパティについて受けた説明は、オブジェクトの様子、例えばセルの「値」「色」等を表すもの、でした。 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で定義されるプロパティの定義って何?と思ってしまいます。
- end-u
- ベストアンサー率79% (496/625)
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の違い と同じように違う..と言ったら言い過ぎでしょうか。
- end-u
- ベストアンサー率79% (496/625)
>え、何で? ? 何で、と言われても。 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つ重なりませんか?特に問題はないのでしょうか?
- keithin
- ベストアンサー率66% (5278/7941)
ワークシートのセル(単一セル,単一セル範囲,複数のセル範囲)は,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コレクションについて オデッセイコミュニケーションズ発行 Excel VBAベーシック (著者 田中 了)より引用 Cellsは複数形になっていることからコレクションとわかりますが、(中略)、単体のセル(Rangeオブジェクト)の集合体が、ワークシートの全セルを表すCellsコレクションとなります。 回答頂いた内容では例外より上の記述では、Cellsはコレクションとしても無理はないように見えます。 >また,コレクションはオブジェクトです。 例えばコレクションを使った表現Worksheets(sheet1)がオブジェクトである、との意味でしょうか。ならば私もそうだと思います。
補足
最後の概要を読みました。 現状の私の理解と合ってるように思えます。Cellsの記載がないものの、オブジェクト、プロパティ、メソッドに関して、大きな疑問はありません。
- end-u
- ベストアンサー率79% (496/625)
ヘルプを見てもらうと良いのですが <引用> 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 オブジェクトに指定した場合 これ、どういう意味なのでしょうか?ワークシートオブジェクトに指定するというのは具体的には何でしょう?
- mu2011
- ベストアンサー率38% (1910/4994)
>Cellsはセルを表すコレクションである。Cell(s)と複数形になっている。 ⇒NGです。 Cellsは複数形ですが、ただのメソッドでありコレクションでは有りません。 コレクション階層は、Application→WorkBooks(Book)→WorkSheets(Sheet)→Range(Cell)なのでセルのコレクションはRangeです。 >CellsがコレクションならばCells(Range("A10"))の表記があってもいいと思いますが ⇒前述の通り、Cellsはただのメソッドだから、この構文はあり得ません。 >コレクションCellsとオブジェクトRangeの違いを明確に示す例はありませんか? ⇒階層が相違しているので例えられません。
お礼
ありがとうございます。 Cells メソッド でグーグル検索かけると、確かにCellsメソッドが出て来ますね。
- KURUMITO
- ベストアンサー率42% (1835/4283)
Cellsはコレクションとして使われ、Rangeはオブジェクトとして使われますね。常にオブジェクトはコレクションよりも優先して使われますのでCells(Range("A10"))の表記などコレクションの中にオブジェクトが使われるといったことはありません。
お礼
ありがとうございます。 >オブジェクトはコレクションよりも優先して使われます 例えばWorksheets(sheet1)で説明するなら Worksheets コレクション Worksheets(sheet1) オブジェクト の意味と考えていいのでしょうか?
お礼
ありがとうございます。 一度整理して、落ち着いて考えてみます。