1. ホーム
  2. excel

[解決済み] VBAでExcelの最後に使用されたセルを検索する際のエラー

2022-04-14 09:14:53

質問

最後に使用されたセルの値を見つけたいとき、私は使用します。

Dim LastRow As Long

LastRow = Range("E4:E48").End(xlDown).Row

Debug.Print LastRow

セルに1つの要素を入れると、間違った出力がされるのですが。しかし、セルに複数の値を入れると、出力は正しくなります。 この理由は何でしょうか?

解決方法を教えてください。

注意事項 : 私は、この記事を「ワンストップ・ポスト」にするつもりです。 Correct 最後の行を見つける方法です。また、最終行を見つける際に従うべきベストプラクティスもカバーする予定です。また、新しいシナリオや情報に出会うたびに、このページを更新していく予定です。


最後の行を見つけるための信頼性の低い方法

最終行を見つけるための最も一般的な方法のいくつかは、非常に信頼性が低く、したがって、決して使用しないでください。

  1. 使用範囲
  2. xlDown
  3. カウントA

UsedRange べきである NEVER は、データを持つ最後のセルを見つけるために使用されます。非常に信頼性が低いです。この実験を試してみてください。

セルに何かを入力する A5 . これで、最後の行を以下に示すいずれかの方法で計算すると、5が得られます。 ここで、セルに色を付けます。 A10 を赤色で表示します。ここで、以下のコードのいずれかを使用しても、5が得られます。もし Usedrange.Rows.Count はどうなるのでしょうか?それは5ではありません。

以下は、その方法を示すシナリオです。 UsedRange が動作します。

xlDown も同様に信頼性に欠ける。

次のコードを考えてみましょう。

lastrow = Range("A1").End(xlDown).Row

もし、セルが1つしかなかったらどうなるか( A1 ) にデータがあるか?ワークシートの最後の行に到達することになります。これは、セル A1 を押し、その後 終了 キーを押しながら 下矢印 キーを押します。また、範囲内に空白のセルがある場合、信頼性の低い結果が得られます。

CountA も、間に空白のセルがあると間違った結果を出してしまうので、信頼性がありません。

そのため UsedRange , xlDownCountA で最後のセルを探します。


列の最終行を検索する

E列の最後の行を見つけるには、次のようにします。

With Sheets("Sheet1")
    LastRow = .Range("E" & .Rows.Count).End(xlUp).Row
End With

もし、私たちが . 前に Rows.Count . それを無視することを選択することが多かった。参照 THIS の質問で、出るかもしれないエラーについて。私はいつも . 前に Rows.CountColumns.Count . この質問は、コードが失敗する典型的なシナリオです。 Rows.Count が返す 65536 は、Excel 2003 以前のバージョンと 1048576 は、Excel 2007 以降のバージョンです。同様に Columns.Count を返します。 25616384 それぞれ

以上のことから、Excel2007+には 1048576 行の値を保持する変数を常に Long ではなく Integer という文字列が表示されます。 Overflow のエラーが発生します。

この方法では、隠された行はすべてスキップされることに注意してください。を振り返ってみると 上のスクリーンショットにあるA列の もし、8行目が隠されていた場合、この方法は 5 ではなく 8 .


シートの最終行を検索する

を見つけるには Effective シートの最後の行は、これを使用します。の使い方に注目してください。 Application.WorksheetFunction.CountA(.Cells) . これは、もしワークシートにデータのあるセルがない場合は .Find を実行すると Run Time Error 91: Object Variable or With block variable not set

With Sheets("Sheet1")
    If Application.WorksheetFunction.CountA(.Cells) <> 0 Then
        lastrow = .Cells.Find(What:="*", _
                      After:=.Range("A1"), _
                      Lookat:=xlPart, _
                      LookIn:=xlFormulas, _
                      SearchOrder:=xlByRows, _
                      SearchDirection:=xlPrevious, _
                      MatchCase:=False).Row
    Else
        lastrow = 1
    End If
End With


テーブル(ListObject)の最終行を検索する

例えば、テーブルの3列目の最後の行を取得する場合も、同じ原理が適用されます。

Sub FindLastRowInExcelTableColAandB()
Dim lastRow As Long
Dim ws As Worksheet, tbl as ListObject
Set ws = Sheets("Sheet1")  'Modify as needed
'Assuming the name of the table is "Table1", modify as needed
Set tbl = ws.ListObjects("Table1")

With tbl.ListColumns(3).Range
    lastrow = .Find(What:="*", _
                After:=.Cells(1), _
                Lookat:=xlPart, _
                LookIn:=xlFormulas, _
                SearchOrder:=xlByRows, _
                SearchDirection:=xlPrevious, _
                MatchCase:=False).Row
End With

End Sub