今回はExcel VBAでのRangeとCellsの違いについてです。
細かいところは抜きにして、こんな感じに使います。
Rangeの場合
Range("A1").Select ' A1セルを選択 Range("A1").Value = "hoge" ' A1セルの値をhogeにする
Cellsの場合
Cells(1, 1).Select ' A1セルを選択 Cells(1, 1).Value = "hoge" ' A1セルの値をhogeにする
これだけ見ると、使い方はほとんど同じですね。
ちなみに、Cells(行番号, 列番号)です。
すなわち、Range(“B3”)とCells(3, 2)は同じセルを指します。
ほとんど同じ使用感で使用できる理由は、
CellsはRangeオブジェクトを返すため、
どちらを使ってもRangeオブジェクトを操作する感覚で使えるからです。
補足すると、Rangeは(当然ながら)Rangeオブジェクトであるのに対し、
CellsはRangeオブジェクトのプロパティです。
Range オブジェクト (Excel) – MSDN – Microsoft
Range.Cells プロパティ (Excel) – MSDN – Microsoft
例えば、Cells(1, 1)、と書いたら、
これはRange(“A1”)と同じRangeオブジェクトを返すことになります。
一方、RangeとCellsの違いは、
まず1つめとして、
Rangeには「A1」形式(※)でセルを指定するのに対して、
Cellsには「行インデックス(番号), 列インデックス(番号)」形式でセルを指定する、という点があります。
すなわち、Cellsでは数字のみでセルの指定ができます。
この違いは、変数を使ってマクロを書く時には重要で、
多くの場合、
「B3と書け」というよりも、
「3, 2と書け」という方がありがたいでしょう。
※普通の、「B3」とか、「AA13」とかいう指定の方式です。
A1形式が圧倒的に多いと思いますが、Excel VBAには「R1C1」形式というのが存在します。
ピボットテーブルを作る時などには、こちらを使うことになります。
(少なくとも、マクロの記録機能でソースを吐かせるとR1C1形式を使います)
もう1つの違いは、
Rangeは、その名の通り範囲を指定するので、
複数のセルを指定できます。
一方でCellsは、指定の仕方をみればわかる通り、
複数のセルは指定できません。
(こちらの方がより本質的な違いかもしれません)
なので、グラフを作るとかいう場合には、
Rangeを使わざるを得ません。
ここまでをまとめると、
こんな感じです。
Range:範囲指定ができるが、A1形式で指定しなければならない。 Cells:数字(行/列インデックス)でセルを指定できるが、単一セルしか指定できない。
では、虫の良いことに、
「数字で複数のセルを指定したい」
ということはできないのか。
できます。こうです。
Range(Cells(1, 2), Cells(3, 5)).Select
Rangeでの範囲指定は、Range(“B1:E3”).Select、のように、
「:」を使うこともでき、マクロの記録機能ではこちらが使われます。
しかし、Range(Rangeオブジェクト, Rangeオブジェクト)、という使い方もでき、
上の例はこの形式での指定となっています。
変数でセルの範囲を指定させたい場合には、
非常に有力な方法となると思います。
余談ですがこの形式、Rangeオブジェクトは範囲の左上と右下を指している必要はなく、
こんな使い方もできます。
Range(Range("B1:B10"), Range("E3")).Select
これを実行すると、B1からE10までの範囲が選択されます。
範囲の指定が逆転していてもOKで、
Range(Range("E3"), Range("B1:B10")).Select
でもOKです。
以上、Excel VBAでのRangeとCellsの使い分けでした。