最大行、最大カラムを調べる、よく使うサブルーチンライブラリ
最大行、最大カラムを調べる、よく使うサブルーチンライブラリ LastRange.bas
LastRange.bas は、データの入っている最大行、列を捜査するサブルーチンが集められたサブルーチンライブラリです。指定行から最大行列を探す(タイトル行加味)
書式 Function LastRange.MaxRowColPT(ssht, ikc, isr, isc, maxRow, maxCol, filler)
‘ssht:対象となるシート
‘kc;行連続検査カラム
‘isr:検査開始行(データ開始行)
‘isc:カラム連続検査開始カラム
‘maxRow:最大行(戻り)
‘maxCol:最大桁(戻り)
‘filler:無視できる空欄数
‘kc;行連続検査カラム
‘isr:検査開始行(データ開始行)
‘isc:カラム連続検査開始カラム
‘maxRow:最大行(戻り)
‘maxCol:最大桁(戻り)
‘filler:無視できる空欄数
使用例、

Dim ssht
Dim kc 'データ連続検査桁
Dim sr, sc 'データ開始行、開始桁
Dim maxRow, maxCol '最大行、最大桁
Dim filler '空セル許可数
Set ssht = ActiveSheet
sr = 3 'タイトル行を含ませない
sc = 2
kc = 3 '氏名欄が空欄でなければデータが入っていると考える
filler = 1 '1行ぐらい空のセルがあっても気にしない
Call LastRange.MaxRowColPT(ssht, kc, sr, sc, maxRow, maxCol, filler)
Range(Cells(sr, sc), Cells(maxRow, maxCol)).Select
結果、

指定行から最大行列を探す
書式 Function LastRange.MaxRowColP(ssht, ikc, isr, isc, maxRow, maxCol, filler)
‘ssht:対象となるシート
‘kc;行連続検査カラム
‘isr:検査開始行(データ開始行)
‘isc:カラム連続検査開始カラム
‘maxRow:最大行(戻り)
‘maxCol:最大桁(戻り)
‘filler:無視できる空欄数
‘kc;行連続検査カラム
‘isr:検査開始行(データ開始行)
‘isc:カラム連続検査開始カラム
‘maxRow:最大行(戻り)
‘maxCol:最大桁(戻り)
‘filler:無視できる空欄数
使用例、

Dim ssht
Dim kc 'データ連続検査桁
Dim sr, sc 'データ開始行、開始桁
Dim maxRow, maxCol '最大行、最大桁
Dim filler '空セル許可数
Set ssht = ActiveSheet
sr = 3 – 1 'タイトル行を含ませる
sc = 2
kc = 3 '氏名欄が空欄でなければデータが入っていると考える
filler = 1 '1行ぐらい空のセルがあっても気にしない
Call LastRange.MaxRowColP(ssht, kc, sr, sc, maxRow, maxCol, filler)
Range(Cells(sr, sc), Cells(maxRow, maxCol)).Select
結果、

Dim ssht
Dim kc 'データ連続検査桁
Dim sr, sc 'データ開始行、開始桁
Dim maxRow, maxCol '最大行、最大桁
Dim filler '空セル許可数
Set ssht = ActiveSheet
sr = 3 'タイトル行を考慮しない
sc = 2
kc = 3 '氏名欄が空欄でなければデータが入っていると考える
filler = 1 '1行ぐらい空のセルがあっても気にしない
Call LastRange.MaxRowColP(ssht, kc, sr, sc, maxRow, maxCol, filler)
Range(Cells(sr, sc), Cells(maxRow, maxCol)).Select
結果

なぜ、MaxRowColP と MaxRowColPT があるか
エクセルでセル操作プログラムを書くとき、常にデータ行がどこから始まり、また、それぞれのカラムが何を意味するのか定義して使用します。(個人差は認めますww)例えば、

これを定義するにあたり、このように記述するようにしています。
TitlR = 2
DataR = 3
n=2
AttrC = n: n = n + 1
ItemC = n: n = n + 1
IdidC = n: n = n + 1
SizeC = n: n = n + 1
maxlC = n: n = n + 1
InitC = n: n = n + 1
cEndC = n
このように書くことによって項目桁を追加する場合、簡単に追加できるようになります。
直定数でカラムを指定してしまうと、1項目追加するだけでも大変な作業になってしまいます。
例えば、id と size の間に pass を追加する場合、シート状に1列あけて挿入します。
プログラム的には、以下のように id と size の間に1行追加すれば作業が終わります。
TitlR = 2
DataR = 3
n=2
AttrC = n: n = n + 1
ItemC = n: n = n + 1
IdidC = n: n = n + 1
PassC = n: n = n + 1 ← 追加
SizeC = n: n = n + 1
maxlC = n: n = n + 1
InitC = n: n = n + 1
cEndC = n
cEndC が横方向、の桁数をおさえていますが、 range(cells(sr,sc),(er,cEndC)).select などと記述している場所に影響を与えずに 桁の追加が可能になります。
この可搬性を考慮して ここまでフィールドの定義を行わない簡単なプログラムの場合、横方向をいちいちおさえるのを、これまた定数で定義してしまうと、シートの変更があったとき、作業量が膨らみます。
そのため、最低限の データ開始行、開始桁だけを定義しておくことにすれば、フィールド定義の負担も少なくなります。
この時必要になるのが、縦方向、横方向の最大を求めるサブルーチンです。
それが、MaxRowColPT と MaxRowColP になります。
タイトルの開始行だけおさえているのであれば、MaxRowColPT を使って横方向の最大を求めます。
データの開始行だけを抑えているのであれば、MaxRowColP を使って横方向の最大を求めます。
中味はほとんど同じで、指定された開始行から1引いて横方向を求めるのか、開始行で横方向を求めるかの違いだけです。
横方向の最大カラムを求める
書式 Function LastRange.LastCol(ssht, isr, isc, ec, filler)
‘ssht:対象となるシート
‘isr:検査開始行(データ開始行)
‘isc:カラム連続検査開始カラム
‘ec:最大桁(戻り)
‘filler:無視できる空欄数
‘isr:検査開始行(データ開始行)
‘isc:カラム連続検査開始カラム
‘ec:最大桁(戻り)
‘filler:無視できる空欄数
縦方向、横方向の最大カラムを求める
書式 Function LastRange.LastP(ssht, cmd, isr, isc, filler)
‘ssht:対象となるシート
‘cmd:row/col 走査したい方向
‘isr:検査開始行(データ開始行)
‘isc:検査開始桁
‘ec:最大桁(戻り)
‘filler:無視できる空欄数
‘cmd:row/col 走査したい方向
‘isr:検査開始行(データ開始行)
‘isc:検査開始桁
‘ec:最大桁(戻り)
‘filler:無視できる空欄数