VBAで自動化 VBA一覧 最終行・最終列 配列・データ操作

【VBA】数式を無視して最終行を取得する方法

Excel VBA でデータが入力されている最終行を取得する際、数式が入力されているセルを無視したい場合があります。通常の方法では数式を含むセルも最終行として認識されてしまうため、特別な工夫が必要です。

数式を無視して最終行を取得する方法について、コード例を交えながら解説します。

通常の最終行取得方法

最終行を取得する一般的な方法は、UsedRangeCells(Rows.Count, Column).End(xlUp) を使用する方法です。

【VBA】UsedRangeプロパティ:最終行と最終列数

【VBA】Endメソッド:最終行と最終列数

Sub GetLastRow()

Dim lastRow As Long

' A列の最終行を取得
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
MsgBox "最終行: " & lastRow

End Sub

問題点

  • 上記のコードでは、数式が入力されているセルも「最終行」として認識されます。
  • 実際にデータが入力されているセルの最終行だけを取得したい場合には適していません。

数式を無視して最終行を取得する方法

数式を無視するには、HasFormula プロパティを使用してセルに数式が含まれているかどうかを確認し、実際にデータが入力されているセルのみをチェックします。

Sub GetLastRowIgnoringFormulas()

Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long

Set ws = ThisWorkbook.Worksheets("Sheet1")
lastRow = 0

' A列を下から上にループ
For i = ws.Rows.Count To 1 Step -1

If Not IsEmpty(ws.Cells(i, 1).Value) And Not ws.Cells(i, 1).HasFormula Then

lastRow = i
Exit For

End If

Next i

MsgBox "数式を無視した最終行: " & lastRow

End Sub

解説

  1. IsEmpty を使用して、セルが空白かどうかを判定。
  2. HasFormula プロパティを使用して、セルが数式かどうかを判定。
  3. 両方の条件を満たすセルを「データのみが入力された最終行」として取得。

特定の列に絞って最終行を取得する

特定の列(例: B列)のデータを対象に、数式を無視して最終行を取得する方法です。

Sub GetLastRowInColumn()

Dim ws As Worksheet
Dim lastRow As Long
Dim col As Integer
Dim i As Long

Set ws = ThisWorkbook.Worksheets("Sheet1")
col = 2 ' B列
lastRow = 0

For i = ws.Rows.Count To 1 Step -1

If Not IsEmpty(ws.Cells(i, col).Value) And Not ws.Cells(i, col).HasFormula Then

lastRow = i
Exit For

End If

Next i

MsgBox "B列の数式を無視した最終行: " & lastRow

End Sub

ワークシート全体の最終行を取得する

複数列にデータがある場合、すべての列をチェックして最終行を取得する方法です。

Sub GetLastRowInSheetIgnoringFormulas()

Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long, j As Long

Set ws = ThisWorkbook.Worksheets("Sheet1")
lastRow = 0

For i = ws.Rows.Count To 1 Step -1

For j = 1 To ws.Columns.Count

If Not IsEmpty(ws.Cells(i, j).Value) And Not ws.Cells(i, j).HasFormula Then

lastRow = i
Exit For

End If

Next j
If lastRow > 0 Then Exit For

Next i

MsgBox "ワークシート全体の数式を無視した最終行: " & lastRow

End Sub

解説

  • 外側のループで行(i)を下から上にチェック。
  • 内側のループで列(j)を左から右にチェック。
  • 最初にデータが見つかった時点で処理を終了します。

使用されている範囲を対象に効率化する

UsedRange を活用して、チェックする範囲を限定することで効率的に最終行を取得できます。

Sub GetLastRowUsingUsedRange()

Dim ws As Worksheet
Dim lastRow As Long
Dim cell As Range

Set ws = ThisWorkbook.Worksheets("Sheet1")
lastRow = 0

For Each cell In ws.UsedRange.Columns(1).Cells

If Not IsEmpty(cell.Value) And Not cell.HasFormula Then

If cell.Row > lastRow Then

lastRow = cell.Row

End If

End If

Next cell

MsgBox "数式を無視した最終行: " & lastRow

End Sub

解説

  • UsedRange を使用して、データが入力されている範囲に限定してチェックを行います。
  • 範囲が限定されるため、大量のデータを扱う場合でも高速に処理できます。

条件付きの最終行取得

特定の条件(例: 値が「100」以上)を満たす最終行を取得する方法も応用できます。

Sub GetLastRowWithCondition()

Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long

Set ws = ThisWorkbook.Worksheets("Sheet1")
lastRow = 0

For i = ws.Rows.Count To 1 Step -1

If Not IsEmpty(ws.Cells(i, 1).Value) And _

Not ws.Cells(i, 1).HasFormula And _
ws.Cells(i, 1).Value >= 100 Then
lastRow = i
Exit For

End If

Next i

MsgBox "条件付きの最終行: " & lastRow

End Sub

注意点

  1. セルのデータ型に注意
    数式を含むセルを判定する際、文字列や数値の混在に注意してください。

  2. 処理速度の最適化
    範囲が広い場合、UsedRange を活用して処理範囲を限定すると高速化できます。

  3. 空白セルの処理
    途中に空白セルがある場合、それを無視するロジックを追加する必要があります。

まとめ

Excel VBA で数式を無視して最終行を取得するには、HasFormula プロパティや IsEmpty を組み合わせたロジックが有効です。主なポイントは以下の通りです。

  1. HasFormula を使用して数式を判定
  2. UsedRange や特定の列で範囲を限定
  3. 条件付きで最終行を取得する応用

    -VBAで自動化, VBA一覧, 最終行・最終列, 配列・データ操作