ここではマクロでのセル範囲選択について記載します。
セル範囲選択といっても、rangeを使った書き方ならわかるけど、cellsを使う場合はどうすればいいの?
毎回同じ範囲ならいいけど、元データの範囲が毎回変わる場合の記述方法はどうすればいい?
など頭を悩ませている方もいるかもしれません。
このページでは基本的な記述、範囲が変わる場合の指定方法について記載していきます。
基本的な記述
range(”B2:D10″).select
・ cellsを使った書き方
range(cells(2,2),cells(10,4)).select
cellsプロパティはセルを指定するものなので、範囲指定する場合はrangeを使って書くことになります。
1つ目のcellsは範囲指定の左上部分を指定、
2つ目のcellsは範囲指定の右上部分を指定することにより範囲選択となります。
変数を使用した応用編
選択範囲が毎回同じなら、何も構わずrange(“B2:D10”)と範囲指定すれば良いのですが、
ローデータを毎日取得するなどの場合は列は固定でも行数はどんどん増えていったりします
(前述の例でいうと、D10が次の日はD27、その次の日はD80になるなど)。
こういった場合は1番下の行が何行目かを確認して範囲指定します。
※ 1番下の行が何行目かを取得するーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
1番下の行を調べるにはendプロパティを使用します。
endプロパティはエクセルのショートカット「Ctrl + ↑」や「Ctrl + ↓」と同じ動きとなります。
(自動記録でも出てきますね)
引数には下記のいずれかが入ります。
引数 | 方向 |
xlup | 上方向 |
xldown | 下方向 |
xltoleft | 左方向 |
xltoright | 右方向 |
例えば、空白であるセルC40の位置からCtrl + ↑を押すとセルC40より上の行で、最初にデータが入っているセルが選択されると思います。
これをマクロで書くと
cells(40,3).end(xlup)
セルC40からCtrl + ↑を押す
という記述になります。
今回のマクロは最終の”行”が知りたいので
cells(40,3).end(xlup).row
セルC40からCtrl + ↑を押したときの行
これで行数が取得できます。
行数を取得するための変数を使用して書くと下記のようになります。
dim maxRow
maxrow = cells(40,3).end(xlup).row
msgbox maxrow
end sub
※ 40行目じゃ全然足りないよ!だと思うので、40の部分を”rows.count”にするとシートの行数をカウントした数になる(約100万行)のでrows.countを使用しましょう。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
1番下の行が何行目かを取得できたら、cellsで範囲指定すればOKです。
range(cells(2,2),cells(maxRow,4)).select
なぜEndプロパティを使う際にEnd(xlup)を使用するのか
先頭行からEnd(xldown)ではいけないの?という疑問がわくかもしれません。
これはケースバイケースなのですが、End(xldown)をする対象の列が絶対空白セルがないと言い切れる場合にはEnd(xldown)でよいと思っています。
私の場合は万が一を考えて、End(xlup)を使用しています。
よければ参考にしてみてください。