VBAでのRangeとcellsの使い分け方をまとめました
18/11/11 15:31:49 19/01/13 12:38:40
VBAはエクセル、ワード、パワーポイント、などのマイクロオフィス製品で使用できるプログラミング言語です。基本的な手続き部分のロジックはWeb系のプログラミング言語などに比べても大差ないのですが、事務処理に特化していることや、エクセルだと特にセルの概念が出てくるので記述に特殊性があります。
そのVBAの特殊性の代表的なものがRangeやCellsです。これらのコードはセルに対して処理を行う際に使用する概念なのですが、使い分けがよくわからない、そもそもどう違うのかがよくわからない、といった声も多いようです。
そこでこのページでは、VBAにおけるRangeとCellsの違いや、使い分け方について解説していきます。
RangeとCellsの基本的な違い
詳細な使い分けについては後述しますが、まずは基本的な違いを説明します。RangeとCellsの基本的な違いは、読んでそのままです。Cellsはそのままセルを意味しており、Rangeは和訳すると「範囲」です。
つまり、Cellsが単一のセルや複数のセルに対して処理を行うのに対し、Rangeは隣接した一定範囲のセルを選択して処理するためのコードになります。このような概念上の違いがあるのですが、実際は書き方を変えればCellsでもRangeでも同じ処理ができる場合がほとんどです。
そのため多くの書籍やWebサイトではCellsとRangeをどう使い分けるのが効率的か、といった観点で解説されているのですが、もともとの定義上の違いは上記の通りだということです。
解説されているものは具体的なRangeとCellsの使い分けが多いため、結局どう違うの?判断基準は?といった疑問が解消されないかもしれません。なぜなら、具体的な使い方を見ても、新たにコーディングしたいものと合致するとは限らないからです。
そういうときは、上で説明した通りRangeは範囲、Cellsは単一セル、もしくは複数セルに対して処理を掛けるためのコード、という前提を思い出すと良いでしょう。この前提を意識しておけば、個々の具体的な処理に惑わされることが少なくなります。
Rangeの使い方
RangeとCellsの定義上の違いを踏まえて、次にRangeの使い方について説明します。Rangeの構文は以下のようになります。
Range("セル")
例として値を入れてみると、
Range("A1")
この記述で単一のセルを選択できます。単一のセルを指定するとCellsとの違いがややこしいのですが、あくまでもRangeでも単一セルを指定できるというだけで、実際は範囲指定するのが本来のRangeの使い方になります。
範囲指定する書き方は以下です。
Range("開始セル:終了セル")
例として値を入れてみると、
Range("A1:B3")
このように記述することで、A1~B3の範囲を選択しました。エクセルシート上で実際に選択するための書き方は以下です。
Sub RangeSelect()
Range("A1:B3").Select
End Sub
このコードによって、A1~B3の範囲を選択することができます。ちなみに単一セルの方では処理の例を書きませんでしたが、Rangeの後ろのかっこのなかが一つのセル指定になるだけです。
また、複数範囲のセルをRangeで指定することもできます。複数範囲というのは、セルが飛ぶということです。書き方としては以下の構文です。
Range("開始セル:終了セル, 開始セル:終了セル")
このようにカンマで区切ると、複数の範囲を指定できます。単一範囲でも複数範囲でもそれほど変わらないので処理の例は不要かもしれませんが、一応書いておくと以下のようになります。
Sub RangeSelect()
Range("A1:B3, C1:D4").Select
End Sub
このように記述すると、A1~B3、C1~D4と飛び飛びでセルを範囲選択することができます。選択だけでなく、当然色を変えたり値を格納することも可能です。ちなみに今回のテーマとはズレるので詳細は割愛しますが、範囲選択してそれに名前を付けて、Rangeで指定することも可能です。
Range("範囲名")
この書き方なので、特に難しい点はないかと思います。
Cellsの使い方
次に、Cellsの使い方について解説します。Cellsの構文は以下のようになります。
Cells(行インデックス, 列インデックス)
具体的に値を入れてみると、
Cells(1, 2)
もしくは
Cells(1,B)
このように記述すると、1行目のB列を指定したことになります。列は数字で指定してもアルファベットで指定してもどちらでも問題ありません。また、行と列を誤って逆にして解説しているサイトもあるので、混乱しないよう注意してください。
使用例は以下です。
Sub CellsSelect()
Cells(1,2).select
End Sub
このように記述すると、エクセルシートの1行目B列を選択することができます。あと混乱するのであえて記述例は出しませんが、行の方をアルファベットで指定する、もしくは両方アルファベットで指定することも可能です。
なぜなら、Aから順番に数字に対応するように設計されているからです。ただしややこしいだけなので、そのような記述をすることはまずありません。アルファベットを使用するにしても、列だけ使用するのが一般的です。
またこれができるせいでRangeとCellsの概念が余計に混同されがちなのですが、Cellsはシートのセル全体を指定することも可能です。具体的には以下のようなコードになります。
Sub CellsAll()
Cells.Select
End Sub
要するに、Cellsの後ろをかっこも何も付けずに指定をしないと、すべてのセルに対して指定を行います。Rangeはこのような使い方はできないので、結局のところRangeとCellsのどちらが広範囲指定向きなのかよくわからなくなってしまうのです。
基本的には、Cellsは単一セル指定向きのコードですが、全体にも処理を掛けられる。Rangeは単一セルを指定することもできるが、基本的には範囲選択するためのコード、といった考え方で良いかと思います。
また、Cellsは単一セルに処理を行いながらループで加算していくことも可能なので、ループの変数をインデックスにして処理が行われることも多いです。イメージとしては、Cells(i,j)のような形です。
これで二重ループで回していけば、セルに順番に数字を入れていくような処理を簡単に実装できます。複数セルに一気に同じ数字を加算したいときなどはRangeの方が便利なので、CellsとRangeはどちらも事務処理などで大活躍するコードと言えるでしょう。
最後に、RangeのなかにCellsを入れ込んで指定することも可能です。
Range(Cells(1,1), Cells(2,2))
このように記述すると、RangeとCellsを組み合わせて使用できます。繰り返し処理などで範囲を移動させながら処理していきたい場合、RangeのなかにA1などのセル指定をしていると加算したり減産することができません。A1にA1を足してB2のような記述法があれば良いのですが、そのような面白いコードはありません。
RangeのなかにCellsを入れれば、範囲選択したままCellsのかっこのなかの数字を変えながら処理できます。以上、RangeとCellsの使い分け、組み合わせて使う方法を紹介してきました。
人気記事