見出し画像

ExcelVBAでCellsとRangeどちらを使うべきか

ITサポーターTsuchidaの土田です。

ExcelVBAで最もよく使うのはセルに対しての操作なので、セルに関するオブジェクト式です。ExcelVBAでセルを指定するオブジェクト式に、CellsプロパティとRangeプロパティの2つがあります。範囲を表す場合は、Rangeプロパティなのですが、1つのセルの場合はCellsプロパティとRangeプロパティをどちらも使うことができます。私の場合は1つのセルの指定は9割がたCellsプロパティを使いますが、ネットなどを見ていると案外Rangeプロパティを使っているのを見かけます。

VBAの処理前からセルの場所が決まっている場合には、Rangeプロパティで何の問題ありませんが、処理中にセルの場所が変化する場合には必ずCellsプロパティを使います。

Rangeプロパティは、Range(”A1”)という記述で、クォーテーションで囲われている箇所は文字列になり、文字列でセルを指定します。

Cellsプロパティは、Cells(1, 1)という記述で、行番号・列番号の順で数値でセルを指定します。数値で指定できるということは、繰り返しの処理で計算しながら指定する場合に向いているのです。

繰り返しの処理でRangeプロパティを使うときはこんな感じになります。

Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim i As Long

Set ws1 = ActiveSheet
Set ws2 = Sheets.Add(after:=ws1)

For i = 1 To ws1.Range(”A1”).End(xlDown).Row
ws2.Range("A" & i).Value = ws1.Range("A" & i).Value
ws2.Range("B" & i).Value = ws1.Range("B" & i).Value
Next

結果としてCellsプロパティと同じようなことができるのですが、変数iの計算結果を"A"という文字列に結合するため文字列変換して、その文字列にしたセルアドレスに対応する行と列を見つけ出します。セルを見つけ出すまでに実はたくさんの処理をしているのです。最終行を下から見つけることができないため、繰り返しの途中で行挿入すると処理が中断することもあり得ます。

人間にとってはA1という形式に慣れているため、Rangeプロパティの方がわかりやすいですし、マクロ記録ではRangeプロパティで記録されます。コンピュータは人間とは逆に文字より数値の方がわかりやすいので、Cellsプロパティで指定された方がわかりやすいのです。Offsetプロパティなど多くの場合は、行・列の順番で指定します。他のプロパティに合わせる意味でも、行・列の順番になっているCellsプロパティを使うことが望ましいのです。

一般的に行は繰り返し処理で計算することが多くて、列は計算せずに固定で使うことが多くてわざわざ列を数えるのが面倒という場合には、実は裏技があります。例えばAA列っていくつかを指で数えるのは面倒ですよね。アルファベットが26種類なので、AAなら次の27と数える人もいるかもしれませんが、AB・ACと列が後ろになれば数値で指定するには数えなければいけません。そこでCellsプロパティでは列は数値以外に文字列でのしてもできるのです。

Cellsプロパティでは、Cells(i, 27)とCells(i, "AA")で同じ働きをします。
列番号が数字だとわかりづらいという人は、Cellsプロパティの列をアルファベットで指定することをお勧めします。

CellsプロパティとRangeプロパティはExcelVBAの一番の基本となります。Excelって指示をどう与えれば動くんだろう考えるようになると、ExcelVBAのスキルが上がってきます。マクロ記録の延長でExcel操作の代替から、アウトプットを作り出すためのプログラミングツールに代わります。

VBAに関する質問の掲示板を公開にしていますので、VBAでわからないことがあれば掲示板をご利用ください。

https://note.com/it_supo_tsuchi/circle/boards/7fcf9b7cba2d/posts/304e601878bc


この記事が気に入ったらサポートをしてみませんか?