NOTA : Pretendo fazer deste um "posto único" onde você possa usar o Correct
caminho para encontrar a última linha. Isso também abordará as práticas recomendadas a serem seguidas ao encontrar a última linha. E, portanto, continuarei atualizando sempre que encontrar um novo cenário / informação.
Maneiras não confiáveis de encontrar a última linha
Algumas das maneiras mais comuns de encontrar a última linha que não são confiáveis e, portanto, nunca devem ser usadas.
- UsedRange
- xlDown
- CountA
UsedRange
NUNCA deve ser usado para encontrar a última célula que possui dados. É altamente não confiável. Tente este experimento.
Digite algo na célula A5
. Agora, quando você calcula a última linha com qualquer um dos métodos fornecidos abaixo, ele fornecerá 5. Agora, pinte a célula de A10
vermelho. Se você agora usa qualquer um dos códigos abaixo, ainda receberá 5. Se você usar Usedrange.Rows.Count
o que recebe? Não será 5.
Aqui está um cenário para mostrar como UsedRange
funciona.
xlDown
é igualmente não confiável.
Considere este código
lastrow = Range("A1").End(xlDown).Row
O que aconteceria se houvesse apenas uma célula ( A1
) com dados? Você chegará à última linha da planilha! É como selecionar uma célula A1
e pressionar a Endtecla e pressionar a Down Arrowtecla. Isso também fornecerá resultados não confiáveis se houver células em branco em um intervalo.
CountA
também não é confiável porque fornecerá resultados incorretos se houver células em branco no meio.
E, portanto, deve-se evitar o uso de UsedRange
, xlDown
e CountA
para encontrar a última célula.
Localizar última linha em uma coluna
Para encontrar a última linha na Col E, use este
With Sheets("Sheet1")
LastRow = .Range("E" & .Rows.Count).End(xlUp).Row
End With
Se você perceber que temos um .
antes Rows.Count
. Muitas vezes escolhemos ignorar isso. Veja ESTA pergunta sobre o possível erro que você pode receber. Eu sempre aconselho usar .
antes Rows.Count
e Columns.Count
. Essa pergunta é um cenário clássico em que o código falhará porque Rows.Count
retorna 65536
para o Excel 2003 e versões anteriores e 1048576
para o Excel 2007 e versões posteriores. Da mesma forma Columns.Count
retorna 256
e 16384
, respectivamente.
O fato acima que o Excel 2007+ possui 1048576
linhas também enfatiza o fato de que sempre devemos declarar a variável que manterá o valor da linha, pois, em Long
vez disso Integer
, você receberá um Overflow
erro.
Observe que essa abordagem ignorará todas as linhas ocultas. Olhando para a minha captura de tela acima da coluna A , se a linha 8 estivesse oculta, essa abordagem retornaria em 5
vez de 8
.
Localizar última linha em uma planilha
Para encontrar a Effective
última linha na planilha, use isto. Observe o uso de Application.WorksheetFunction.CountA(.Cells)
. Isso é necessário porque, se não houver células com dados na planilha, .Find
você fornecerá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
Localizar última linha em uma tabela (ListObject)
Os mesmos princípios se aplicam, por exemplo, para obter a última linha na terceira coluna de uma tabela:
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