Excel VBAで、A列にデータが隙間なく入力されているときに「Range("A1").End(xlDown).Row」というコードで最終行の行番号を取得できることをご紹介しました。
このコードでは最終行を取得できないケースもあります。
Range("A1").End(xlDown)で最終行を表すRangeオブジェクトが取得できないケース
A列にデータが隙間なく入力されていないときにはダメなのです。
例えば、
100行目まで存在している表でも、A10セルまでデータが入力されていて、もしも、A11セルが空白セルだったときに
Range("A1").End(xlDown).Row
というコードを実行したときには、空白のA11セルの一つ上のセルの行番号「10」が取得されてしまいます。
A10セルまではデータが入力されていて、A11セルが空白セルだったときにA1セルをアクティブにしておいて[Ctrl]+[↓]キーを押せば、A10セルがアクティブになります。
このA10セルの10行目の10が
Range("A1").End(xlDown).Row
で返されたわけです。
空白セルがあるときに最終行番号を取得するサンプルコード
このような空白セルを作らないように表を作っておくのが本筋ですが、実務でExcelを利用する場合は、こんな空白セルの含まれた表が作られてしまうことも、残念ながら、あります。
そんなときに最終行番号を取得するコードをご紹介しておきます。または
MsgBox Cells(Rows.Count, 1).End(xlUp).Row
前回ご紹介した
Range("A1").End(xlDown).Row
の、
Range("A1")
の部分が
Cells(Rows.Count, "A")
Cells(Rows.Count, 1)
になっています。
2003までのExcelの場合
Range("A65536")
Cells(65536, "A")
Cells(65536, 1)
というコードで、A列の一番下のセルを取得できます。
2007以降のExcelの場合
Range("A1048576")
Cells(1048576, "A")
Cells(1048576, 1)
というコードで、同じくA列の一番下のセルを取得できます。
Excel 2007から仕様が変更になっていて、2003以前か2007以降かで、ワークシートの行数は異なります。
これをどのバージョンでも対応できるように汎用的にしたのが
Cells(Rows.Count, "A")
Cells(Rows.Count, 1)
です。
Rows.Countというのが最大行数を取得するオブジェクト式で、これをCellsプロパティの第1引数に指定しています。
途中に空白セルが存在しているときにも、
A列の最終行のセルを選択したいのなら
Cells(Rows.Count, 1).End(xlUp).Select
または、
Cells(Rows.Count, "A").End(xlUp).Select
A列の一番下のセルの、行番号を取得するのなら
Cells(Rows.Count, 1).End(xlUp).Row
または、
Cells(Rows.Count, "A").End(xlUp).Row
です。
前回ご紹介した
Range("A1").End(xlDown).Row
ではA1セルから下方向にデータの途切れているセルを探すのでEndプロパティの引数がxlDownでしたが、今回の
Cells(Rows.Count, "A").End(xlUp)
Cells(Rows.Count, 1).End(xlUp)
ではA列の一番したのセルから上方向に探すのでEndプロパティの引数がxlUpになっています。
今回ご紹介した最終行のセルを取得する
Cells(Rows.Count, "A").End(xlUp)
Cells(Rows.Count, 1).End(xlUp)
というコードは、Excelでマクロを作るときの定番のコードの一つです。
Cells(Rows.Count, "A").End(xlUp)の注意点
ただし、
このコードで、いつでも、絶対に、間違いなく、必ず最終行が取得できると考えるのは、問題があります。
そもそも、
一番下のセルから上方向にデータの存在しているセルを探すのは、A列に空白のセルが存在している可能性があるからでした。
ということは、
一番下のセルが空白セルとなっている可能性だってあるはずです。
ここでご紹介した
Cells(Rows.Count, "A").End(xlUp)
Cells(Rows.Count, 1).End(xlUp)
というコードで最終行を取得できる可能性はかなり高いですが、この一番下のセルが空白になっている可能性は意識しておく必要があります。
結局、空白セルを作らないような表を作る業務ルールを、徹底して運用するのが一番です。
Home » ExcelVBA Rangeオブジェクト » Endプロパティ » 最終行番号を取得する-空白セルが存在する場合
- Newer:COUNTIF関数で日付を指定するには
- Older:前方一致の個数・1文字目が同じセルの個数をカウントする
TrackBack:10
- TrackBack URL
- 最終列を取得するExcel VBAのコード from インストラクターのネタ帳
- データの入力されている最終列を取得するExcel(エクセル)VBAのコードをご紹介しています。
- 条件に合致した行を削除するマクロ from インストラクターのネタ帳
- ワイルドカードとOr演算子を使って条件を指定して、条件に合致した行を削除するExcel(エクセル)マクロをご紹介しています。
- セル結合されているときに最終行番号を取得する from インストラクターのネタ帳
- セルが結合されているときに最終行番号を取得するExcel(エクセル)VBAのコードをご紹介しています。
- 列幅・行の高さをコピーするExcelマクロ from インストラクターのネタ帳
- 行の高さ・列の幅を1枚目のワークシートに揃えるExcel(エクセル)マクロをご紹介しています。
- 最終行を取得するGASスクリプト from インストラクターのネタ帳
- GoogleスプレッドシートのA列でデータの入力されている最終行番号を取得するGAS(Google Apps Script)をご紹介しています。
- VBAで空白セルまでを選択する from インストラクターのネタ帳
- 対象:Excel2007, Excel2010, Excel2013, Win...
- オートフィルターしたデータの見出し行以外をコピーするExcelマクロ from インストラクターのネタ帳
- オートフィルターしたデータの、見出し行以外をコピーするExcel(エクセル)マクロをご紹介しています。
- Findの検索開始位置を最終行に from インストラクターのネタ帳
- Range.Findメソッドを使って、検索開始位置を最終行にする方法をご紹介しています。
- Dictionaryのカウント・個数を取得するExcelマクロ from インストラクターのネタ帳
- DictionaryオブジェクトはCountプロパティで項目の数を取得することができます。
- End(xlUp).Row・End(xlDown).Rowの型は? from インストラクターのネタ帳
- Rangeオブジェクトの、End(xlUp).Row・End(xlDown).Rowの戻り値の型について解説しています。