最後に使用したセルの値を見つけたいときは、次のようにします。
Dim LastRow As Long
LastRow = Range("E4:E48").End(xlDown).Row
Debug.Print LastRow
セルに 1 つの要素を入力すると、間違った出力が得られます。しかし、セルに複数の値を入力すると、出力は正しくなります。この理由は何でしょうか?
ベストアンサー1
注記: 私はこれを、最後の行を見つける方法を使用できる「ワンストップ投稿」にするつもりですCorrect
。また、最後の行を見つけるときに従うべきベストプラクティスもカバーします。そのため、新しいシナリオ/情報に遭遇するたびに、これを更新し続けます。
最後の行を見つける信頼性の低い方法
最後の行を見つける最も一般的な方法のいくつかは、信頼性が非常に低いため、決して使用しないでください。
- 使用範囲
- xlダウン
- カウント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
およびを使用することは避けるべきです。xlDown
CountA
列の最後の行を見つける
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.Count
65536
1048576
Columns.Count
256
16384
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