トップページ(目次)
475.最終行を取得する
最終行を、それぞれの場面ごとに動的に取得するのは、マクロVBA学習者の最初の難題かと思います。
プログラミングの知識ゼロの方でも理解できるように、順を追って細かく解説します。
先に、まず結論から
<実行前後>
→
Sub 最終行を取得する()
最終行 = Cells(Rows.Count, "A").End(xlUp).Row
MsgBox "A列の最終行は「 " & 最終行 & " 」行目"
End Sub
ちなみに、
Range("A" & Rows.Count).End(xlUp).Rowと書いても同じです。
一般的には可読性などが考慮されてCellsが使われているだけで、
Rangeの方がお好みとか、他の方に見せないVBAならRangeも可です。
次に、そもそも、各要素が何を表しているのか、さっぱりわけがわからないので要素を分解
【各要素を分解して解説】
Cells(Rows.Count, "A").End(xlUp).Row = 4(行目)
↓
Cells(Rows.Count, "A")
→Rows.CountはExcel
最大行の104万8576行目
=Cells(1048576, "A")
=Range("A1048576")
↓
End(xlUp)
→「Ctrl+↑」を押すこと
↓
Row
→セルが止まった行数を取得
まとめると、
エクセルの一番下の行のA列セル [Cells(1048576, "A") = Cells(Rows.Count, "A") = Range("A1048576") ]
を選択した状態で、キーボードの「Ctrl+↑」 [End(xlUp)]
を押して止まった行数 [Row]
を取得している。今回のケースは「4」行目
次に、具体的な考え方や、素朴な疑問を整理
【考え方を解説】
まず、エクセルの最大行数という見慣れない概念が出てきます。これは、
Rows.Count → Rows(行数).Count(数える) → 104万8576行 となり、
エクセル2007以降の最大行数を表しています。
(疑問①)
そもそも、最大行数はすでに決まっているに、なぜ、104万8576行と書かず、
Rows.Countと毎回最大行数を取得するというわかりにくい仕様なのか?
(答え①)
エクセルのバージョンによって最大行数が変わるからです。
そのため、もし、104万8576行を記入してしまうと、次のバージョンで
最大行数が変化した場合、それまでに作成したVBAツールがすべて機能しなく
なります。ちなみに、2003までは最大行数が 6万5536行 でした。
(疑問②)
なぜ一番下から Ctrl+↑ を押すとか面倒な手順を踏むの?
セルA1から Ctrl+↓ でも実際に操作すると同じ行に止まるし、
End(xlUp) → End(xlDown) となるだけで少し見やすいです。
(例)
Cells(1, "A").End(xlDown).Row
(例)
Range("A1").End(xlDown).Row
(答え②)
途中に空欄があるとそこで止まってしまうためです。
以下のようにA列途中に空欄があるとそこで止まってしまいます。
キャプチャのように、正しい最終行は4行目ですが、2行目を取得してしまっています。
そのため、エクセル最大行数の最下部から上へ動く仕様になっています。
クリックで拡大
最終行の取得過程が理解できれば、初心者が漏れなく苦戦する「変数」に関しても
具体的に感覚が掴めてきますので、焦らず、しっかりと習得しましょう。