即効テクニック |
単体のセルを表すRangeオブジェクトを参照します。Objectにはワークシートを指定します。Rangeプロパティと同じく、Objectの指定を省略したときにはアクティブシートが対象となります。Row、Colは、それぞれワークシートでの行、列の座標になります。 構文 Object.Cells(Row, Col) 取得のみ 設定項目 内容 Object Application,Worksheet,Rangeオブジェクト [省略可能] Row 対象セルの行を表す整数[省略可能] Col 対象セルの列を表す整数[省略可能] 次のサンプルは引数を2つとも指定した場合の例です。●サンプル1●
Sub CellsSamp1() Dim i As Integer '----変数iの値が1〜5の範囲で変化します For i = 1 To 5 '----(1)Objectがシートの場合 Cells(2, i).Value = i '----(2)ObjectがRangeの場合 Range("A4:B5").Cells(i, i).Value = i * 100 Next i Range("A4:B5").Select End Sub
(1)のステートメントではObjectを指定していませんから、対象はアクティブシートになります。2行目、i列のセルに対して、1から5までの値を入れていきます。(2)のステートメントでは、ObjectがRangeオブジェクトになっています。この場合、指定されたセル範囲の左上のセル=A4の位置を基準に座標が振りなおされます。セル範囲の広さには影響を受けません。サンプルで示したように、ループ処理の中で参照先セルを変えていくような場合に便利です。 ●注意● Row引数は1〜65,536、Col引数は1〜256までの値で設定しなくてはなりません。この理由は、勿論、その範囲を超える番地にはセルが存在しないからです。もし、超えた値を指定した場合にはエラーが発生します。 引数を1つしか指定しない場合、A1から列方向にインデックスが振られます。●サンプル2●
Sub CellsSamp2() Cells(256 * 0 + 1) = 1 '----256で1行目終わり、2行目へ Cells(256 * 1 + 2) = 2 '----256×2で2行目終わり、3行目へ Cells(256 * 2 + 3) = 3 End Sub
上記のサンプルを実行すれば、列方向に順に参照していっていることがわかります。なお、ObjectにRangeオブジェクトを指定した場合の動作は、引数を2つ指定した時とは異なりますので注意が必要です。次のサンプルを見てください。●サンプル3●
Sub CellsSamp3() Dim i As Integer '----変数iの値が1〜10の範囲で変化します For i = 1 To 10 '----A1〜B3の列数=2 Range("A1:B3").Cells(i).Value = i Next Range("A1:B3").Select End Sub
実行結果を見ればわかりますが、指定したRangeオブジェクトの列数をキーにして、インデックスを振っています。 また、Rangeプロパティとの組み合わせで、両プロパティの特徴を活かしたプログラミングが可能です。●サンプル4●
Sub CellsSamp4() Dim i As Integer i = 5 Range(Cells(1, 1), Cells(i, i)).Value = "ABC" End Sub
変数iの値に応じて、セルA1と変数iで指定されるセルに囲まれたセル範囲に"ABC"という値を入力しています。なお、アクティブシート以外を対象にこのような処理を記述する場合には、注意が必要です。例えば、"ABC"の入力先がアクティブでない"Sheet3"である場合、次のステートメントではエラーとなります。
Worksheets("Sheet3").Range(Cells(1, 1), Cells(i, i)).Value = "ABC"
意図した動作にするには、次のように記述します。Cellsプロパティの前に「.」がついていることに注目してください。
With Worksheets("Sheet3") .Range(.Cells(1, 1), .Cells(i, i)).Value = "ABC" End With
このように記述することで、Cellsプロパティは"Sheet3"を参照するようになります。 ●ポイント● 引数に何も指定しない場合、Objectがワークシートの時には、ワークシートの全セルを参照します。シートの全てのセルを対象に操作をしたい場合には、RangeプロパティではなくCellsプロパティを使用してください。