【ExcelVBA】 最終行・最終列の取得(上下左右方向・UsedRange・CurrentRegion)
目次
テスト対象のテーブル
テスト対象テーブルを使いたい場合は、↓テーブルをコピーしてエクセルの A1 に貼り付けてください。
商品名 | 産地 | 個数 |
---|---|---|
りんご | 青森県 | 4 |
みかん | 熊本県 | 3 |
めろん | 茨城県 | 5 |
いちご | 静岡県 | 2 |
みかん | 和歌山県 | 1 |
最終行の探索
下方向に最終行を探索
Sub Sample() Dim MaxRow As Long MaxRow = ThisWorkbook.Worksheets("Sheet1").Cells(1, 1).End(xlDown).Row Debug.Print "最終行: " & MaxRow End Sub
結果: 最終行: 6
上方向に最終行を探索
Sub Sample() Dim MaxRow As Long MaxRow = ThisWorkbook.Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row Debug.Print "最終行: " & MaxRow End Sub
結果: 最終行: 6
※Rows.Count は、シートの最大行数を返します。下記は、シートの最大行数を表示
Sub Sample() Debug.Print Rows.Count End Sub
最大行数: 1048576 (Excel 2010の場合)
最終列の探索
右方向に最終列を探索
Sub Sample() Dim MaxCol As Long MaxCol = ThisWorkbook.Worksheets("Sheet1").Cells(1, 1).End(xlToRight).Column Debug.Print "最終列: " & MaxCol End Sub
結果: 最終列: 3
左方向に最終列を探索
Sub Sample() Dim MaxCol As Long MaxCol = ThisWorkbook.Worksheets("Sheet1").Cells(1, Columns.Count).End(xlToLeft).Column Debug.Print "最終列: " & MaxCol End Sub
結果: 最終列: 3
※Columns.Count は、シートの最大列数を返します。下記は、シートの最大列数を表示
Sub Sample() Debug.Print Columns.Count End Sub
最大列数: 16384 (Excel 2010の場合)
最終行と最終列を一緒に探索
使用済みセルの範囲から最終行と最終列を探索(UsedRangeプロパティ)
Sub Sample() Dim MaxRow As Long Dim MaxCol As Long With ThisWorkbook.Worksheets("Sheet1").UsedRange.SpecialCells(xlLastCell) MaxRow = .Row MaxCol = .Column End With Debug.Print "最終行: " & MaxRow & " 最終列: " & MaxCol End Sub
結果: 最終行: 6 最終列: 3
※UsedRange.SpecialCells(xlLastCell)は、使用済み範囲の中で最後に位置するセルの位置を返します。
結果: 最終行: 7 最終列: 5
※UsedRangeを使うにあたって、テーブル以外の書き込みがある場合は要注意!
※テーブルのみ指定したい場合は、次の解説「テーブル範囲から最終行と最終列を探索」参照
テーブル範囲から最終行と最終列を探索(CurrentRegionプロパティ)
Sub Sample() Dim MaxRow As Long Dim MaxCol As Long With ThisWorkbook.Worksheets("Sheet1") .Activate .Cells(1, 1).Activate 'テーブル内のどこかをアクティブにする End With With ActiveCell.CurrentRegion(ActiveCell.CurrentRegion.Count) MaxRow = .Row MaxCol = .Column End With Debug.Print "最終行: " & MaxRow & " 最終列: " & MaxCol End Sub
結果: 最終行: 6 最終列: 3
非表示行やオートフィルタの不可視行に、最終行が存在する場合の探索
「非表示」と「オートフィルタの不可視行」は、プロパティが異なるため、最終行の取得方法も異なります。オートフィルタの不可視行に最終行がある場合の探索
Sub Sample() Dim MaxRow As Long MaxRow = ThisWorkbook.ActiveSheet.AutoFilter.Range.Rows.Count Debug.Print "最終行: " & MaxRow End Sub※上記は非表示行には対応しておりません。(オートフィルタの不可視行のみに対応)
①テスト対象のテーブル
②2行目の商品以外は全部フィルタ
結果:最終行 6
※ちゃんと、不可視行の中にある 6行目のみかん にヒット
最終行: 6
非表示行やフィルタの不可視行が混在するシート上の最終行を探索
Sub Sample() Dim TmpRow1 As Long, TmpRow2 As Long TmpRow1 = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).ROW TmpRow2 = ActiveSheet.UsedRange.Rows.Count Dim i As Long, x As Long x = TmpRow1 For i = TmpRow1 To TmpRow2 If IsEmpty(ActiveSheet.Cells(i, 1)) = False Then x = i End If Next Debug.Print "TmpRow1: " & TmpRow1 Debug.Print "TmpRow2: " & TmpRow2 Debug.Print "最終行: " & x End Sub
①テスト対象のテーブル
※15行目に最終行の目標となる文字があるとします。
②一部の行を非表示にする
③非表示にしました
④商品の一部をフィルタしました
⑤5行目~25行目がFor-Nextの対象です
⑥結果:最終行: 15
TmpRow1: 5
TmpRow2: 25
最終行: 15
TmpRow2: 25
最終行: 15
「非表示行なし、オートフィルタ設置なし」「非表示あり、オートフィルタ設置なし」
「非表示なし、オートフィルタ設置&フィルタ済み」「非表示あり、オートフィルタ設置&フィルタ済み」すべてで、
15行目が最終行になります。
ディスカッション
コメント一覧
まだ、コメントがありません