Vba最終行取得がズレる理由とは?プロ直伝の鉄板コード徹底解明

Vba最終行取得がズレる理由とは?プロ直伝の鉄板コード徹底解明

Vba最終行取得がズレる理由とは?プロ直伝の鉄板コード徹底解明に関する基本知識を徹底的にまとめました。詳細を読もうことができます。

ここからは、現場の多様な要件をクリアし、そのまま業務に組み込める「エクセルVBA最終行取得コピペ用コード」を体系的に提示します。不測のバグを防ぐため、すべてのコードにおいてアクティブシート依存を排除し、対象ワークシートを明示する堅牢な設計を採用しています。

1. 【基本形】最も信頼性の高い単一列の最終行取得コード

特定の基準列(A列など)が定まっている場合における、現代VBAの最適解です。

Sub GetLastRow_Standard() Dim ws As Worksheet Dim lastRow As Long ' シートを明示的に指定(予期せぬアクティブシート取得を防ぐ) Set ws = ThisWorkbook.Sheets("Sheet1") ' A列(第1列)を対象に最下行から上方向へスキャン lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row ' データが1行も存在しない場合の例外チェック If lastRow = 1 And ws.Cells(1, 1).Value ="" Then lastRow = 0 End If MsgBox "A列の最終行は: " & lastRow & " です", vbInformation End Sub

2. 【高度形】数式空白("")を完全無視するFindメソッドによる最終行取得

「VBA最終行取得空白含む場合」や、IF関数等で「見た目は空だが数式が入っているセル」を末尾から除外し、純粋に「値が表示されている真の最終行」をシート全域から特定するには、「Findメソッドによる最終行取得」が唯一無二の威力を発揮します。

Function GetRealLastRow(ByVal ws As Worksheet) As Long Dim foundCell As Range ' 値(xlValues)を対象に、後方走査(xlPrevious)で検索 Set foundCell = ws.Cells.Find( _ What:="*", _ After:=ws.Cells(1, 1), _ LookIn:=xlValues, _ LookAt:=xlPart, _ SearchOrder:=xlByRows, _ SearchDirection:=xlPrevious, _ MatchCase:=False) If Not foundCell Is Nothing Then GetRealLastRow = foundCell.Row Else GetRealLastRow = 0 ' シート全体が完全な空の場合 End If End Function

3. 【構造化】モダンExcelの王道「VBAテーブル最終行取得」

近年推奨されるExcelテーブル(ListObject)形式を採用している場合、従来のEndプロパティに頼る必要はありません。「VBAテーブル最終行取得」は、テーブルオブジェクトのデータ行数を直接参照するため、最も堅牢でメンテナンス性に優れています。

Sub GetTableLastRow() Dim ws As Worksheet Dim tbl As ListObject Dim tblLastRow As Long Set ws = ThisWorkbook.Sheets("Sheet1") Set tbl = ws.ListObjects("受注データテーブル") ' テーブルのデータ範囲(見出し除く)の最終行番号を取得 If tbl.ListRows.Count > 0 Then tblLastRow = tbl.Range.Row + tbl.Range.Rows.Count - 1 Else tblLastRow = tbl.HeaderRowRange.Row ' データ行が空の場合はヘッダー行を返す End If MsgBox "テーブルの最終行は: " & tblLastRow & " です", vbInformation End Sub

4. 【横展開】列方向への拡張に対応する「VBA最終列取得方法まとめ」

行だけでなく列方向のデータ伸展に対応するための「VBA最終列取得方法まとめ」も必須知識です。行取得のRows.Countと同様に、列取得ではColumns.Countを用いて最右端から左方向へスキャン(xlToLeft)を実行します。

Sub GetLastColumn() Dim ws As Worksheet Dim lastCol As Long Set ws = ThisWorkbook.Sheets("Sheet1") ' 1行目を基準に最右列から左方向へスキャン lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column MsgBox "1行目の最終列番号は: " & lastCol & " です", vbInformation End Sub

佐々木 一輝
Author

佐々木 一輝

Webメディアでの編集・執筆歴10年。読者の好奇心を刺激するストーリー作りを心がけています。