データがどこまで入っているか完全に予測できない汎用処理において、業界標準として支持されているのがVBA最終行取得Findメソッド確実な実装パターンです。シート全体の全セルを対象に、後方からワイルドカード検索をかけることで、複数列の凹凸や非表示行をものともせず、物理的なデータの終端を正確に特定します。
以下は、エラーハンドリングを完備した2026年最新VBA最終行取得の正解コードです。シートが完全に空っぽの場合でも異常終了しない設計を採用しています。
Function GetRealLastRow(ByVal ws As Worksheet) As Long Dim foundCell As Range ' シート全体の末尾から、値または数式が存在するセルを逆順探索 Set foundCell = ws.Cells.Find( _ What:="*", _ After:=ws.Cells(1, 1), _ LookIn:=xlFormulas, _ LookAt:=xlPart, _ SearchOrder:=xlByRows, _ SearchDirection:=xlPrevious, _ MatchCase:=False) If Not foundCell Is Nothing Then GetRealLastRow = foundCell.Row Else ' 1件もデータが存在しない場合は0(またはヘッダー想定行)を返す GetRealLastRow = 0 End If End Function
このロジックの肝は LookIn:=xlFormulas の指定にあります。xlValues を指定すると、フィルタで非表示にされた行や折りたたまれたグループ内のセルを見落としてしまう仕様上の制約を受けます。xlFormulas を選択することで、非表示行のデータも含めて正確に検知することが可能です。
一方で、VBA最終行取得空白セル対応として「数式が入っているが見た目が空白のセルを除外し、目に見える値だけの末尾を取りたい」という要件であれば、あえて LookIn:=xlValues を選択し、かつシートのフィルタを解除した状態で実行するのが理にかなった選択となります。目的ごとに引数を意識的に制御することが、プロのコードとアマチュアのスクリプトを分かつ分水嶺です。
なお、行番号を格納する変数には必ず Long 型(または環境に応じた64bit対応型)を採用してください。かつての Integer 型(上限32,767行)を使用していると、VBA最終行取得Rows.Count(最大1,048,576行)を代入した瞬間にオーバーフローエラー(実行時エラー6)を引き起こします。