11.3 データの最後を探す場合
この事例は、処理効率の向上に加えて最適な手段を使うとマクロの見栄えも良くなりますよっ!という事例です。

7.2 データがある最終行を知る方法に同じようなネタがありますが、データが入っている最終行や最終列を探すとき、セルをチェックしてコツコツ探す方法と、???.End(xlDown).Rowなどを使ってサクっと探す方法がありますが、どう考えても後者の方が効率が良いですよ!
事例/データが入っている最終行を探す場合
わりと良くあるパターンです。どっかからもってきたCSVファイル(※)をエクセルマクロを使って編集したりDBへ登録する場合に、様々な(?)事情からデータ件数が何行目まで入っているかをあらかじめ知る必要があったとします。

最初に地道に探す例ですが、次の例ではA列のセルを2行目から1つずつチェックする処理を未入力のセルが見つかるまで延々行います。やってることは単純なのに、パっと見は面倒なことをしてそうですね(笑)

ちなみに、CSVファイルは必ず先頭行が見出し、データは2行目以降、データがある行はA列は必ず何か入っている、見出し行のみもありえる(明細が0件)とし、サンプルコードではデータが入っている最終行の番号をメッセージボックスで表示しているだけです。

こういうCSVファイルだったとします。ダウンロードしてテストデータにお使い下さい。

Sub prcRecordCount1()

    '良くない例

    Dim lngLine As Long

    lngLine = 1

    Do Until False

       '行が底に達したらループを終了します
       If lngLine = 65536 Then
         Exit Do
       End If

       '未入力のセルが見つかったときもループを終了します
       '判定の対象は、現在の行+1のセルです
       If (Range("A" & lngLine + 1)) = 0 Then
         Exit Do
       End If

       '次の行を検索するための行数カウント
       lngLine = lngLine + 1

    Loop

    MsgBox "データは " & lngLine & "行まであります"

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


次に、???.End(xlDown).Rowを使った効率のイイ例です。やりたいことと結果は同じですが、マクロはまったく別物だし、何よりこっちの方がイイことは言うまでもありません。データが多ければ多いほど、処理速度の差がハッキリ出ます。

Sub prcRecordCount2()

    '推奨例

    Dim lngLine As Long

    'セルA2がカラであれば1行(見出しのみ)
    If Len(Range("A2")) = 0 Then
       lngLine = 0
    Else
    'セルA2に何か入っていれば底の行番号を取得
       lngLine = Range("A1").End(xlDown).Row
    End If

    MsgBox "データは " & lngLine & "行まであります"

End Sub
 ※このエクセルマクロはワークシート内へ記述するマクロです
Copyright(C) 1999-2006 結城圭介。 All rights reserved