#最終行の取得
ExcelVBAで多用する最終行の取得と最終列の取得についてまとめる。
##1. .End(xlDown):Ctrl+↓ を使う方法
途中に空欄がある場合は空欄の一つ上のセルが最終行として認識される。
入力されているセルが1行目のみの場合はその列の最終行は「1048576行目」と認識される。
最終行 = Cells(1, 1).End(xlDown).Row
##2. .End(xlUp):Ctrl+↑を使う方法
入力されているセルが1行目のみの場合はその列の最終行は「1行目」と認識される。
1行目のセルに何も入力されていなくても最終行は「1行目」と認識されてしまう。
最終行 = Cells(Rows.Count, 1).End(xlUp).Row
##3. CurrentRegionを使う
途中に空白行(何も入っていない行)がある場合は、そこまでの行になってしまう。
With Range("B2").CurrentRegion
最終行 = .Item(.Count).Row
End With
##4. SpecialCells(xlCellTypeLastCell)を使う
罫線が引いてあればそこまで範囲に入ってしまう。
行高をデフォルトから変えているだけでも、その行まで範囲に入ってしまう。
最終行 = Cells.SpecialCells(xlCellTypeLastCell).Row
##5. UsedRangeを使う
罫線が引いてあればそこまで範囲に入ってしまう。
行高をデフォルトから変えているだけでも、その行まで範囲に入ってしまう。
With ActiveSheet.UsedRange
最終行 = .Item(.Count).Row
End With
##6. Findメソッドを使う
Findメソッドを使うため、[検索と置換]ダイアログボックスに表示される設定が変わってしまう。
最終行 = Cells.Find(What:="*",LookIn:=xlFormulas, SearchOrder:=xlByRows,SearchDirection:=xlPrevious).Row
##■ユーザー定義関数
毎回どの方法で最終行を取得するか面倒だったため、Findメソッドを使ったユーザー定義関数を作成。
[検索と置換]ダイアログボックスの検索値に「*」と入力されてしまうが、大勢に影響ないと判断した。
同様のやり方で最終列を取得する関数も作成。
Function rowLast(sheetName As String, column As Integer) As Long
'===========================
'関数名 : rowLast
'目的 : 最終行を求める
'引数 : 検索する列番号
'返値 : 最終行番号
'===========================
On Error GoTo errExit
rowLast = Sheets(sheetName).Columns(column).Find(What:="*", LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).row
Exit Function
errExit: rowLast = 0
End Function
Function colLast(sheetName As String, row As Integer) As Long
'===========================
'関数名 : colLast
'目的 : 最終列を求める
'引数 : 検索する行番号
'返値 : 最終列番号
'===========================
On Error GoTo errExit
colLast = Sheets(sheetName).Rows(row).Find(What:="*", LookIn:=xlFormulas, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).column
Exit Function
errExit: colLast = 0
End Function