HOME > 即効テクニック > Excel VBA > その他関連のテクニック > VBA入門者の”どっち?” Cells or Range−Cellsでしかできないこと

VBA入門者の”どっち?” Cells or Range−Cellsでしかできないこと|Excel VBA

その他関連のテクニック

VBA入門者の”どっち?” Cells or Range−Cellsでしかできないこと

(Excel 2000/2002/2003/2007/2010)

■Cellsでしかできないこと■

  1. 行列ともに変数を指定してセルを取得する
  2. 特定のセル範囲内で相対指定でセルを取得する
  3. シート全体、あるいは特定のセル範囲全体をあらわす

○1.行列ともに変数を指定してセルを取得する○

Cellsプロパティでは・・・

Cells(行インデックス、列インデックス)

というように、行列ともに数値指定できるためループ構造の中で行、あるいは列、
またあるいはその両方が変動する場合などにCellsが威力を発揮します。

下記の例ではセルA1からE10までの各セルにセルのアドレスを書き込みます。

Dim i As Integer, j As Integer

For i = 1 To 10
    For j = 1 To 5
        Cells(i, j).Value = Cells(i, j).Address
    Next j
Next i

※セルにアドレスを書き込むだけならばFor Eachのループを使うほうが簡潔です

○2.特定のセル範囲内で相対指定でセルを取得する○

Cellsによるセルの指定は何もセルA1を基準としてインデックスを数えるとは限りません。
例えば、セルB2からF10の範囲内で2行3列目(D3)と指定するとすると・・・

Range("$B$2:$F$10").Cells(2, 3).Select
とか・・・

Dim Rng As Range
Set Rng = Range("$B$2:$F$10")
Rng.Cells(2, 3).Select

のように記述することができます。
この場合も、行列のインデックス指定ができる特性から、
特定のセル範囲の中でループ処理を行うときに使うと効果的な場合もあります。

※正確にはRangeも相対指定で利用できます。

(例)Range("$D$1:$G$10").Range("A1").Select

はシート上のセルD1を選択します。
しかし、このような記述方法はあまり一般的でもありませんし、
可読性の点からも避けるのが賢明といえます。

○3.シート全体、あるいは特定のセル範囲全体をあらわす○

シート全体のセルを取得するには、インデックスを指定せずにCellsを用います。

Cells.Clear     'シート全体の書式、値を消去します
Cells.EntireColumn.AutoFit 'シート全体の列幅を調整します

また、セルB2からF20といったような特定のセル範囲を対象として使用することもできます。

'B2からF20までの範囲内にあるセルの個数を数えます
MsgBox Range("B2:F20").Cells.Count