Excel VBAで最後に使用したセルを検索する 質問する

Excel VBAで最後に使用したセルを検索する 質問する

最後に使用したセルの値を見つけたいときは、次のようにします。

Dim LastRow As Long

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

Debug.Print LastRow

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

ベストアンサー1

注記: 私はこれを、最後の行を見つける方法を使用できる「ワンストップ投稿」にするつもりですCorrect。また、最後の行を見つけるときに従うべきベストプラクティスもカバーします。そのため、新しいシナリオ/情報に遭遇するたびに、これを更新し続けます。


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

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

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

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

セルに何かを入力しますA5。これで、以下のいずれかの方法で最後の行を計算すると、5 が返されます。次に、セルをA10赤くします。ここで、以下のいずれかのコードを使用すると、やはり 5 が返されます。 を使用すると、Usedrange.Rows.Count何が得られますか? 5 にはなりません。

どのように動作するかを示すシナリオを以下に示しますUsedRange

ここに画像の説明を入力してください

xlDown同様に信頼できません。

このコードを検討してください

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

データが入っているセルが 1 つ ( ) だけだった場合はどうなるでしょうかA1? ワークシートの最後の行に到達してしまいます。これは、セルを選択してA1からEndキーを押してからDown Arrowキーを押すのと同じです。範囲内に空白のセルがある場合、これも信頼できない結果になります。

CountA間に空白セルがある場合は間違った結果が出るため、信頼性も低くなります。

したがって、最後のセルを見つけるために、、UsedRangeおよびを使用することは避けるべきです。xlDownCountA


列の最後の行を見つける

E列の最後の行を見つけるにはこれを使用します

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

.前に があることに気づいたらRows.Count、私たちはそれを無視することがよくあります。これ発生する可能性のあるエラーについての質問です。私は常に.beforeRows.Countとを使用することをお勧めします。その質問は、Excel 2003 以前では が、Excel 2007 以降ではが返されるColumns.Countため、コードが失敗する典型的なシナリオです。同様に、 はそれぞれと を返します。Rows.Count655361048576Columns.Count25616384

Excel 2007 以降には行があるという上記の事実は、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

おすすめ記事