7.2 データがある最終行を知る方法
データが何行まで入っているか分からないワークシートの最終行がどこかを知りたいことはありませんか?まさか、行の先頭からカラのセルが見つかるまで1つずつ検索するなんて面倒なこともしたくないでしょう。

そういえば、エクセルで[CTRL]+[↓]を押すとデータの最終行へカーソルがジャンプしますよね?これと同じ操作を、マクロでは???.End(引数).操作を使えばできるんです。もちろん、カーソルを飛ばさずに、行番号や列番号だけを知ることも可能です。また、UsedRangeプロパティを使うと、さらに確実&簡単にデータの範囲を調べることが出来ます。

ちなみに、???の部分は、お馴染みのRangeCellsSelectionなどのセルを指定するオブジェクトです。詳しくは、5.1 セルや行列を扱うための基本をどうぞ。
Endプロパティを使ってデータがある最終行を知る方法
まずは、データがある最終行の行番号を取得する場合です。???.End(xlDown).Rowを使います。例では、A列の5行目から下方向xlDown)へ検索し最終行を探しています。もしも、上方向へ探すならxlUpを指定します。

ところで、行の検索なのに???の部分にはRows(1)ではなく、Range("A5")を使っていますが、これは検索を開始する位置を問わないようにするためです。例えば、Range("A100")とすると、100行目以降を検索するようになります。データが必ず1行目から入っているとも限らないでしょうし(笑)

なお、コツは必ずデータが入っている(←間違いではありません)を指定することです。テーブルから取得したデータであれば、プライマリキーのどれかを使えば、まず間違い無いでしょう。

ただし、指定したセル以降の行にデータが全くないときは、ワークシートの一番底の行番号(65536行)が返ってくるのでご注意を…。

Sub prcEndRow()

    'A列の5行目を基準として最終行を取得します
    MsgBox "最終行は : " & Range("A5").End(xlDown).Row

End Sub
 ※このエクセルマクロはワークシート内へ記述するマクロです

ちなみに、カーソルを飛ばす(セルを選択する)ときは、Range("A5").End(xlDown).Selectになります。
Endプロパティを使ってデータがある最終列を知る方法
今度は、データがある最終列の列番号を取得する場合です。???.End(xlToRight).Columnを使います。例では、A列の5行目から右方向xlToRight)へ検索し最終列を探しています。もしも、左方向へ検索するならxlToLeftを指定します。他、基本的には行を検索する場合と同じです。

コツは必ずデータが入っている(←間違いではありません)を指定することです。見出し行などがある場合は、それを使えばまず間違い無いでしょう。

ただし、指定したセル以降の列にデータが全くないときは、ワークシートの右端の列号(256列)が返ってくるのでご注意を…。

Sub prcEndColumn()

    'A列の5行目を基準として最終列を取得します
    MsgBox "最終行は : " & Range("A5").End(xlToRight).Column

End Sub
 ※このエクセルマクロはワークシート内へ記述するマクロです

ちなみに、カーソルを飛ばす(セルを選択する)ときは、Range("A5").End(xlToRight).Selectになります。
UsedRangeプロパティを使う方法
最後は、UsedRangeプロパティを使う方法です。このプロパティは、データが埋め込まれているセルの範囲を表すプロパティです。例えば、下の図のようなワークシートであればRange("B2:D4")と同じ結果が返ります。


Endプロパティとの決定的な違いは、途中にデータが入っていないセルがあるときです。Endプロパティでは、データに抜けがあるとデータの底を正しく得ることができませんが、UsedRangeを使うとほぼ確実に底を調べることが出来ます。

Sub prcUsedRange()

    'UsedRangeプロパティを使って最右列と最終行を求めます
    MsgBox "最終列は : " & ActiveSheet.UsedRange.End(xlToRight).Column
    MsgBox "最終行は : " & ActiveSheet.UsedRange.End(xlDown).Row

    'UsedRangeプロパティを使って最左列と開始行を求めます
    MsgBox "最左列は : " & ActiveSheet.UsedRange.Column
    MsgBox "開始行は : " & ActiveSheet.UsedRange.Row

End Sub
 ※このエクセルマクロはワークシート内へ記述するマクロです

ちなみに、UsedRangeはRangeオブジェクトを返すため、SelectメソッドなどRangeオブジェクトのメソッドが使えます。
Copyright(C) 1999-2006 結城圭介。 All rights reserved