選択範囲のループの書き方はセル単位と行単位と列単位で異なる
選択範囲のループは大きく3つの書き方をします。
全てのセルをループするセル単位か、行単位か、列単位か、です。
いずれの場合でも必要になるのがセル選択範囲を示すSelectionプロパティです。
コードで書くとこんな感じですね。
1 2 3 4 5 |
Sub GetSelection() Dim r As Range Set r = Selection End Sub |
このときに、選択範囲のセル1つずつループする場合はSelectionプロパティをそのまま使って以下のような感じで書きます。
1 2 3 4 5 6 7 |
Sub SelectionCellLoop() Dim r As Range For Each r In Selection Debug.Print r.Address Next End Sub |
しかし1セルずつではなく、1行ずつや1列ずつループして処理したい場合があります。
そういう場合の書き方について紹介します。
セル選択範囲を1行ずつまたは1列ずつループする場合の書き方
セルの選択範囲を1行ずつ、または、1列ずつループしたい場合は以下のようなコードを書きます。
コード概要
まず範囲の先頭と最終の位置を取得し、その範囲をループする、という書き方になります。
2行5列を選択している場合であれば、行ループは2回、列ループは5回ループすることになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
Sub SelectionRowLoop() Dim iRowStart '// 先頭行 Dim iRowEnd '// 最終行 Dim iColStart '// 先頭列 Dim iColEnd '// 最終列 Dim i '// ループカウンタ Dim rSelect As Range '// SelectionプロパティをRangeオブジェクト変数として取得 Set rSelect = Selection '// 先頭、最終の行と列を取得 iRowStart = rSelect.Row iRowEnd = rSelect.Rows.Count + iRowStart - 1 iColStart = rSelect.Column iColEnd = rSelect.Columns.Count + iColStart - 1 '// 行ループ For i = iRowStart To iRowEnd '// 1行ごとに枠線を設定 If (i Mod 2 = 0) Then Call Range(Cells(i, iColStart), Cells(i, iColEnd)).BorderAround(Weight:=xlThick, Color:=RGB(80, 100, 210)) End If Next '// 列ループ For i = iColStart To iColEnd '// 1列ごとに背景色を設定 If (i Mod 2 = 0) Then Range(Cells(iRowStart, i), Cells(iRowEnd, i)).Interior.Color = RGB(210, 150, 40) End If Next End Sub |
実行結果
1. セル範囲を選択します。
2. 上の関数を実行します。実行後、1行ごとに枠線が設定され、1列ごとに背景色が設定されます。見やすいように選択状態をはずしています。
コード説明
行または列をループするためにはどこからどこまでループするのかを決める必要があります。行ごとにループする場合はセル選択の先頭行から最終行へループし、列の場合も同様に先頭列から最終列へループします。そのため事前にセル選択範囲の先頭行、最終行、先頭列、最終列を取得します。13行目から17行目の部分です。
セルの入力範囲で判定したい場合の先頭と最終の取得方法は「VBAで編集セル範囲の選択と最終行と最終列の取得」に詳細を書いていますのでご参照ください。
あとは行でループしたい場合は先頭行から最終行へループするようなFor文やDo文を書きます。列ループの場合も同様で先頭列から最終列へのループ構文を書きます。サンプルの19行目や27行目です。
行範囲や列範囲を指定したい場合はループ内の「Range(Cells(), Cells())」のように書きます。サンプルでは20行目や25行目です。行ごとのループの場合は列の先頭と最終は変わらないため、Cellsメソッドの2番目の値はループ中同じです。同様に列ごとのループの場合は行の先頭と最終であるCellsメソッドの1番目の値はループ中同じにします。
あとはループ内でどういう処理を行うのかは適宜書いていくことになります。
サンプルで行ループの場合は1行ごとに枠線を設定しています。BorderAroundは線の種類、太さ、色などを1度に設定できるメソッドです。「罫線の種類と太さと色をまとめて設定する」に詳細を書いていますので必要な場合はご参照ください。
列ループの場合は1列ごとに背景色を設定しています。ここではColorIndexプロパティを使っていますが、他にもColorIndexプロパティやスタイルでの設定ももちろん可能です。
スタイルの設定は以下で詳細をご参照ください。
「セルのスタイルの設定と取得」
「セルのスタイルの追加」
「セルのスタイルの削除」
「セルのスタイルの参照」