VBA入門者の”どっち?” Cells or Range−Cellsでしかできないこと|Excel VBA |
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のループを使うほうが簡潔です
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を選択します。
しかし、このような記述方法はあまり一般的でもありませんし、
可読性の点からも避けるのが賢明といえます。
シート全体のセルを取得するには、インデックスを指定せずにCellsを用います。
Cells.Clear 'シート全体の書式、値を消去します
Cells.EntireColumn.AutoFit 'シート全体の列幅を調整します
また、セルB2からF20といったような特定のセル範囲を対象として使用することもできます。
'B2からF20までの範囲内にあるセルの個数を数えます
MsgBox Range("B2:F20").Cells.Count