VBAでセルを指定する時、Rangeオブジェクトを使うことが多いですが、For文と組み合わせて使いづらいという欠点があります。Rangeオブジェクトは文字列で、しかもアルファベットを含んでいるので結構大変です。
しかしVBAのCellsは行と列を両方とも数字で指定するので、For文との親和性がとても高いのです。Cellsは上位オブジェクトがなにかで挙動が変わりますのでそれについても解説します。
VBAのCellsを使いこなす
使い分けとして、Cellsは基本的に「1つの」セルを指定します。1つ以上のセルを指定するのがRangeです。Rangeの使い方はRangeの記事をご覧ください。いつもどおり九九のVBAを下敷きにしますのでわからない方はForの記事をどうぞ。
1.Cellsオブジェクトとは
CellsはWorksheetオブジェクトに用意されているオブジェクトです。Cellsをいきなり書いた場合Cellsの前には「Activesheet」を付加してVBAは解釈します。
省略して書いた場合、何が補完されるのかというのは大事な問題ですので不安な方は確認して下さい。
構文は基本的にCells(RowIndex, ColumnIndex)です。
2.サンプルコードを書く
今回のサンプルは九九のコードを下敷きにします。なんのことかわからない方は<こちら[25_Forへのリンク]> をどうぞ。
Sub sumple()
Dim i As Integer
Dim j As Integer
For i = 1 To 9
For j = 1 To 9
Cells(i, j) = i * j
Next j
Next i
End Sub
For j = 1 To 9
Cells(i, j) = i * j
Next j
Next i
End Sub
このコードで使用しているのがCellsオブジェクトです。CellsのRowIndexは普通のシートと同じですが、ColumnIndexはA列が1,B列が2というふうに対応しています。
3.Cellsの上位オブジェクトを指定する
上位オブジェクトに指定できるのはVBAのWorksheetオブジェクトか、Rangeオブジェクトです。
今回は「$B$2:$J$10」を指定します。余談ですが、このような時、「選択してイミディエイトウィンドウ」が便利だと思います。
イミディエイトウィンドウにSelection.Addressと打つとEnterでアドレスが取得できます。
取得したアドレスでマクロを修正します。
Sub sumple()
Dim i As Integer
Dim j As Integer
For i = 1 To 9
For j = 1 To 9
Range(“$B$2:$J$10”).Cells(i, j) = i * j
Next j
Next i
End Sub
For j = 1 To 9
Range(“$B$2:$J$10”).Cells(i, j) = i * j
Next j
Next i
End Sub
実行した結果がこちらです。
上位オブジェクトを指定するということは「Cellsオブジェクトが見る領域」を指定するということです。
省略した場合はシート全体でしたのでCellsからみた1行目とワークシートの1行目が一致していましたが、上位オブジェクトを指定した場合、Cellsからみた1行目とワークシートの1行目が一致するとは限りません。
今回はCellsオブジェクトの解説をしました。上位オブジェクトを指定することでとても柔軟なVBAのコードが書けるようになります。
柔軟性をもたせる意味でなくてもデフォルトオブジェクトをまったく意識しないのはバグの温床になりますので、注意して記述してください。