操作の対象セル範囲をあらかじめ選択してから実行するようなマクロでは、ユーザーが選択したセル範囲を自由に操作できないと困ります。選択されているセル範囲は
Selectionで表されますので、このSelectionをからいろいろな情報を導き出します。
たとえば、下図のように選択したとします。
アドレスでいえば「C5:E9」です。
選択範囲の左上セルと右下セルは、比較的簡単に特定できます。
左上のセルは、選択された範囲の中で1番目のセルなので、
Selection(1)となります。
右下のセルは、選択された範囲の中で最後のセルです。
最後とは、この例でいうと15番目です。選択されているセルが全部で15個だからです。
したがって、右下のセルはSelection(15)となるのですが、この15は要するに「選択されているセルの個数」です。
つまり
Selection.Countですね。なので、右下のセルは
Selection(Selection.Count)で特定できます。
次に、この選択範囲は「何行×何列」の大きさでしょう。
これも簡単です。行数は
Rows.Countでわかりますし、列数は
Columns.Countです。
では、大きさではなく「何行目から何行目まで」あるいは「何列目から何列目」までが選択されているでしょう。
先に答えをいうと、この例では「5行目から9行目まで」と「3列目から5列目」までですね。
5行目というのは「先頭セルの行位置」であり、9行目は「最終セルの行位置」です。
同じように、3列目は「先頭セルの列位置」で、5列目は「最終セルの列位置」です。
ここまでわかれば簡単ですね。
5行目 → Selection(1).Row
9行目 → Selection(Selection.Count).Row
3列目 → Selection(1).Column
5列目 → Selection(Selection.Count).Column
もし、このセル範囲を行単位で処理するのでしたら、次のようになります。
Sub Sample1()
Dim i As Long
For i = Selection(1).Row To Selection(Selection.Count).Row
''行単位の処理(たとえば)
Cells(i, 3) = i
Next i
End Sub
このへんまでわかれば、たいていのことはできますね。
じゃぁ、ついでに右上セルと左下セルも特定しちゃいましょうか。
右上セルとは、左上セルから右へ2列移動したセルです。
左上セル から 右へ2つ移動したセル
↓
Selection(1) から 右へ2つ移動したセル
↓
Selection(1).Offset(0,2)
で、この2とは「全体の列数-1」です。全体の列数はSelection.Columns.Countでしたね。
まとめると、右上のセルは
Selection(1).Offset(0,Selection.Columns.Count-1)
となります。同様に左下のセルは
Selection(1).Offset(Selection.Rows.Count-1,0)
です。
では、選択したすべてのセルを1つずつ操作してみましょう。これは、そんなに難しくありません。