Diversas maneiras de encontrar a última linha ou coluna com valor
Durante nosso aprendizado em macros no Excel, certamente
tivemos algum momento em que tivemos de aprender a encontrar
a última linha ou última coluna com valor. Com o tempo
aprendemos outras formas diferentes de fazer isso, pois há
alguns problemas em alguns métodos.
tivemos algum momento em que tivemos de aprender a encontrar
a última linha ou última coluna com valor. Com o tempo
aprendemos outras formas diferentes de fazer isso, pois há
alguns problemas em alguns métodos.
O primeiro que aprendemos normalmente é o seguinte:
UltimaLinha = Range(“A1”).End(xlDown).Row
UltimaColuna = Range(“A1”).End(xlToRight).Column
Tão logo conhecemos esse método aprendemos o problema dele:
se houver alguma célula entre a primeira e a última célula,
o valor retornado será o da última célula antes da vazia.
Assim, logo passamos para o seguinte método:
se houver alguma célula entre a primeira e a última célula,
o valor retornado será o da última célula antes da vazia.
Assim, logo passamos para o seguinte método:
UltimaLinha = Cells(Planilha1.Rows.Count,
1).End(xlUp).Row
1).End(xlUp).Row
UltimaColuna = Cells(1,
Planilha1.Columns.Count).End(xlToLeft).Column
Planilha1.Columns.Count).End(xlToLeft).Column
‘ Planilha1 é o nome da planilha inicial do Excel, aqui
apenas para fins didáticos
apenas para fins didáticos
Esse método costuma ser o mais utilizado, mas deve-se levar
em conta que está buscando a última linha em uma coluna
específica, no caso a primeira. Se houver valores nas linhas
seguintes e a primeira coluna da(s) última(s) linha(s)
estiver em branco será retornado um valor errado e a partir
daí os dados serão comprometidos.
em conta que está buscando a última linha em uma coluna
específica, no caso a primeira. Se houver valores nas linhas
seguintes e a primeira coluna da(s) última(s) linha(s)
estiver em branco será retornado um valor errado e a partir
daí os dados serão comprometidos.
Um outro método que tem sido bastante divulgado é com o
UsedRange:
UsedRange:
UltimaLinha =
Planilha1.UsedRange.Rows(Planilha1.UsedRange.Rows.Count).Row
Planilha1.UsedRange.Rows(Planilha1.UsedRange.Rows.Count).Row
UltimaColuna =
Planilha1.UsedRange.Columns(Planilha1.UsedRange.Columns.Count).Column
Planilha1.UsedRange.Columns(Planilha1.UsedRange.Columns.Count).Column
Entretanto, se seu código inclui e apaga linhas ou colunas,
o Excel pode passar a dar valores incorretos para
UsedRange, o que pode comprometer o bom funcionamento
do código.
o Excel pode passar a dar valores incorretos para
UsedRange, o que pode comprometer o bom funcionamento
do código.
Felizmente, há uma alternativa que funciona bem em todos os
casos e sem contraindicação:
casos e sem contraindicação:
UltimaLinha = Planilha1.Cells.Find(“*”,
LookIn:=xlFormulas, SearchOrder:=xlByRows,
SearchDirection:=xlPrevious).Row
LookIn:=xlFormulas, SearchOrder:=xlByRows,
SearchDirection:=xlPrevious).Row
UltimaColuna = Planilha1.
Cells.Find(“*”,LookIn:=xlFormulas,
SearchOrder:=xlByColumns,
SearchDirection:=xlPrevious).Column
Cells.Find(“*”,LookIn:=xlFormulas,
SearchOrder:=xlByColumns,
SearchDirection:=xlPrevious).Column
Explicando: a pesquisa é feita buscando por qualquer valor
(asterisco) em valores ou fórmulas (parâmetro LookIn)
na direção indicada (parâmetro SearchOrder) e irá
começar do fim para o começo (parâmetro
SearchDirection). Pode parecer um tanto complexo à
primeira vista, mas entendendo cada parâmetro
individualmente dá para compreender o funcionamento.
(asterisco) em valores ou fórmulas (parâmetro LookIn)
na direção indicada (parâmetro SearchOrder) e irá
começar do fim para o começo (parâmetro
SearchDirection). Pode parecer um tanto complexo à
primeira vista, mas entendendo cada parâmetro
individualmente dá para compreender o funcionamento.
Esse método usa um comando longo e pode ser cansativo
escrever tudo isso toda vez que for preciso encontrar o
valor da última linha ou coluna. Solução? Crie uma função
para isso:
escrever tudo isso toda vez que for preciso encontrar o
valor da última linha ou coluna. Solução? Crie uma função
para isso:
Function EncontrarUltimaLinha(Planilha As Worksheet) As
Long
Long
EncontrarUltimaLinha =
Planilha.Cells.Find(“*”, LookIn:=xlFormulas, _
Planilha.Cells.Find(“*”, LookIn:=xlFormulas, _
SearchOrder:=xlByRows,
SearchDirection:=xlPrevious).Row
SearchDirection:=xlPrevious).Row
End Function
Function EncontrarUltimaColuna(Planilha As Worksheet) As
Long
Long
EncontrarUltimaColuna =
Planilha.Cells.Find(“*”, LookIn:=xlFormulas, _
Planilha.Cells.Find(“*”, LookIn:=xlFormulas, _
SearchOrder:=xlByColumns,
SearchDirection:=xlPrevious).Column
SearchDirection:=xlPrevious).Column
End Function
Fica muito mais fácil usar digitar a fórmula usando apenas
a planilha desejada como parâmetro:
a planilha desejada como parâmetro:
UltimaLinha = EncontrarUltimaLinha(plProdutos)
UltimaColuna = EncontrarUltimaColuna(plProdutos)
É preciso observar que essas funções retornarão um
resultado referente à planilha inteira, mas há casos em que
precisamos do valor referente a uma linha ou coluna
específica. Podemos adaptar as funções acima para
acrescentar um parâmetro opcional:
resultado referente à planilha inteira, mas há casos em que
precisamos do valor referente a uma linha ou coluna
específica. Podemos adaptar as funções acima para
acrescentar um parâmetro opcional:
Function EncontrarUltimaLinha(Planilha As Worksheet,
Optional Coluna As Long = 0) As Long
Optional Coluna As Long = 0) As Long
If Coluna <= 0 Then
EncontrarUltimaLinha = Planilha.Cells.Find(“*”,
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
Else
EncontrarUltimaLinha = Planilha.Columns(Coluna).Find(“*”,
LookIn:=xlFormulas, _
SearchOrder:=xlByRows,
SearchDirection:=xlPrevious).Row
End If
End Function
Function EncontrarUltimaColuna(Planilha As Worksheet,
Optional Linha As Long = 0) As Long
Optional Linha As Long = 0) As Long
If Linha <= 0 Then
EncontrarUltimaColuna = Planilha.Cells.Find(“*”,
LookIn:=xlFormulas, _
SearchOrder:=xlByColumns,
SearchDirection:=xlPrevious).Column
SearchDirection:=xlPrevious).Column
Else
EncontrarUltimaColuna = Planilha.Rows(Linha).Find(“*”,
LookIn:=xlFormulas, _
SearchOrder:=xlByColumns,
SearchDirection:=xlPrevious).Column
SearchDirection:=xlPrevious).Column
End If
End Function
Com essas funções ambos casos são contemplados. Se só for
informado o parâmetro da planilha, a pesquisa levará em
conta a planilha inteira, caso seja informado a linha ou
coluna, é somente nela que será verificada.
informado o parâmetro da planilha, a pesquisa levará em
conta a planilha inteira, caso seja informado a linha ou
coluna, é somente nela que será verificada.
Perceba que na validação da linha e coluna coloquei menor
ou igual, pois caso seja informado um valor negativo passa a
considerar a planilha inteira e assim não gera erro de linha
ou coluna com valor negativo.
ou igual, pois caso seja informado um valor negativo passa a
considerar a planilha inteira e assim não gera erro de linha
ou coluna com valor negativo.
Todos os métodos acima servem para pesquisas na planilha
inteira. Em intervalos nomeados o funcionamento é um pouco
diferente, pois vai levar em conta somente um intervalo
definido. Para encontrar o valor da última linha ou coluna
em um intervalo nomeado o jeito mais simples é o
seguinte:
inteira. Em intervalos nomeados o funcionamento é um pouco
diferente, pois vai levar em conta somente um intervalo
definido. Para encontrar o valor da última linha ou coluna
em um intervalo nomeado o jeito mais simples é o
seguinte:
UltimaLinha =
Range(“Clientes”).Cells(Range(“Clientes”).Rows.Count,
1).Row
Range(“Clientes”).Cells(Range(“Clientes”).Rows.Count,
1).Row
UltimaColuna = Range(“Clientes”).Cells(1,
Range(“Clientes”).Columns.Count).Column
Range(“Clientes”).Columns.Count).Column
Novamente, esse método está levando em conta uma coluna e
uma linha específica. Também é possível usar o método usando
o Find para encontrar o valor referente ao intervalo
inteiro:
uma linha específica. Também é possível usar o método usando
o Find para encontrar o valor referente ao intervalo
inteiro:
UltimaLinha = Range(“Clientes”).Cells.Find(“*”,
LookIn:=xlFormulas, _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows,
SearchDirection:=xlPrevious).Row
SearchDirection:=xlPrevious).Row
UltimaColuna = Range(“Clientes”).Cells.Find(“*”,
LookIn:=xlFormulas, _
LookIn:=xlFormulas, _
SearchOrder:=xlByColumns,
SearchDirection:=xlPrevious).Column
SearchDirection:=xlPrevious).Column
Espero que este artigo tenha ajudado a perceber as
diferenças entre os diversos métodos, bem como os prós e
contras de cada um. Até o próximo artigo!
diferenças entre os diversos métodos, bem como os prós e
contras de cada um. Até o próximo artigo!
Pedro Martins
Pós-graduando em Business Intelligence e Big Data pela Faculdade
Impacta de Tecnologia. Formado em Tecnologia em Eletrônica Digital
com Ênfase em Microprocessadores
Impacta de Tecnologia. Formado em Tecnologia em Eletrônica Digital
com Ênfase em Microprocessadores
Catálogo de aulas (NOVIDADE)
Criei um catálogo de aulas para ajudar você em seus estudos. Acesse clicando na imagem abaixo ou clique aqui.