作りながら学ぶVBAプログラミング

最大行、最大カラムを調べる、よく使うサブルーチンライブラリ


最大行、最大カラムを調べる、よく使うサブルーチンライブラリ LastRange.bas

LastRange.bas は、データの入っている最大行、列を捜査するサブルーチンが集められたサブルーチンライブラリです。

指定行から最大行列を探す(タイトル行加味)

書式 Function LastRange.MaxRowColPT(ssht, ikc, isr, isc, maxRow, maxCol, filler) ‘ssht:対象となるシート
‘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:無視できる空欄数

使用例、

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)

例えば、
の場合、タイトル行は、2行目、データ行は、3行目、桁は、左から ATTR 項目名 id size maxlength 初期値 となっています。

これを定義するにあたり、このように記述するようにしています。
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:無視できる空欄数

縦方向、横方向の最大カラムを求める

書式 Function LastRange.LastP(ssht, cmd, isr, isc, filler) ‘ssht:対象となるシート
‘cmd:row/col 走査したい方向
‘isr:検査開始行(データ開始行)
‘isc:検査開始桁
‘ec:最大桁(戻り)
‘filler:無視できる空欄数


最大行、最大カラムを調べる LastRange ダウンロード




  • このエントリーをはてなブックマークに追加

関連記事

ゆずまる・ゆぅべぇ

システムエンジニア/プログラマ歴数十年のゆずまるです。

バナーにもあるように変体的な犬マニアで生まれてからこのかた犬のいない日は経験していません。
中でもコッカースパニエルとラブラドールが死ぬほど好き!

そんなゆずまるは、20数種類の様々な言語を使用してシステム開発をおこなってきました。

そこで使ってきた各言語の自作ライブラリ中のVBAのライブラリを公開しています。

※姉妹サイトに C,PHP などのサイトもネット上に浮遊させております。そちらでもお役にたてましたら無上の喜びw

あなたの一助になれば幸いです。