RangeとCellsの使い方

初級VBA

はじめに

 RangeCellsはセルを指定するのによく使います。
 引数の指定が違うものの、まったく同じ使い方ができるので、プログラマーによってRangeのみを使う派やCellsのみを使う派がいたりします。
 筆者も以前はCells派で、セルの複数選択が必要な場合にしかRangeを使う事はありませんでした。

RangeとCellsの使い方

 基本的なRangeとCellsの使い方です。

単一セルの指定

 Range(“セルの位置”)  ”A1″などと文字列で指定します。
  例:Range(“A1”)

 Cells(行番号 , 列番号)   1行目1列と2つの引数で数値指定
                 列はアルファベット文字も可。
  例:Cells( 1 , 1 ) 又は、Cells( 1 , “A” )

複数セルの指定

 Range(“セルの範囲”)  ”A1:C5″などと複数のセル範囲を指定できます。
  例:Range(“A1:C5”)

 Range(セルの始点 , セルの終点  2つの引数で始点と終点を指定して範囲指定
  例:Range( Range(“A1”) , Range(“C5”) )
    Range( Cells(1 , 1) , Cells(5 , 3) )

相対位置指定(Offset)

 Offset( 行移動 , 列移動)  行移動、列移動は0が基準でマイナス値も使えます。
  例:Range(“A10”).Offset(-1 , 0).Select –> A9セルが選択されます。

 Cellsも相対位置指定に利用できます。
 こちらは行移動、列移動は1が基準で、マイナス値も使えます。
 (1が基準なので0を指定すると1つ少なくなるので注意)
  例:Range(“A10”).Cells(0 , 1).Select –>  A9セルが選択されます。

範囲拡大(Resize)

 Resize(行方向拡大 , 列方向拡大)
 元のセル範囲の開始セルから行方向と列方向にそれぞれ範囲を拡大します。
  例:
   Range(“A10”).Resize(1, 2).Select  –> A10:A11が選択されます。
   Range(“A10:A11”).Resize(1, 2).Select  –> A10:B10が選択されます。
 
 2例目は、A10セルを基準として、1行、2列分となるため、A11は選択されない事になります。
 範囲拡大と言っても、開始セルからの拡大であることに注意しましょう。

どうやって使い分けるか?

 筆者は、RangeとCellsの使い分けを明確に分けて使うようになりました。
 基準となるのは、「後から見て分かり易いか」「使いやすいか」の2点です。
 そもそも、RangeとCellsには明確な性格があります。
 ・Rangeオブジェクトは絶対的な位置指定
 ・Cellsオブジェクトは相対的な位置指定

 という点です。
 
 セルを読み込む際、固定的な場合はRangeを、For文の中など参照が移動する場合はCellsを使うように心がけています。 例を挙げてみます。

 図のようなシートがあった時、プログラムコードは以下のようになります。

Sub macro()
    Dim i As Long
    Dim total As Long
    Dim tax As Double
    tax = Range("F2") / 100
    total = 0
    For i = 4 To 8
        If Cells(i, "B") <> "" Then
            Cells(i, "D") = Cells(i, "C") * tax
            Cells(i, "E") = Cells(i, "C") + Cells(i, "D")
        End If
        total = total + Cells(i, "E")
    Next i
    
    Range("E10") = total
End Sub

 消費税合計金額は、参照が変化しませんのでRangeを使いFor文内部では参照が変化するのでCellsを使っています

Rangeで相対位置を得る方法

 Rangeは絶対的な位置を表現するのが得意ですが、Cellsのように相対的な位置の取得もできなくはありません。

 Range( “A” & i )

 上記のようにして変数( i )に値を渡せば、行をループさせることができます。
 また、この書き方ですと列方向はアルファベットで序数ではないので書き現わせません。
 そのような時は、Offsetを使います。
 
 Range( “A1” ) .Offset( 0, i )
 
 Offsetは、元の位置を (0,0) として書き、引数は(行 , 列) となりますので、同じく変数を充てる事が出来ます。
 また、あまり見かけませんが、Cellsを置く事もできます。
 
 Range( “A1” ) .Cells( 1, i +1 )
 
 Cellsは、元の位置を (1,1) として書きます。Offsetとは異なりますので注意してください。

 Cellsは、Rangeの子オブジェクトと言えます。Rangeを省略した場合、A1セルを基準として機能していると覚えておけば良いでしょう。

Rangeで動的に複数範囲を取得する

 Rangeでは複数範囲を選択する事が出来ますが、その起点と終点のセルがプログラム内で動的にきまる時は、以下のように起点と終点にCellsを配する事ができます。

  Range(Cells(1, 2), Cells(2, 3)) —> Range(“B1:C2”)と同じ意味

 この書き方は良く出てきますので覚えておくと良いでしょう。

Cellsで複数セルを選択する方法

 Cellsは基本的に1つのセルを選択する事になりますが、Resizeを使えば選択範囲の拡張ができるので、複数選択が可能になります。
 
 Cells(1, 1).Resize(2, 2)
 
 これは、Range(“A1:B2”)と同じ意味となります。

まとめ

 Rangeしか使わない、Cellsしか使わないと意固地なってもVBAはそれなりに柔軟性があるのでカバーできるようです。
 ただ、「後から見てイメージしやすい」「他人が見ても分かりやすい」という事は後々手直しが必要になった時に大きな意味を持つと思います。
 
 RangeとCellsは、上手く使い分けるように心がけましょう。

タイトルとURLをコピーしました