Endプロパティ
今回の図書データのレコードが何件あるかわかりません。そこで、先頭行はわかっていますので、最後の行がわかればレコード件数がわかります。
そこでワークシートの最終行を知るにはどうすればいいでしょうか。ある列を最初から読んでカウントする方法もありますが、もっと簡単にわかるプロパティがあります。これは便利で応用範囲が広いので習得しましょう。
サンプルデータbooks-list.xlsx「図書目録」を開きます。
Endプロパティを利用して最終行を知る方法
- MsgBox "最終行は : " & Range("A3").End(xlDown).Row
Ctrl + G キーを押してイミディエイトウィンドウに移って、上のメッセージ文を入力してみてください。データがある最終行が表示されると思います。
この「Range("A3").End(xlDown).Row」の意味するところは、セルA3から下のセルへ順に移動して(xlDown)、そのセルの内容が有から無に変化したときの直前の行番号(row)を、無から有に変化したときは、その行番号(row)を求めるものです。
【練習問題5】
では、古典的な(?)レコード件数の求め方をWhile文を使って求めてみましょう。対象データはサンプルデータvba-exercises.xlsm「VBA練習問題」のシート名「Sheet1」にあるデータを利用します。
この作業をする前に、サンプルデータvba-exercises.xlsm「VBA練習問題」をダウンロードし、保存しておいてください。
【解答例】
- Sub 練習問題5() 'While文を使ってレコード件数を求める
- Dim c As Integer '最終レコード行番号
- Worksheets("Sheet1").Select
- c = 3
- Do While Cells(c, "A") <> ""
- c = c + 1
- Loop
- Debug.Print "最終レコード行番号は、" & c & "行です。"
- End Sub
Endメソッド
練習問題5ができたら、練習問題6に挑戦してみましょう。
【練習問題6】
今度はEndメソッドを使って、サンプルデータbooks-list.xlsx「図書目録」を開いて、シート名「図書」のレコード件数を求めてみましょう。MsgBox関数を使って結果を表示します。
【解答例】
- Sub 練習問題6() '図書のレコード最終行を求める
- Dim Wb As Workbook
- Dim Ws As Worksheet
- Dim c As Integer 'レコードの最終行
- Workbooks.Open (ThisWorkbook.Path & "\図書.xlsx"), ReadOnly:=True
- Set Wb = Workbooks("図書.xlsx")
- Set Ws = Wb.Worksheets("図書")
- c = Ws.Range("A2").End(xlDown).Row
- MsgBox "最終レコード行番号は、" & c & "行です。"
- Wb = Nothing
- Ws = Nothing
- Wb.Close
- End Sub
【参考】
ワークシートの最大行、最大列を取得するには以下のように記述します。
- MaxRow = Rows.Count
- MaxCol = Columns.Count
まず基本からですが、ワークシートの最大行、最大列を取得するコードです。もちろんこれ自体はデータの最終行、最終列を取得するものではありません。
「Rows」はワークシートの行全体をあらわすオブジェクトで、「Columns」は列全体をあらわすオブジェクトです。そのメソッド「Count」は数、すなわちそれぞれ行数、列数を表します。
返される値はEXCELのバージョンによって異なりますが、
EXCEL 97/2000/2003では、65,536行、256列になります。
また、Excel 2007/2010では、最大行数は16倍の1,048,576行、最大列数は64倍の16,384列で、セル数にして17,179,869,184(171億)、従来の1024倍という膨大な量になります。
ほとんど取り扱いに困らないセルの数だと思います。
【確認】
では、プログラミングする前に、イミディエイトウィンドウで確認しましょう。
Ctrl + G キーを押してイミディエイトウィンドウに移ります。
最大行を求めるには
- ? Rows.Count
と入力してEnter キーを押します。
また、最大行を求めるには
- ? Columns.Count
と入力してEnterキーを押します。
どうでしたか?期待したとおりの結果が表示されましたか。
確認が終わったら、F4 キーを押してコードモジュールに戻りましょう。