入力しているセル範囲の選択と、最終行と最終列の取得
シートの操作をVBAで行う際に、入力されているセルで一番左上から一番右下の範囲を選択する、という場合があります。
処理範囲を小さくして高速化を目的としたり、どこからどこまでを処理するのかを明示する場合などが用途として挙げられます。
この方法には3つあります。
- 1つ目はUsedRangeを使う方法です。VBAで実装する場合はこれが一番ラクだと思います。ショートカットはありません。
- 2つ目はSpesialCellsを使う方法です。ショートカットShift + Ctrl + Endで同じことができます。
- 3つ目はCurrentRegionを使う方法です。こちらもショートカットShift + Ctrl + *で同じことができます。
これら3つの方法は挙動が似ているのですが、やはり違いがあります。
これらの挙動とそれぞれの最終行、最終列の取得方法を以下に説明します。
なお、上記はセル範囲がまだ選択されていない状態でどのようにセル範囲を選択するか、という内容ですが、すでにセル範囲が選択された状態での最終行、最終列の取得方法も説明します。
1. UsedRangeでの書き方
セル範囲の選択
UsedRangeは編集されているセル範囲を選択します。
VBAの場合は以下のような書き方になります。
1 |
ActiveSheet.UsedRange.Select |
最終行、最終列の取得
最終行と最終列の取得は、以下のようにそれぞれ先頭行と行数、先頭列と列数から算出します。
最終行と最終列の取得だけをしたいのであればセル範囲の選択は不要です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Dim iRowStart '// 先頭行 Dim iRowCount '// 行数 Dim iRowEnd '// 最終行 Dim iColStart '// 先頭列 Dim iColCount '// 列数 Dim iColEnd '// 最終列 '// 先頭行 iRowStart = ActiveSheet.UsedRange.Row '// 行数 iRowCount = ActiveSheet.UsedRange.Rows.Count '// 最終行 iRowEnd = iRowCount + iRowStart - 1 '// 先頭列 iColStart = ActiveSheet.UsedRange.Column '// 列数 iColCount = ActiveSheet.UsedRange.Columns.Count '// 最終列 iColEnd = iColCount + iColStart - 1 |
2. SpesialCellsでの書き方
セル範囲の選択
SpesialCellsはそのシートの中で一番右下のセルまでが選択されます。
以下の例ではG16セルがシートの一番右下の入力セルで、B3セルを選択した状態でショートカットShift + Ctrl + Endを押すとG16セルまでを選択します。
VBAの場合は以下のような書き方になります。
1 |
Range(("B3"), ActiveCell.SpecialCells(xlLastCell)).Select |
SpecialCellsでの方法は、左上のセルを指定しなければなりません。
また、行や列の削除をした場合に問題があります。
それは、なぜか削除前の状態で範囲選択されてしまうという問題です。
行の挿入やセルのコピペでは発生しないため、個人的にはExcelのバグ(削除時の対応漏れ)だと思います。
この問題は行や列を削除後にいったん保存をすることで回避できます。
そうすると行や列を削除後の状態で正しく選択されます。
ただ、Excelブックによってはなんらかの理由により保存が出来ない、もしくは保存が禁止されている場合もありますので、そういう場合は新規ブックを作成するなどの措置が必要です。
面倒ですね。
最終行、最終列の取得
最終行と最終列の取得は、以下のようにそれぞれ先頭行と行数、先頭列と列数から算出します。
最終行と最終列の取得だけをしたいのであればセル範囲の選択は不要です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Dim iRowStart '// 先頭行 Dim iRowCount '// 行数 Dim iRowEnd '// 最終行 Dim iColStart '// 先頭列 Dim iColCount '// 列数 Dim iColEnd '// 最終列 '// 先頭行 iRowStart = Range(("B3"), ActiveCell.SpecialCells(xlLastCell)).Row '// 行数 iRowCount = Range(("B3"), ActiveCell.SpecialCells(xlLastCell)).Rows.Count '// 最終行 iRowEnd = iRowCount + iRowStart - 1 '// 先頭列 iColStart = Range(("B3"), ActiveCell.SpecialCells(xlLastCell)).Column '// 列数 iColCount = Range(("B3"), ActiveCell.SpecialCells(xlLastCell)).Columns.Count '// 最終列 iColEnd = iColCount + iColStart - 1 |
3. CurrentRegionでの書き方
セル範囲の選択
CurrentRegionは空白セルに囲まれた一番右下のセルまでが選択されます。
以下の例では、G16セルがシートの一番右下の入力セルですが、C4セルからG8セルまでが空白セルで囲まれており、C4からG8セルのどこかでショートカットShift + Ctrl + *を押しても、シートの一番右下のG16までは選択されません。
VBAの場合は以下のような書き方になります。
1 |
Range("D5").CurrentRegion.Select |
シート全体で一番右下の編集セルを確実に選択したい場合にはちょっと使いづらいと思います。
最終行、最終列の取得
最終行と最終列の取得は、以下のようにそれぞれ先頭行と行数、先頭列と列数から算出します。
最終行と最終列の取得だけをしたいのであればセル範囲の選択は不要です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Dim iRowStart '// 先頭行 Dim iRowCount '// 行数 Dim iRowEnd '// 最終行 Dim iColStart '// 先頭列 Dim iColCount '// 列数 Dim iColEnd '// 最終列 '// 先頭行 iRowStart = Range("D5").CurrentRegion.Row '// 行数 iRowCount = Range("D5").CurrentRegion.Rows.Count '// 最終行 iRowEnd = iRowCount + iRowStart - 1 '// 先頭列 iColStart = Range("D5").CurrentRegion.Column '// 列数 iColCount = Range("D5").CurrentRegion.Columns.Count '// 最終列 iColEnd = iColCount + iColStart - 1 |
このように、それぞれ挙動が異なります。
範囲選択する条件によって使い分けが必要になります。
すでに選択済みの場合
セル範囲の選択
セル範囲が既に選択されている場合は、その部分はSelectionプロパティで参照できます。
最終行、最終列の取得
既に選択済みの最終行と最終列の取得も上記同様にそれぞれ先頭行と行数、先頭列と列数から算出します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Dim iRowStart '// 先頭行 Dim iRowCount '// 行数 Dim iRowEnd '// 最終行 Dim iColStart '// 先頭列 Dim iColCount '// 列数 Dim iColEnd '// 最終列 '// 先頭行 iRowStart = Selection.Row '// 行数 iRowCount = Selection.Rows.Count '// 最終行 iRowEnd = iRowCount + iRowStart - 1 '// 先頭列 iColStart = Selection.Column '// 列数 iColCount = Selection.Columns.Count '// 最終列 iColEnd = iColCount + iColStart - 1 |